From 0f4ea4c3a889834f2497dcb2d6c0b48a42363a30 Mon Sep 17 00:00:00 2001 From: Sphia Sadek Date: Mon, 20 Apr 2026 12:16:03 -0400 Subject: [PATCH 01/23] feat(slack): add Slack integration with @mention-based task submission MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds full Slack integration enabling users to submit coding tasks by mentioning @Shoof in any channel or DM, with real-time emoji reactions and threaded notifications showing task progress. Key features: - @mention task submission with natural language repo extraction - Emoji reaction progression: :eyes: → :hourglass: → :white_check_mark: - Threaded notifications (created, started, completed/failed) - Cancel button with instant feedback - DM support for private task submissions - OAuth multi-workspace install flow - `bgagent slack setup` CLI wizard for zero-friction onboarding - Account linking via /bgagent link New files: - CDK constructs: SlackIntegration, SlackInstallationTable, SlackUserMappingTable - Lambda handlers: events, commands, command-processor, interactions, oauth-callback, link, notify - Shared utilities: slack-verify, slack-blocks - CLI: slack.ts (setup, link commands) - Docs: SLACK_SETUP_GUIDE.md with screenshots --- .../constructs/slack-installation-table.ts | 77 +++ cdk/src/constructs/slack-integration.ts | 451 ++++++++++++++++ .../constructs/slack-user-mapping-table.ts | 92 ++++ cdk/src/constructs/task-events-table.ts | 1 + cdk/src/handlers/shared/create-task-core.ts | 2 +- cdk/src/handlers/shared/slack-blocks.ts | 210 ++++++++ cdk/src/handlers/shared/slack-verify.ts | 111 ++++ cdk/src/handlers/slack-command-processor.ts | 480 ++++++++++++++++++ cdk/src/handlers/slack-commands.ts | 146 ++++++ cdk/src/handlers/slack-events.ts | 288 +++++++++++ cdk/src/handlers/slack-interactions.ts | 244 +++++++++ cdk/src/handlers/slack-link.ts | 112 ++++ cdk/src/handlers/slack-notify.ts | 333 ++++++++++++ cdk/src/handlers/slack-oauth-callback.ts | 195 +++++++ cdk/src/stacks/agent.ts | 73 ++- .../slack-installation-table.test.ts | 68 +++ cdk/test/constructs/slack-integration.test.ts | 135 +++++ .../slack-user-mapping-table.test.ts | 83 +++ cdk/test/handlers/shared/slack-blocks.test.ts | 110 ++++ cdk/test/handlers/shared/slack-verify.test.ts | 75 +++ cdk/test/stacks/agent.test.ts | 5 +- cli/package.json | 2 + cli/src/api-client.ts | 7 + cli/src/bin/bgagent.ts | 2 + cli/src/commands/slack.ts | 356 +++++++++++++ cli/src/types.ts | 7 + cli/test/commands/slack.test.ts | 87 ++++ docs/guides/DEVELOPER_GUIDE.md | 53 +- docs/guides/SLACK_SETUP_GUIDE.md | 170 +++++++ docs/guides/USER_GUIDE.md | 3 +- docs/imgs/enable-events-after.png | Bin 0 -> 124204 bytes docs/imgs/enable-events-before.png | Bin 0 -> 127094 bytes docs/imgs/find-credentials.png | Bin 0 -> 331453 bytes docs/imgs/find-even-subscriptions.png | Bin 0 -> 348530 bytes .../docs/developer-guide/Installation.md | 36 +- .../developer-guide/Repository-preparation.md | 17 +- docs/src/content/docs/user-guide/Overview.md | 5 +- yarn.lock | 97 +++- 38 files changed, 4111 insertions(+), 22 deletions(-) create mode 100644 cdk/src/constructs/slack-installation-table.ts create mode 100644 cdk/src/constructs/slack-integration.ts create mode 100644 cdk/src/constructs/slack-user-mapping-table.ts create mode 100644 cdk/src/handlers/shared/slack-blocks.ts create mode 100644 cdk/src/handlers/shared/slack-verify.ts create mode 100644 cdk/src/handlers/slack-command-processor.ts create mode 100644 cdk/src/handlers/slack-commands.ts create mode 100644 cdk/src/handlers/slack-events.ts create mode 100644 cdk/src/handlers/slack-interactions.ts create mode 100644 cdk/src/handlers/slack-link.ts create mode 100644 cdk/src/handlers/slack-notify.ts create mode 100644 cdk/src/handlers/slack-oauth-callback.ts create mode 100644 cdk/test/constructs/slack-installation-table.test.ts create mode 100644 cdk/test/constructs/slack-integration.test.ts create mode 100644 cdk/test/constructs/slack-user-mapping-table.test.ts create mode 100644 cdk/test/handlers/shared/slack-blocks.test.ts create mode 100644 cdk/test/handlers/shared/slack-verify.test.ts create mode 100644 cli/src/commands/slack.ts create mode 100644 cli/test/commands/slack.test.ts create mode 100644 docs/guides/SLACK_SETUP_GUIDE.md create mode 100644 docs/imgs/enable-events-after.png create mode 100644 docs/imgs/enable-events-before.png create mode 100644 docs/imgs/find-credentials.png create mode 100644 docs/imgs/find-even-subscriptions.png diff --git a/cdk/src/constructs/slack-installation-table.ts b/cdk/src/constructs/slack-installation-table.ts new file mode 100644 index 0000000..3273621 --- /dev/null +++ b/cdk/src/constructs/slack-installation-table.ts @@ -0,0 +1,77 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { RemovalPolicy } from 'aws-cdk-lib'; +import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; +import { Construct } from 'constructs'; + +/** + * Properties for SlackInstallationTable construct. + */ +export interface SlackInstallationTableProps { + /** + * Optional table name override. + * @default - auto-generated by CloudFormation + */ + readonly tableName?: string; + + /** + * Removal policy for the table. + * @default RemovalPolicy.DESTROY + */ + readonly removalPolicy?: RemovalPolicy; + + /** + * Whether to enable point-in-time recovery. + * @default true + */ + readonly pointInTimeRecovery?: boolean; +} + +/** + * DynamoDB table for Slack workspace installations. + * + * Schema: team_id (PK) — one record per installed Slack workspace. + * Stores workspace metadata and a pointer to the bot token in Secrets Manager. + * Bot tokens are stored in Secrets Manager at `bgagent/slack/{team_id}`. + */ +export class SlackInstallationTable extends Construct { + /** + * The underlying DynamoDB table. + */ + public readonly table: dynamodb.Table; + + constructor(scope: Construct, id: string, props: SlackInstallationTableProps = {}) { + super(scope, id); + + this.table = new dynamodb.Table(this, 'Table', { + tableName: props.tableName, + partitionKey: { + name: 'team_id', + type: dynamodb.AttributeType.STRING, + }, + billingMode: dynamodb.BillingMode.PAY_PER_REQUEST, + timeToLiveAttribute: 'ttl', + pointInTimeRecoverySpecification: { + pointInTimeRecoveryEnabled: props.pointInTimeRecovery ?? true, + }, + removalPolicy: props.removalPolicy ?? RemovalPolicy.DESTROY, + }); + } +} diff --git a/cdk/src/constructs/slack-integration.ts b/cdk/src/constructs/slack-integration.ts new file mode 100644 index 0000000..e75351d --- /dev/null +++ b/cdk/src/constructs/slack-integration.ts @@ -0,0 +1,451 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as path from 'path'; +import { ArnFormat, Duration, RemovalPolicy, Stack } from 'aws-cdk-lib'; +import * as apigw from 'aws-cdk-lib/aws-apigateway'; +import * as cognito from 'aws-cdk-lib/aws-cognito'; +import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; +import * as iam from 'aws-cdk-lib/aws-iam'; +import { Runtime, Architecture, StartingPosition, FilterCriteria, FilterRule } from 'aws-cdk-lib/aws-lambda'; +import * as lambdaEventSources from 'aws-cdk-lib/aws-lambda-event-sources'; +import * as lambda from 'aws-cdk-lib/aws-lambda-nodejs'; +import * as secretsmanager from 'aws-cdk-lib/aws-secretsmanager'; +import { NagSuppressions } from 'cdk-nag'; +import { Construct } from 'constructs'; +import { SlackInstallationTable } from './slack-installation-table'; +import { SlackUserMappingTable } from './slack-user-mapping-table'; + +/** + * Properties for SlackIntegration construct. + */ +export interface SlackIntegrationProps { + /** The existing REST API to add Slack routes to. */ + readonly api: apigw.RestApi; + + /** Cognito user pool for the /slack/link endpoint (Cognito-authenticated). */ + readonly userPool: cognito.IUserPool; + + /** The DynamoDB task table. */ + readonly taskTable: dynamodb.ITable; + + /** The DynamoDB task events table (must have DynamoDB Streams enabled). */ + readonly taskEventsTable: dynamodb.ITable; + + /** The DynamoDB repo config table (optional — for repo onboarding checks). */ + readonly repoTable?: dynamodb.ITable; + + /** Orchestrator Lambda function ARN for async task invocation. */ + readonly orchestratorFunctionArn?: string; + + /** Bedrock Guardrail ID for input screening. */ + readonly guardrailId?: string; + + /** Bedrock Guardrail version for input screening. */ + readonly guardrailVersion?: string; + + /** Task retention in days for TTL computation. */ + readonly taskRetentionDays?: number; + + /** Removal policy for Slack DynamoDB tables. */ + readonly removalPolicy?: RemovalPolicy; +} + +/** + * CDK construct that adds Slack integration to the ABCA platform. + * + * Creates: + * - SlackInstallationTable (per-workspace installation records) + * - SlackUserMappingTable (Slack user → platform user mappings) + * - Lambda handlers for OAuth, slash commands, events, notifications, and account linking + * - API Gateway routes under /slack/* + * - DynamoDB Streams event source for outbound notifications + */ +export class SlackIntegration extends Construct { + /** The Slack installation table. */ + public readonly installationTable: dynamodb.Table; + + /** The Slack user mapping table. */ + public readonly userMappingTable: dynamodb.Table; + + /** The Slack signing secret (placeholder — user populates after creating the Slack App). */ + public readonly signingSecret: secretsmanager.Secret; + + /** The Slack client secret (placeholder — user populates after creating the Slack App). */ + public readonly clientSecret: secretsmanager.Secret; + + /** The Slack client ID secret (placeholder — user populates after creating the Slack App). */ + public readonly clientIdSecret: secretsmanager.Secret; + + constructor(scope: Construct, id: string, props: SlackIntegrationProps) { + super(scope, id); + + const removalPolicy = props.removalPolicy ?? RemovalPolicy.DESTROY; + + // --- DynamoDB Tables --- + const installationTable = new SlackInstallationTable(this, 'InstallationTable', { removalPolicy }); + const userMappingTable = new SlackUserMappingTable(this, 'UserMappingTable', { removalPolicy }); + this.installationTable = installationTable.table; + this.userMappingTable = userMappingTable.table; + + // --- Slack App Secrets (CDK-created placeholders) --- + // Users populate these after creating the Slack App via the SlackAppCreateUrl output. + this.signingSecret = new secretsmanager.Secret(this, 'SigningSecret', { + description: 'Slack App signing secret — populate after creating the Slack App', + removalPolicy, + }); + this.clientSecret = new secretsmanager.Secret(this, 'ClientSecret', { + description: 'Slack App client secret (OAuth) — populate after creating the Slack App', + removalPolicy, + }); + this.clientIdSecret = new secretsmanager.Secret(this, 'ClientIdSecret', { + description: 'Slack App client ID — populate after creating the Slack App', + removalPolicy, + }); + + // --- Shared Lambda configuration --- + const handlersDir = path.join(__dirname, '..', 'handlers'); + const commonBundling: lambda.BundlingOptions = { + externalModules: ['@aws-sdk/*'], + }; + + // Secrets Manager ARN prefix for Slack secrets (bgagent/slack/*) + const slackSecretArnPrefix = Stack.of(this).formatArn({ + service: 'secretsmanager', + resource: 'secret', + resourceName: 'bgagent/slack/*', + arnFormat: ArnFormat.COLON_RESOURCE_NAME, + }); + + // IAM policy for reading Slack secrets from Secrets Manager + const readSlackSecretsPolicy = new iam.PolicyStatement({ + actions: ['secretsmanager:GetSecretValue'], + resources: [slackSecretArnPrefix], + }); + + // --- Cognito Authorizer (for /slack/link endpoint) --- + const cognitoAuthorizer = new apigw.CognitoUserPoolsAuthorizer(this, 'SlackCognitoAuthorizer', { + cognitoUserPools: [props.userPool], + }); + + const cognitoAuthOptions: apigw.MethodOptions = { + authorizer: cognitoAuthorizer, + authorizationType: apigw.AuthorizationType.COGNITO, + }; + + const noneAuthOptions: apigw.MethodOptions = { + authorizationType: apigw.AuthorizationType.NONE, + }; + + // --- Task creation environment (matches TaskApi createTaskEnv pattern) --- + const createTaskEnv: Record = { + TASK_TABLE_NAME: props.taskTable.tableName, + TASK_EVENTS_TABLE_NAME: props.taskEventsTable.tableName, + TASK_RETENTION_DAYS: String(props.taskRetentionDays ?? 90), + }; + if (props.repoTable) { + createTaskEnv.REPO_TABLE_NAME = props.repoTable.tableName; + } + if (props.orchestratorFunctionArn) { + createTaskEnv.ORCHESTRATOR_FUNCTION_ARN = props.orchestratorFunctionArn; + } + if (props.guardrailId && props.guardrailVersion) { + createTaskEnv.GUARDRAIL_ID = props.guardrailId; + createTaskEnv.GUARDRAIL_VERSION = props.guardrailVersion; + } + + // ═══════════════════════════════════════════════════════════════════════════ + // Lambda Handlers + // ═══════════════════════════════════════════════════════════════════════════ + + // --- OAuth Callback --- + const oauthCallbackFn = new lambda.NodejsFunction(this, 'OAuthCallbackFn', { + entry: path.join(handlersDir, 'slack-oauth-callback.ts'), + handler: 'handler', + runtime: Runtime.NODEJS_24_X, + architecture: Architecture.ARM_64, + timeout: Duration.seconds(15), + environment: { + SLACK_INSTALLATION_TABLE_NAME: this.installationTable.tableName, + SLACK_CLIENT_ID_SECRET_ARN: this.clientIdSecret.secretArn, + SLACK_CLIENT_SECRET_ARN: this.clientSecret.secretArn, + }, + bundling: commonBundling, + }); + this.installationTable.grantWriteData(oauthCallbackFn); + this.clientIdSecret.grantRead(oauthCallbackFn); + this.clientSecret.grantRead(oauthCallbackFn); + oauthCallbackFn.addToRolePolicy(readSlackSecretsPolicy); + // CreateSecret + UpdateSecret for bot tokens + oauthCallbackFn.addToRolePolicy(new iam.PolicyStatement({ + actions: ['secretsmanager:CreateSecret'], + resources: ['*'], + conditions: { + StringLike: { 'secretsmanager:Name': 'bgagent/slack/*' }, + }, + })); + oauthCallbackFn.addToRolePolicy(new iam.PolicyStatement({ + actions: ['secretsmanager:UpdateSecret', 'secretsmanager:TagResource', 'secretsmanager:RestoreSecret'], + resources: [slackSecretArnPrefix], + })); + + // --- Slack Events --- + // Note: SLACK_COMMAND_PROCESSOR_FUNCTION_NAME is set below after commandProcessorFn is created. + const slackEventsFn = new lambda.NodejsFunction(this, 'SlackEventsFn', { + entry: path.join(handlersDir, 'slack-events.ts'), + handler: 'handler', + runtime: Runtime.NODEJS_24_X, + architecture: Architecture.ARM_64, + timeout: Duration.seconds(10), + environment: { + SLACK_INSTALLATION_TABLE_NAME: this.installationTable.tableName, + SLACK_SIGNING_SECRET_ARN: this.signingSecret.secretArn, + }, + bundling: commonBundling, + }); + + // Keep one instance warm — Slack's URL verification during app creation + // times out on cold starts, and the retry UX is poor. + const slackEventsAlias = slackEventsFn.addAlias('live', { + provisionedConcurrentExecutions: 1, + }); + this.installationTable.grantReadWriteData(slackEventsFn); + this.signingSecret.grantRead(slackEventsFn); + slackEventsFn.addToRolePolicy(readSlackSecretsPolicy); + slackEventsFn.addToRolePolicy(new iam.PolicyStatement({ + actions: ['secretsmanager:DeleteSecret'], + resources: [slackSecretArnPrefix], + })); + + // --- Slash Command Processor (async worker) --- + const commandProcessorFn = new lambda.NodejsFunction(this, 'CommandProcessorFn', { + entry: path.join(handlersDir, 'slack-command-processor.ts'), + handler: 'handler', + runtime: Runtime.NODEJS_24_X, + architecture: Architecture.ARM_64, + timeout: Duration.seconds(30), + environment: { + ...createTaskEnv, + SLACK_USER_MAPPING_TABLE_NAME: this.userMappingTable.tableName, + SLACK_INSTALLATION_TABLE_NAME: this.installationTable.tableName, + }, + bundling: commonBundling, + }); + this.userMappingTable.grantReadWriteData(commandProcessorFn); + this.installationTable.grantReadData(commandProcessorFn); + commandProcessorFn.addToRolePolicy(readSlackSecretsPolicy); + props.taskTable.grantReadWriteData(commandProcessorFn); + props.taskEventsTable.grantReadWriteData(commandProcessorFn); + if (props.repoTable) { + props.repoTable.grantReadData(commandProcessorFn); + } + if (props.orchestratorFunctionArn) { + commandProcessorFn.addToRolePolicy(new iam.PolicyStatement({ + actions: ['lambda:InvokeFunction'], + resources: [props.orchestratorFunctionArn], + })); + } + if (props.guardrailId) { + commandProcessorFn.addToRolePolicy(new iam.PolicyStatement({ + actions: ['bedrock:ApplyGuardrail'], + resources: [ + Stack.of(this).formatArn({ + service: 'bedrock', + resource: 'guardrail', + resourceName: props.guardrailId, + }), + ], + })); + } + + // Wire events handler to command processor for @mention forwarding. + slackEventsFn.addEnvironment('SLACK_COMMAND_PROCESSOR_FUNCTION_NAME', commandProcessorFn.functionName); + commandProcessorFn.grantInvoke(slackEventsFn); + + // --- Slack Interactions (Block Kit button actions) --- + const slackInteractionsFn = new lambda.NodejsFunction(this, 'SlackInteractionsFn', { + entry: path.join(handlersDir, 'slack-interactions.ts'), + handler: 'handler', + runtime: Runtime.NODEJS_24_X, + architecture: Architecture.ARM_64, + timeout: Duration.seconds(10), + environment: { + SLACK_SIGNING_SECRET_ARN: this.signingSecret.secretArn, + TASK_TABLE_NAME: props.taskTable.tableName, + SLACK_USER_MAPPING_TABLE_NAME: this.userMappingTable.tableName, + }, + bundling: commonBundling, + }); + this.signingSecret.grantRead(slackInteractionsFn); + slackInteractionsFn.addToRolePolicy(readSlackSecretsPolicy); + props.taskTable.grantReadWriteData(slackInteractionsFn); + this.userMappingTable.grantReadData(slackInteractionsFn); + + // --- Slash Command Acknowledger --- + const slackCommandsFn = new lambda.NodejsFunction(this, 'SlackCommandsFn', { + entry: path.join(handlersDir, 'slack-commands.ts'), + handler: 'handler', + runtime: Runtime.NODEJS_24_X, + architecture: Architecture.ARM_64, + timeout: Duration.seconds(3), + environment: { + SLACK_SIGNING_SECRET_ARN: this.signingSecret.secretArn, + SLACK_COMMAND_PROCESSOR_FUNCTION_NAME: commandProcessorFn.functionName, + }, + bundling: commonBundling, + }); + this.signingSecret.grantRead(slackCommandsFn); + slackCommandsFn.addToRolePolicy(readSlackSecretsPolicy); + commandProcessorFn.grantInvoke(slackCommandsFn); + + // --- Account Linking (Cognito-authenticated) --- + const slackLinkFn = new lambda.NodejsFunction(this, 'SlackLinkFn', { + entry: path.join(handlersDir, 'slack-link.ts'), + handler: 'handler', + runtime: Runtime.NODEJS_24_X, + architecture: Architecture.ARM_64, + timeout: Duration.seconds(10), + environment: { + SLACK_USER_MAPPING_TABLE_NAME: this.userMappingTable.tableName, + }, + bundling: commonBundling, + }); + this.userMappingTable.grantReadWriteData(slackLinkFn); + + // --- Outbound Notification Handler (DynamoDB Streams trigger) --- + const slackNotifyFn = new lambda.NodejsFunction(this, 'SlackNotifyFn', { + entry: path.join(handlersDir, 'slack-notify.ts'), + handler: 'handler', + runtime: Runtime.NODEJS_24_X, + architecture: Architecture.ARM_64, + timeout: Duration.seconds(30), + environment: { + TASK_TABLE_NAME: props.taskTable.tableName, + }, + bundling: commonBundling, + }); + props.taskTable.grantReadWriteData(slackNotifyFn); + slackNotifyFn.addToRolePolicy(readSlackSecretsPolicy); + + // DynamoDB Streams event source with filtering + slackNotifyFn.addEventSource(new lambdaEventSources.DynamoEventSource(props.taskEventsTable, { + startingPosition: StartingPosition.LATEST, + batchSize: 10, + maxBatchingWindow: Duration.seconds(0), + retryAttempts: 3, + bisectBatchOnError: true, + filters: [ + FilterCriteria.filter({ + eventName: FilterRule.isEqual('INSERT'), + }), + ], + })); + + // ═══════════════════════════════════════════════════════════════════════════ + // API Gateway Routes + // ═══════════════════════════════════════════════════════════════════════════ + + const slack = props.api.root.addResource('slack'); + + // OAuth callback: GET /v1/slack/oauth/callback + const oauthResource = slack.addResource('oauth'); + const oauthCallbackResource = oauthResource.addResource('callback'); + const oauthCallbackMethod = oauthCallbackResource.addMethod( + 'GET', + new apigw.LambdaIntegration(oauthCallbackFn), + noneAuthOptions, + ); + + // Slack events: POST /v1/slack/events + const eventsResource = slack.addResource('events'); + const eventsMethod = eventsResource.addMethod( + 'POST', + new apigw.LambdaIntegration(slackEventsAlias), + noneAuthOptions, + ); + + // Slash commands: POST /v1/slack/commands + const commandsResource = slack.addResource('commands'); + const commandsMethod = commandsResource.addMethod( + 'POST', + new apigw.LambdaIntegration(slackCommandsFn), + noneAuthOptions, + ); + + // Block Kit interactions: POST /v1/slack/interactions + const interactionsResource = slack.addResource('interactions'); + const interactionsMethod = interactionsResource.addMethod( + 'POST', + new apigw.LambdaIntegration(slackInteractionsFn), + noneAuthOptions, + ); + + // Account linking: POST /v1/slack/link (Cognito-authenticated) + const linkResource = slack.addResource('link'); + linkResource.addMethod( + 'POST', + new apigw.LambdaIntegration(slackLinkFn), + cognitoAuthOptions, + ); + + // ═══════════════════════════════════════════════════════════════════════════ + // cdk-nag suppressions + // ═══════════════════════════════════════════════════════════════════════════ + + // Suppress APIG4 and COG4 on routes that use Slack signing secret instead of Cognito + const slackVerifiedMethods = [oauthCallbackMethod, eventsMethod, commandsMethod, interactionsMethod]; + for (const method of slackVerifiedMethods) { + NagSuppressions.addResourceSuppressions(method, [ + { + id: 'AwsSolutions-APIG4', + reason: 'Slack endpoint uses Slack signing secret verification instead of Cognito — by design for Slack API integration', + }, + { + id: 'AwsSolutions-COG4', + reason: 'Slack endpoint uses Slack signing secret verification instead of Cognito — by design for Slack API integration', + }, + ]); + } + + // Slack secrets are managed externally (populated by the user after creating the Slack App) + for (const secret of [this.signingSecret, this.clientSecret, this.clientIdSecret]) { + NagSuppressions.addResourceSuppressions(secret, [ + { + id: 'AwsSolutions-SMG4', + reason: 'Slack App credentials are managed externally — automatic rotation is not applicable', + }, + ]); + } + + // Standard Lambda suppressions + const allFunctions = [oauthCallbackFn, slackEventsFn, slackCommandsFn, commandProcessorFn, slackLinkFn, slackNotifyFn, slackInteractionsFn]; + for (const fn of allFunctions) { + NagSuppressions.addResourceSuppressions(fn, [ + { + id: 'AwsSolutions-IAM4', + reason: 'AWSLambdaBasicExecutionRole is the AWS-recommended managed policy for Lambda functions', + }, + { + id: 'AwsSolutions-IAM5', + reason: 'Wildcard permissions are scoped by condition (secretsmanager:Name prefix) or by DynamoDB index ARN patterns', + }, + ], true); + } + } +} diff --git a/cdk/src/constructs/slack-user-mapping-table.ts b/cdk/src/constructs/slack-user-mapping-table.ts new file mode 100644 index 0000000..e5852e3 --- /dev/null +++ b/cdk/src/constructs/slack-user-mapping-table.ts @@ -0,0 +1,92 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { RemovalPolicy } from 'aws-cdk-lib'; +import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; +import { Construct } from 'constructs'; + +/** + * Properties for SlackUserMappingTable construct. + */ +export interface SlackUserMappingTableProps { + /** + * Optional table name override. + * @default - auto-generated by CloudFormation + */ + readonly tableName?: string; + + /** + * Removal policy for the table. + * @default RemovalPolicy.DESTROY + */ + readonly removalPolicy?: RemovalPolicy; + + /** + * Whether to enable point-in-time recovery. + * @default true + */ + readonly pointInTimeRecovery?: boolean; +} + +/** + * DynamoDB table for mapping Slack user identities to platform user IDs. + * + * Schema: slack_identity (PK) — composite key `{team_id}#{user_id}`. + * Also used for pending link records (with status='pending' and TTL). + * + * GSIs: + * - PlatformUserIndex (PK: platform_user_id, SK: linked_at) — list linked Slack accounts for a user + */ +export class SlackUserMappingTable extends Construct { + /** + * GSI name for querying mappings by platform user. + * PK: platform_user_id, SK: linked_at. + */ + public static readonly PLATFORM_USER_INDEX = 'PlatformUserIndex'; + + /** + * The underlying DynamoDB table. + */ + public readonly table: dynamodb.Table; + + constructor(scope: Construct, id: string, props: SlackUserMappingTableProps = {}) { + super(scope, id); + + this.table = new dynamodb.Table(this, 'Table', { + tableName: props.tableName, + partitionKey: { + name: 'slack_identity', + type: dynamodb.AttributeType.STRING, + }, + billingMode: dynamodb.BillingMode.PAY_PER_REQUEST, + timeToLiveAttribute: 'ttl', + pointInTimeRecoverySpecification: { + pointInTimeRecoveryEnabled: props.pointInTimeRecovery ?? true, + }, + removalPolicy: props.removalPolicy ?? RemovalPolicy.DESTROY, + }); + + this.table.addGlobalSecondaryIndex({ + indexName: SlackUserMappingTable.PLATFORM_USER_INDEX, + partitionKey: { name: 'platform_user_id', type: dynamodb.AttributeType.STRING }, + sortKey: { name: 'linked_at', type: dynamodb.AttributeType.STRING }, + projectionType: dynamodb.ProjectionType.ALL, + }); + } +} diff --git a/cdk/src/constructs/task-events-table.ts b/cdk/src/constructs/task-events-table.ts index 61cb209..254bf55 100644 --- a/cdk/src/constructs/task-events-table.ts +++ b/cdk/src/constructs/task-events-table.ts @@ -76,6 +76,7 @@ export class TaskEventsTable extends Construct { pointInTimeRecoverySpecification: { pointInTimeRecoveryEnabled: props.pointInTimeRecovery ?? true, }, + stream: dynamodb.StreamViewType.NEW_IMAGE, removalPolicy: props.removalPolicy ?? RemovalPolicy.DESTROY, }); } diff --git a/cdk/src/handlers/shared/create-task-core.ts b/cdk/src/handlers/shared/create-task-core.ts index 5f003c4..5f119ba 100644 --- a/cdk/src/handlers/shared/create-task-core.ts +++ b/cdk/src/handlers/shared/create-task-core.ts @@ -39,7 +39,7 @@ import { TaskStatus } from '../../constructs/task-status'; */ export interface TaskCreationContext { readonly userId: string; - readonly channelSource: 'api' | 'webhook'; + readonly channelSource: 'api' | 'webhook' | 'slack'; readonly channelMetadata: Record; readonly idempotencyKey?: string; } diff --git a/cdk/src/handlers/shared/slack-blocks.ts b/cdk/src/handlers/shared/slack-blocks.ts new file mode 100644 index 0000000..b677d8d --- /dev/null +++ b/cdk/src/handlers/shared/slack-blocks.ts @@ -0,0 +1,210 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import type { TaskRecord } from './types'; + +/** A Slack Block Kit block element. */ +export interface SlackBlock { + readonly type: string; + readonly text?: { readonly type: string; readonly text: string }; + readonly elements?: ReadonlyArray>; + readonly block_id?: string; +} + +/** A Slack message payload suitable for chat.postMessage. */ +export interface SlackMessage { + /** Fallback plain-text for notifications. */ + readonly text: string; + /** Block Kit blocks for rich rendering. */ + readonly blocks: SlackBlock[]; + /** If set, post as a threaded reply. */ + readonly thread_ts?: string; +} + +/** + * Render a task event as a Slack Block Kit message. + * + * @param eventType - the task event type (e.g. 'task_created', 'task_completed'). + * @param task - the task record with current state. + * @param eventMetadata - optional metadata from the event record. + * @returns a SlackMessage payload. + */ +export function renderSlackBlocks( + eventType: string, + task: Pick, + eventMetadata?: Record, +): SlackMessage { + switch (eventType) { + case 'task_created': + return taskCreatedMessage(task); + case 'session_started': + return sessionStartedMessage(task); + case 'task_completed': + return taskCompletedMessage(task); + case 'task_failed': + return taskFailedMessage(task, eventMetadata); + case 'task_cancelled': + return simpleStatusMessage(task, ':no_entry_sign: Task cancelled'); + case 'task_timed_out': + return taskTimedOutMessage(task); + default: + return simpleStatusMessage(task, `Event: ${eventType}`); + } +} + +function taskCreatedMessage( + task: Pick, +): SlackMessage { + const desc = task.task_description + ? `\n${truncate(task.task_description, 200)}` + : ''; + const text = `:rocket: *Task submitted* for \`${task.repo}\`${desc}\n_ID:_ \`${task.task_id}\``; + return { + text: `Task submitted for ${task.repo}`, + blocks: [section(text)], + }; +} + +function taskCompletedMessage( + task: Pick, +): SlackMessage { + const parts = [`:white_check_mark: *Task completed* for \`${task.repo}\``]; + const stats: string[] = []; + if (task.duration_s != null) stats.push(formatDuration(Number(task.duration_s))); + if (task.cost_usd != null) stats.push(`$${Number(task.cost_usd).toFixed(2)}`); + if (stats.length > 0) parts.push(stats.join(' · ')); + const text = parts.join('\n'); + + const blocks: SlackBlock[] = [section(text)]; + + // "View PR" button — no inline link text, so Slack won't unfurl a big preview card. + if (task.pr_url) { + blocks.push(actions(task.task_id, [ + linkButton(`View PR ${prLabel(task.pr_url)}`, task.pr_url), + ])); + } + + return { + text: `Task completed for ${task.repo}`, + blocks, + }; +} + +function taskFailedMessage( + task: Pick, + eventMetadata?: Record, +): SlackMessage { + const reason = task.error_message + ?? (eventMetadata?.error as string | undefined) + ?? 'Unknown error'; + const text = `:x: *Task failed* for \`${task.repo}\`\n_Reason:_ ${truncate(reason, 300)}`; + return { + text: `Task failed for ${task.repo}`, + blocks: [section(text)], + }; +} + +function taskTimedOutMessage( + task: Pick, +): SlackMessage { + const duration = task.duration_s != null ? ` after ${formatDuration(task.duration_s)}` : ''; + const text = `:hourglass: *Task timed out* for \`${task.repo}\`${duration}`; + return { + text: `Task timed out for ${task.repo}`, + blocks: [section(text)], + }; +} + +function sessionStartedMessage( + task: Pick, +): SlackMessage { + const text = `:hourglass_flowing_sand: Agent started working on \`${task.repo}\``; + return { + text: `Agent started working on ${task.repo}`, + blocks: [ + section(text), + actions(task.task_id, [ + dangerButton('Cancel Task', `cancel_task:${task.task_id}`), + ]), + ], + }; +} + +function simpleStatusMessage( + task: Pick, + label: string, +): SlackMessage { + const text = `${label} for \`${task.repo}\`\n_ID:_ \`${task.task_id}\``; + return { + text: `${label} for ${task.repo}`, + blocks: [section(text)], + }; +} + +function section(text: string): SlackBlock { + return { type: 'section', text: { type: 'mrkdwn', text } }; +} + +function truncate(text: string, maxLen: number): string { + if (text.length <= maxLen) return text; + return text.slice(0, maxLen - 3) + '...'; +} + +function formatDuration(seconds: number): string { + if (seconds < 60) return `${Math.round(seconds)}s`; + const m = Math.floor(seconds / 60); + const s = Math.round(seconds % 60); + if (m < 60) return s > 0 ? `${m}m ${s}s` : `${m}m`; + const h = Math.floor(m / 60); + const remainM = m % 60; + return remainM > 0 ? `${h}h ${remainM}m` : `${h}h`; +} + +function actions(blockId: string, elements: Record[]): SlackBlock { + return { type: 'actions', block_id: blockId, elements } as unknown as SlackBlock; +} + +function linkButton(label: string, url: string): Record { + return { + type: 'button', + text: { type: 'plain_text', text: label }, + url, + style: 'primary', + }; +} + +function dangerButton(label: string, actionId: string): Record { + return { + type: 'button', + text: { type: 'plain_text', text: label }, + action_id: actionId, + style: 'danger', + confirm: { + title: { type: 'plain_text', text: 'Cancel task?' }, + text: { type: 'mrkdwn', text: 'This will stop the running agent.' }, + confirm: { type: 'plain_text', text: 'Cancel' }, + deny: { type: 'plain_text', text: 'Keep running' }, + }, + }; +} + +function prLabel(prUrl: string): string { + const match = prUrl.match(/\/pull\/(\d+)$/); + return match ? `#${match[1]}` : 'Pull Request'; +} diff --git a/cdk/src/handlers/shared/slack-verify.ts b/cdk/src/handlers/shared/slack-verify.ts new file mode 100644 index 0000000..11c8052 --- /dev/null +++ b/cdk/src/handlers/shared/slack-verify.ts @@ -0,0 +1,111 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as crypto from 'crypto'; +import { GetSecretValueCommand, SecretsManagerClient } from '@aws-sdk/client-secrets-manager'; +import { logger } from './logger'; + +const sm = new SecretsManagerClient({}); + +/** Prefix for Slack-related secrets in Secrets Manager. */ +export const SLACK_SECRET_PREFIX = 'bgagent/slack/'; + +// In-memory secret cache with 5-minute TTL (same pattern as webhook handler). +const secretCache = new Map(); +const CACHE_TTL_MS = 5 * 60 * 1000; + +/** Maximum age of a Slack request timestamp before it is rejected (replay protection). */ +const MAX_TIMESTAMP_AGE_S = 5 * 60; + +/** + * Fetch a secret from Secrets Manager with in-memory caching. + * @param secretId - the full Secrets Manager secret ID or ARN. + * @returns the secret string, or null if not found. + */ +export async function getSlackSecret(secretId: string): Promise { + const now = Date.now(); + const cached = secretCache.get(secretId); + if (cached && cached.expiresAt > now) { + return cached.secret; + } + + try { + const result = await sm.send(new GetSecretValueCommand({ SecretId: secretId })); + if (!result.SecretString) return null; + secretCache.set(secretId, { secret: result.SecretString, expiresAt: now + CACHE_TTL_MS }); + return result.SecretString; + } catch (err) { + const errorName = (err as Error)?.name; + if (errorName === 'ResourceNotFoundException') { + logger.error('Slack secret not found in Secrets Manager', { secret_id: secretId }); + return null; + } + logger.error('Failed to fetch Slack secret from Secrets Manager', { + secret_id: secretId, + error: err instanceof Error ? err.message : String(err), + }); + throw err; + } +} + +/** + * Verify a Slack request signature. + * + * Slack signs every request with HMAC-SHA256 using the app signing secret. + * Signature format: `v0={hex}` where the HMAC input is `v0:{timestamp}:{body}`. + * + * @param signingSecret - the Slack app signing secret. + * @param signature - the `X-Slack-Signature` header value. + * @param timestamp - the `X-Slack-Request-Timestamp` header value. + * @param body - the raw request body string. + * @returns true if the signature is valid and the timestamp is recent. + */ +export function verifySlackSignature( + signingSecret: string, + signature: string, + timestamp: string, + body: string, +): boolean { + // Reject requests with stale timestamps (replay protection). + const ts = parseInt(timestamp, 10); + if (isNaN(ts)) { + logger.warn('Invalid Slack request timestamp', { timestamp }); + return false; + } + const now = Math.floor(Date.now() / 1000); + if (Math.abs(now - ts) > MAX_TIMESTAMP_AGE_S) { + logger.warn('Slack request timestamp too old', { timestamp, now: String(now) }); + return false; + } + + // Compute expected signature: v0=HMAC-SHA256(signing_secret, "v0:{ts}:{body}") + const sigBasestring = `v0:${timestamp}:${body}`; + const expected = 'v0=' + crypto.createHmac('sha256', signingSecret).update(sigBasestring).digest('hex'); + + try { + return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature)); + } catch (err) { + logger.warn('Slack signature comparison failed', { + error: err instanceof Error ? err.message : String(err), + expected_length: expected.length, + provided_length: signature.length, + }); + return false; + } +} diff --git a/cdk/src/handlers/slack-command-processor.ts b/cdk/src/handlers/slack-command-processor.ts new file mode 100644 index 0000000..6febe40 --- /dev/null +++ b/cdk/src/handlers/slack-command-processor.ts @@ -0,0 +1,480 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as crypto from 'crypto'; +import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; +import { DynamoDBDocumentClient, GetCommand, PutCommand, UpdateCommand } from '@aws-sdk/lib-dynamodb'; +import { createTaskCore } from './shared/create-task-core'; +import { logger } from './shared/logger'; +import { getSlackSecret, SLACK_SECRET_PREFIX } from './shared/slack-verify'; +import type { SlackCommandPayload } from './slack-commands'; + +/** Extended payload for mention-sourced commands (no response_url available). */ +interface MentionPayload extends SlackCommandPayload { + readonly source?: 'mention'; + readonly mention_thread_ts?: string; +} + +const ddb = DynamoDBDocumentClient.from(new DynamoDBClient({})); + +const USER_MAPPING_TABLE = process.env.SLACK_USER_MAPPING_TABLE_NAME!; +const INSTALLATION_TABLE = process.env.SLACK_INSTALLATION_TABLE_NAME!; +const TASK_TABLE = process.env.TASK_TABLE_NAME!; + +/** Link code length and TTL. */ +const LINK_CODE_LENGTH = 6; +const LINK_CODE_TTL_S = 10 * 60; // 10 minutes + +/** + * Async processor for Slack slash commands and @mention triggers. + * + * Invoked asynchronously by the slash command acknowledger or the events handler. + * Posts results back to Slack via `response_url` (slash commands) or + * `chat.postMessage` (@mentions). + */ +export async function handler(event: MentionPayload): Promise { + const text = (event.text ?? '').trim(); + const parts = text.split(/\s+/); + const subcommand = parts[0]?.toLowerCase() ?? ''; + + // Build a reply function that handles both response_url and mention modes. + const reply = event.source === 'mention' + ? buildMentionReply(event) + : (msg: string) => postToSlack(event.response_url, msg); + + try { + switch (subcommand) { + case 'submit': + // Submit is only used via @mentions — slash commands show usage guidance. + if (event.source === 'mention') { + await handleSubmit(event, parts.slice(1), reply); + } else { + await reply('Use `@Shoof` to submit tasks — e.g. `@Shoof fix the bug in org/repo#42`\nFor private submissions, DM Shoof directly.'); + } + break; + case 'link': + await handleLink(event, reply); + break; + case 'help': + await reply( + '*Using Shoof*\n\n' + + '*Submit a task:* Mention `@Shoof` in any channel:\n' + + '> `@Shoof fix the login bug in org/repo#42`\n' + + '> `@Shoof update the README in org/repo`\n\n' + + '*Private submissions:* DM Shoof directly.\n\n' + + '*Cancel a task:* Use the Cancel button in the thread.\n\n' + + '*Link your account:* `/bgagent link` — one-time setup.\n\n' + + 'Reactions on your message show progress: :eyes: → :hourglass_flowing_sand: → :white_check_mark:', + ); + break; + default: + await reply('Use `@Shoof` to submit tasks, or `/bgagent link` to link your account.\nTry `/bgagent help` for more info.'); + } + } catch (err) { + logger.error('Slack command processing failed', { + subcommand, + error: err instanceof Error ? err.message : String(err), + team_id: event.team_id, + user_id: event.user_id, + }); + await reply(':warning: Something went wrong. Please try again.'); + } +} + +type ReplyFn = (text: string) => Promise; + +/** Build a reply function that posts in-thread via chat.postMessage for @mentions. */ +function buildMentionReply(event: MentionPayload): ReplyFn { + return async (text: string) => { + const botToken = await getBotToken(event.team_id); + if (!botToken) { + logger.warn('Cannot reply to mention: bot token not found', { team_id: event.team_id }); + return; + } + const response = await fetch('https://slack.com/api/chat.postMessage', { + method: 'POST', + headers: { + 'Content-Type': 'application/json; charset=utf-8', + 'Authorization': `Bearer ${botToken}`, + }, + body: JSON.stringify({ + channel: event.channel_id, + text, + thread_ts: event.mention_thread_ts, + }), + }); + const result = await response.json() as { ok: boolean; error?: string }; + if (!result.ok) { + logger.warn('Failed to post mention reply', { error: result.error, channel: event.channel_id }); + } + }; +} + +// ─── Submit ─────────────────────────────────────────────────────────────────── + +async function handleSubmit(event: MentionPayload, args: string[], reply: ReplyFn): Promise { + if (args.length === 0) { + await reply('Usage: `/bgagent submit org/repo#42 description`'); + return; + } + + // Resolve platform user. + const platformUserId = await lookupPlatformUser(event.team_id, event.user_id); + if (!platformUserId) { + await reply(':link: Your Slack account is not linked. Run `/bgagent link` first.'); + if (event.source === 'mention' && event.mention_thread_ts) { + await swapReaction(event.team_id, event.channel_id, event.mention_thread_ts, 'eyes', 'x'); + } + return; + } + + // Parse repo and optional issue number from first arg: "org/repo#42" or "org/repo". + const repoArg = args[0]; + const { repo, issueNumber } = parseRepoArg(repoArg); + if (!repo) { + await reply(`Invalid repo format: \`${repoArg}\`. Expected \`org/repo\` or \`org/repo#42\`.`); + if (event.source === 'mention' && event.mention_thread_ts) { + await swapReaction(event.team_id, event.channel_id, event.mention_thread_ts, 'eyes', 'x'); + } + return; + } + + // Check if the bot can post to this channel (private channels need an invite). + const channelCheck = await checkChannelAccess(event.team_id, event.channel_id); + if (!channelCheck.ok) { + await reply(channelCheck.error!); + return; + } + + // Remaining args are the task description. + const description = args.slice(1).join(' ') || undefined; + + // For @mentions, include the thread_ts so notifications thread under the mention. + const channelMetadata: Record = { + slack_team_id: event.team_id, + slack_channel_id: event.channel_id, + slack_user_id: event.user_id, + slack_response_url: event.response_url, + }; + if (event.source === 'mention' && event.mention_thread_ts) { + channelMetadata.slack_thread_ts = event.mention_thread_ts; + } + + // Create the task through the shared core. + const result = await createTaskCore( + { + repo, + issue_number: issueNumber, + task_description: description, + }, + { + userId: platformUserId, + channelSource: 'slack', + channelMetadata, + }, + crypto.randomUUID(), + ); + + // Extract task info from the response. + const body = JSON.parse(result.body); + if (result.statusCode === 201 && body.data) { + // For @mentions, the notify handler posts the task_created message in-thread — + // don't duplicate it here. Only reply for slash commands (which have a response_url). + if (event.source !== 'mention') { + const task = body.data; + await reply( + `:white_check_mark: Task created!\n*ID:* \`${task.task_id}\`\n*Repo:* \`${task.repo}\`\n*Status:* ${task.status}`, + ); + } + } else { + const errMsg = body.error?.message ?? 'Unknown error'; + await reply(`:x: Failed to create task: ${errMsg}`); + // Swap reaction to :x: on the mention message. + if (event.source === 'mention' && event.mention_thread_ts) { + await swapReaction(event.team_id, event.channel_id, event.mention_thread_ts, 'eyes', 'x'); + } + } +} + +function parseRepoArg(arg: string): { repo: string | null; issueNumber?: number } { + // Match "org/repo#42" or "org/repo" + const match = arg.match(/^([a-zA-Z0-9._-]+\/[a-zA-Z0-9._-]+)(?:#(\d+))?$/); + if (!match) return { repo: null }; + return { + repo: match[1], + issueNumber: match[2] ? parseInt(match[2], 10) : undefined, + }; +} + +// ─── Status ─────────────────────────────────────────────────────────────────── + +async function handleStatus(event: MentionPayload, taskId: string | undefined, reply: ReplyFn): Promise { + if (!taskId) { + await reply('Usage: `/bgagent status `'); + return; + } + + const result = await ddb.send(new GetCommand({ + TableName: TASK_TABLE, + Key: { task_id: taskId }, + })); + + if (!result.Item) { + await reply(`:mag: Task \`${taskId}\` not found.`); + return; + } + + const task = result.Item; + const lines = [ + ':clipboard: *Task Status*', + `*ID:* \`${task.task_id}\``, + `*Repo:* \`${task.repo}\``, + `*Status:* ${statusEmoji(task.status as string)} ${task.status}`, + ]; + if (task.task_description) lines.push(`*Description:* ${truncate(task.task_description as string, 200)}`); + if (task.pr_url) lines.push(`*PR:* <${task.pr_url}|Pull Request>`); + if (task.error_message) lines.push(`*Error:* ${truncate(task.error_message as string, 200)}`); + if (task.duration_s != null) lines.push(`*Duration:* ${formatDuration(Number(task.duration_s))}`); + if (task.cost_usd != null) lines.push(`*Cost:* $${Number(task.cost_usd).toFixed(2)}`); + + await reply(lines.join('\n')); +} + +// ─── Cancel ─────────────────────────────────────────────────────────────────── + +async function handleCancel(event: MentionPayload, taskId: string | undefined, reply: ReplyFn): Promise { + if (!taskId) { + await reply('Usage: `/bgagent cancel `'); + return; + } + + const platformUserId = await lookupPlatformUser(event.team_id, event.user_id); + if (!platformUserId) { + await reply(':link: Your Slack account is not linked. Run `/bgagent link` first.'); + return; + } + + // Load the task to verify ownership. + const result = await ddb.send(new GetCommand({ + TableName: TASK_TABLE, + Key: { task_id: taskId }, + })); + + if (!result.Item) { + await reply(`:mag: Task \`${taskId}\` not found.`); + return; + } + + if (result.Item.user_id !== platformUserId) { + await reply(':no_entry: You can only cancel your own tasks.'); + return; + } + + // Attempt to mark as cancelled via conditional update. + const ACTIVE_STATUSES = ['SUBMITTED', 'HYDRATING', 'RUNNING', 'FINALIZING']; + try { + await ddb.send(new UpdateCommand({ + TableName: TASK_TABLE, + Key: { task_id: taskId }, + UpdateExpression: 'SET #s = :cancelled, updated_at = :now', + ConditionExpression: '#s IN (:s1, :s2, :s3, :s4)', + ExpressionAttributeNames: { '#s': 'status' }, + ExpressionAttributeValues: { + ':cancelled': 'CANCELLED', + ':now': new Date().toISOString(), + ':s1': ACTIVE_STATUSES[0], + ':s2': ACTIVE_STATUSES[1], + ':s3': ACTIVE_STATUSES[2], + ':s4': ACTIVE_STATUSES[3], + }, + })); + await reply(`:no_entry_sign: Task \`${taskId}\` has been cancelled.`); + } catch (err) { + const errorName = (err as Error)?.name; + if (errorName === 'ConditionalCheckFailedException') { + await reply(`:warning: Task \`${taskId}\` is already in a terminal state.`); + } else { + throw err; + } + } +} + +// ─── Link ───────────────────────────────────────────────────────────────────── + +async function handleLink(event: MentionPayload, reply: ReplyFn): Promise { + // Generate a 6-character alphanumeric code. + const code = crypto.randomBytes(3).toString('hex').toUpperCase(); + const now = new Date().toISOString(); + const ttl = Math.floor(Date.now() / 1000) + LINK_CODE_TTL_S; + + // Store the pending link record. + await ddb.send(new PutCommand({ + TableName: USER_MAPPING_TABLE, + Item: { + slack_identity: `pending#${code}`, + slack_team_id: event.team_id, + slack_user_id: event.user_id, + link_method: 'slash_command', + linked_at: now, + status: 'pending', + ttl, + }, + })); + + await reply( + `:link: *Link your account*\n\nRun this command in your terminal:\n\`\`\`bgagent slack link ${code}\`\`\`\n_This code expires in 10 minutes._`, + ); +} + +// ─── Channel Access ────────────────────────────────────────────────────────── + +async function getBotToken(teamId: string): Promise { + const installation = await ddb.send(new GetCommand({ + TableName: INSTALLATION_TABLE, + Key: { team_id: teamId }, + })); + if (!installation.Item || installation.Item.status !== 'active') return null; + return getSlackSecret(`${SLACK_SECRET_PREFIX}${teamId}`); +} + +async function checkChannelAccess(teamId: string, channelId: string): Promise<{ ok: boolean; error?: string }> { + // DM channels always work — notifications fall back to user ID. + if (channelId.startsWith('D')) return { ok: true }; + + const botToken = await getBotToken(teamId); + if (!botToken) return { ok: true }; // Can't check, allow and let notify handle errors. + + try { + const response = await fetch(`https://slack.com/api/conversations.info?channel=${channelId}`, { + headers: { Authorization: `Bearer ${botToken}` }, + }); + const result = await response.json() as { ok: boolean; channel?: { is_private: boolean; is_member: boolean }; error?: string }; + + if (!result.ok) { + // channel_not_found means the bot can't see it — private channel, not invited. + if (result.error === 'channel_not_found') { + return { ok: false, error: ':lock: This is a private channel and the bot is not a member. Invite the bot first with `/invite @bgagent`, or submit from a public channel or DM.' }; + } + return { ok: true }; // Unknown error, allow and let notify handle it. + } + + if (result.channel?.is_private && !result.channel?.is_member) { + return { ok: false, error: ':lock: This is a private channel and the bot is not a member. Invite the bot first with `/invite @bgagent`, or submit from a public channel or DM.' }; + } + + return { ok: true }; + } catch (err) { + logger.warn('Channel access check failed', { error: err instanceof Error ? err.message : String(err) }); + return { ok: true }; // Fail open — don't block submit on a check failure. + } +} + +// ─── Helpers ────────────────────────────────────────────────────────────────── + +async function lookupPlatformUser(teamId: string, userId: string): Promise { + const key = `${teamId}#${userId}`; + logger.info('Looking up platform user', { slack_identity: key, table: USER_MAPPING_TABLE }); + const result = await ddb.send(new GetCommand({ + TableName: USER_MAPPING_TABLE, + Key: { slack_identity: key }, + })); + + if (!result.Item) { + logger.warn('No user mapping found', { slack_identity: key }); + return null; + } + if (result.Item.status === 'pending') { + logger.warn('User mapping is pending', { slack_identity: key }); + return null; + } + logger.info('Found platform user', { slack_identity: key, platform_user_id: result.Item.platform_user_id }); + return (result.Item.platform_user_id as string) ?? null; +} + +async function postToSlack(responseUrl: string, text: string): Promise { + logger.info('Posting to Slack response_url', { + response_url: responseUrl.substring(0, 80), + text_length: text.length, + }); + try { + const response = await fetch(responseUrl, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ response_type: 'ephemeral', text }), + }); + if (!response.ok) { + const body = await response.text().catch(() => ''); + logger.warn('Failed to post to Slack response_url', { + status: response.status, + response_url: responseUrl.substring(0, 80), + body, + }); + } else { + logger.info('Slack response_url post succeeded', { status: response.status }); + } + } catch (err) { + logger.warn('Error posting to Slack response_url', { + error: err instanceof Error ? err.message : String(err), + }); + } +} + +function statusEmoji(status: string): string { + switch (status) { + case 'SUBMITTED': return ':inbox_tray:'; + case 'HYDRATING': return ':droplet:'; + case 'RUNNING': return ':gear:'; + case 'FINALIZING': return ':hourglass:'; + case 'COMPLETED': return ':white_check_mark:'; + case 'FAILED': return ':x:'; + case 'CANCELLED': return ':no_entry_sign:'; + case 'TIMED_OUT': return ':hourglass:'; + default: return ':grey_question:'; + } +} + +function truncate(text: string, maxLen: number): string { + if (text.length <= maxLen) return text; + return text.slice(0, maxLen - 3) + '...'; +} + +function formatDuration(seconds: number): string { + if (seconds < 60) return `${Math.round(seconds)}s`; + const m = Math.floor(seconds / 60); + const s = Math.round(seconds % 60); + if (m < 60) return s > 0 ? `${m}m ${s}s` : `${m}m`; + const h = Math.floor(m / 60); + const remainM = m % 60; + return remainM > 0 ? `${h}h ${remainM}m` : `${h}h`; +} + +async function swapReaction(teamId: string, channelId: string, messageTs: string, remove: string, add: string): Promise { + const botToken = await getBotToken(teamId); + if (!botToken) return; + await fetch('https://slack.com/api/reactions.remove', { + method: 'POST', + headers: { 'Content-Type': 'application/json; charset=utf-8', 'Authorization': `Bearer ${botToken}` }, + body: JSON.stringify({ channel: channelId, timestamp: messageTs, name: remove }), + }).catch(() => {}); + await fetch('https://slack.com/api/reactions.add', { + method: 'POST', + headers: { 'Content-Type': 'application/json; charset=utf-8', 'Authorization': `Bearer ${botToken}` }, + body: JSON.stringify({ channel: channelId, timestamp: messageTs, name: add }), + }).catch(() => {}); +} diff --git a/cdk/src/handlers/slack-commands.ts b/cdk/src/handlers/slack-commands.ts new file mode 100644 index 0000000..1de6fa7 --- /dev/null +++ b/cdk/src/handlers/slack-commands.ts @@ -0,0 +1,146 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { InvokeCommand, LambdaClient } from '@aws-sdk/client-lambda'; +import type { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'; +import { logger } from './shared/logger'; +import { getSlackSecret, verifySlackSignature } from './shared/slack-verify'; + +const lambdaClient = new LambdaClient({}); + +const SIGNING_SECRET_ARN = process.env.SLACK_SIGNING_SECRET_ARN!; +const PROCESSOR_FUNCTION_NAME = process.env.SLACK_COMMAND_PROCESSOR_FUNCTION_NAME!; + +/** Parsed Slack slash command payload (URL-encoded form data). */ +export interface SlackCommandPayload { + readonly command: string; + readonly text: string; + readonly response_url: string; + readonly trigger_id: string; + readonly user_id: string; + readonly user_name: string; + readonly team_id: string; + readonly team_domain: string; + readonly channel_id: string; + readonly channel_name: string; +} + +/** + * POST /v1/slack/commands — Handle Slack slash commands. + * + * Must respond within 3 seconds. Verifies the signing secret, parses the + * command, acknowledges immediately, and async-invokes the processor Lambda. + */ +export async function handler(event: APIGatewayProxyEvent): Promise { + try { + if (!event.body) { + return slackResponse('Request body is required.'); + } + + // Verify Slack signing secret. + const signingSecret = await getSlackSecret(SIGNING_SECRET_ARN); + if (!signingSecret) { + logger.error('Slack signing secret not found'); + return slackResponse('Internal configuration error.'); + } + + const signature = event.headers['X-Slack-Signature'] ?? event.headers['x-slack-signature'] ?? ''; + const timestamp = event.headers['X-Slack-Request-Timestamp'] ?? event.headers['x-slack-request-timestamp'] ?? ''; + + if (!verifySlackSignature(signingSecret, signature, timestamp, event.body)) { + logger.warn('Invalid Slack command signature'); + return { statusCode: 401, headers: { 'Content-Type': 'text/plain' }, body: 'Invalid signature' }; + } + + // Parse URL-encoded form body. + const payload = parseFormBody(event.body); + const subcommand = (payload.text ?? '').trim().split(/\s+/)[0]?.toLowerCase() ?? ''; + + // For 'help' we can respond inline (no async processing needed). + if (subcommand === 'help' || subcommand === '') { + return slackResponse(HELP_TEXT); + } + + // Async-invoke the processor Lambda for all other subcommands. + try { + await lambdaClient.send(new InvokeCommand({ + FunctionName: PROCESSOR_FUNCTION_NAME, + InvocationType: 'Event', + Payload: new TextEncoder().encode(JSON.stringify(payload)), + })); + } catch (err) { + logger.error('Failed to invoke Slack command processor', { + error: err instanceof Error ? err.message : String(err), + subcommand, + }); + return slackResponse('Failed to process command. Please try again.'); + } + + // Acknowledge immediately — the processor will follow up via response_url. + const ackMessage = ACK_MESSAGES[subcommand] ?? `Processing \`${subcommand}\`...`; + return slackResponse(ackMessage); + } catch (err) { + logger.error('Slack command handler failed', { + error: err instanceof Error ? err.message : String(err), + }); + return slackResponse('An unexpected error occurred. Please try again.'); + } +} + +function parseFormBody(body: string): SlackCommandPayload { + const params = new URLSearchParams(body); + return { + command: params.get('command') ?? '', + text: params.get('text') ?? '', + response_url: params.get('response_url') ?? '', + trigger_id: params.get('trigger_id') ?? '', + user_id: params.get('user_id') ?? '', + user_name: params.get('user_name') ?? '', + team_id: params.get('team_id') ?? '', + team_domain: params.get('team_domain') ?? '', + channel_id: params.get('channel_id') ?? '', + channel_name: params.get('channel_name') ?? '', + }; +} + +function slackResponse(text: string): APIGatewayProxyResult { + return { + statusCode: 200, + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ response_type: 'ephemeral', text }), + }; +} + +const ACK_MESSAGES: Record = { + link: ':link: Generating link code...', +}; + +const HELP_TEXT = `*Using Shoof* + +*Submit a task:* Mention \`@Shoof\` in any channel: +> \`@Shoof fix the login bug in org/repo#42\` +> \`@Shoof update the README in org/repo\` + +*Private submissions:* DM Shoof directly. + +*Cancel a task:* Use the Cancel button in the thread. + +*Link your account:* \`/bgagent link\` — one-time setup. + +Reactions on your message show progress: :eyes: → :hourglass_flowing_sand: → :white_check_mark:`; diff --git a/cdk/src/handlers/slack-events.ts b/cdk/src/handlers/slack-events.ts new file mode 100644 index 0000000..60554d7 --- /dev/null +++ b/cdk/src/handlers/slack-events.ts @@ -0,0 +1,288 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; +import { InvokeCommand, LambdaClient } from '@aws-sdk/client-lambda'; +import { DeleteSecretCommand, SecretsManagerClient } from '@aws-sdk/client-secrets-manager'; +import { DynamoDBDocumentClient, UpdateCommand } from '@aws-sdk/lib-dynamodb'; +import type { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'; +import { logger } from './shared/logger'; +import { getSlackSecret, SLACK_SECRET_PREFIX, verifySlackSignature } from './shared/slack-verify'; + +const ddb = DynamoDBDocumentClient.from(new DynamoDBClient({})); +const sm = new SecretsManagerClient({}); +const lambdaClient = new LambdaClient({}); + +const TABLE_NAME = process.env.SLACK_INSTALLATION_TABLE_NAME!; +const SIGNING_SECRET_ARN = process.env.SLACK_SIGNING_SECRET_ARN!; +const PROCESSOR_FUNCTION_NAME = process.env.SLACK_COMMAND_PROCESSOR_FUNCTION_NAME; + +/** Secret recovery window for revoked installations. */ +const SECRET_RECOVERY_DAYS = 7; + +interface SlackEventPayload { + readonly type: string; + readonly challenge?: string; + readonly token?: string; + readonly team_id?: string; + readonly event?: { + readonly type: string; + readonly user?: string; + readonly text?: string; + readonly channel?: string; + readonly ts?: string; + readonly thread_ts?: string; + readonly [key: string]: unknown; + }; +} + +/** + * POST /v1/slack/events — Handle Slack Events API requests. + * + * Handles: + * - `url_verification` challenge (Slack sends this when the event URL is configured) + * - `app_uninstalled` event (mark installation revoked, delete bot token) + * - `tokens_revoked` event (same cleanup) + */ +export async function handler(event: APIGatewayProxyEvent): Promise { + try { + if (!event.body) { + return jsonResponse(400, { error: 'Request body is required' }); + } + + // Slack retries events if we don't respond within 3 seconds. Ack retries + // immediately to prevent duplicate task creation. + const retryNum = event.headers['X-Slack-Retry-Num'] ?? event.headers['x-slack-retry-num']; + if (retryNum) { + logger.info('Acknowledging Slack retry', { retry_num: retryNum }); + return jsonResponse(200, { ok: true }); + } + + // Parse the payload first — url_verification must respond before signature check + // to complete the Slack app setup flow. + const payload: SlackEventPayload = JSON.parse(event.body); + + // URL verification challenge — Slack sends this when configuring the event URL. + if (payload.type === 'url_verification' && payload.challenge) { + return jsonResponse(200, { challenge: payload.challenge }); + } + + // Verify Slack signing secret for all other event types. + const signingSecret = await getSlackSecret(SIGNING_SECRET_ARN); + if (!signingSecret) { + logger.error('Slack signing secret not found'); + return jsonResponse(500, { error: 'Internal configuration error' }); + } + + const signature = event.headers['X-Slack-Signature'] ?? event.headers['x-slack-signature'] ?? ''; + const timestamp = event.headers['X-Slack-Request-Timestamp'] ?? event.headers['x-slack-request-timestamp'] ?? ''; + + if (!verifySlackSignature(signingSecret, signature, timestamp, event.body)) { + logger.warn('Invalid Slack event signature'); + return jsonResponse(401, { error: 'Invalid signature' }); + } + + // Dispatch by event type. + if (payload.type === 'event_callback' && payload.event) { + const eventType = payload.event.type; + const teamId = payload.team_id; + + if ((eventType === 'app_uninstalled' || eventType === 'tokens_revoked') && teamId) { + await revokeInstallation(teamId); + } else if (eventType === 'app_mention' && teamId) { + await handleAppMention(payload.event, teamId); + } else if (eventType === 'message' && teamId && payload.event.channel_type === 'im') { + // DMs to the bot — skip bot's own messages to avoid loops. + if (!payload.event.bot_id) { + await handleAppMention(payload.event, teamId); + } + } else { + logger.info('Unhandled Slack event type', { event_type: eventType, team_id: teamId }); + } + } + + return jsonResponse(200, { ok: true }); + } catch (err) { + logger.error('Slack event handler failed', { + error: err instanceof Error ? err.message : String(err), + }); + return jsonResponse(500, { error: 'Internal server error' }); + } +} + +async function handleAppMention( + event: NonNullable, + teamId: string, +): Promise { + if (!PROCESSOR_FUNCTION_NAME) { + logger.warn('SLACK_COMMAND_PROCESSOR_FUNCTION_NAME not set, ignoring app_mention'); + return; + } + + const userId = event.user; + const channelId = event.channel; + const rawText = event.text ?? ''; + const messageTs = event.ts; + const threadTs = event.thread_ts; + + if (!userId || !channelId) { + logger.warn('app_mention missing user or channel', { event }); + return; + } + + // Strip the @mention prefix (e.g. "<@U12345> fix the bug" → "fix the bug"). + const text = rawText.replace(/<@[A-Z0-9]+>/g, '').trim(); + + if (!text) { + logger.info('app_mention with empty text after stripping mention, ignoring'); + return; + } + + // Build a payload compatible with the command processor. + // Use source: 'mention' so the processor knows there's no response_url — + // it should use chat.postMessage with the bot token instead. + // + // For natural language mentions like "@Shoof fix the bug in org/repo#42", + // extract the repo pattern and reorder so submit gets "org/repo#42 fix the bug". + // The submit handler expects: submit + const repoPattern = /\b([a-zA-Z0-9_.-]+\/[a-zA-Z0-9_.-]+(?:#\d+)?)\b/; + const repoMatch = text.match(repoPattern); + if (!repoMatch) { + // No repo found — reply with a helpful error instead of a broken submit. + const botToken = await getSlackSecret(`${SLACK_SECRET_PREFIX}${teamId}`); + if (botToken) { + const mentionTs = threadTs ?? messageTs; + // Swap :eyes: to :x: on the mention + if (mentionTs) { + await fetch('https://slack.com/api/reactions.remove', { + method: 'POST', + headers: { 'Content-Type': 'application/json; charset=utf-8', 'Authorization': `Bearer ${botToken}` }, + body: JSON.stringify({ channel: channelId, timestamp: mentionTs, name: 'eyes' }), + }).catch(() => {}); + await fetch('https://slack.com/api/reactions.add', { + method: 'POST', + headers: { 'Content-Type': 'application/json; charset=utf-8', 'Authorization': `Bearer ${botToken}` }, + body: JSON.stringify({ channel: channelId, timestamp: mentionTs, name: 'x' }), + }).catch(() => {}); + } + await fetch('https://slack.com/api/chat.postMessage', { + method: 'POST', + headers: { 'Content-Type': 'application/json; charset=utf-8', 'Authorization': `Bearer ${botToken}` }, + body: JSON.stringify({ + channel: channelId, + thread_ts: mentionTs, + text: ':x: Please include a repo — e.g. `@Shoof fix the bug in org/repo#42`', + }), + }).catch(() => {}); + } + return; + } + + const repo = repoMatch[0]; + const description = text.replace(repo, '').replace(/\s+/g, ' ').trim(); + const commandText = `submit ${repo} ${description}`; + + const mentionPayload = { + command: '/bgagent', + text: commandText, + response_url: '', + trigger_id: '', + user_id: userId, + user_name: '', + team_id: teamId, + team_domain: '', + channel_id: channelId, + channel_name: '', + source: 'mention' as const, + mention_thread_ts: threadTs ?? messageTs, + }; + + // React with :eyes: immediately so the user knows the bot saw their message. + const mentionTs = threadTs ?? messageTs; + if (mentionTs) { + const botToken = await getSlackSecret(`${SLACK_SECRET_PREFIX}${teamId}`); + if (botToken) { + await fetch('https://slack.com/api/reactions.add', { + method: 'POST', + headers: { 'Content-Type': 'application/json; charset=utf-8', 'Authorization': `Bearer ${botToken}` }, + body: JSON.stringify({ channel: channelId, timestamp: mentionTs, name: 'eyes' }), + }).catch(() => {}); + } + } + + try { + await lambdaClient.send(new InvokeCommand({ + FunctionName: PROCESSOR_FUNCTION_NAME, + InvocationType: 'Event', + Payload: new TextEncoder().encode(JSON.stringify(mentionPayload)), + })); + logger.info('app_mention forwarded to command processor', { + team_id: teamId, + user_id: userId, + channel_id: channelId, + text_length: text.length, + }); + } catch (err) { + logger.error('Failed to invoke command processor for app_mention', { + error: err instanceof Error ? err.message : String(err), + }); + } +} + +async function revokeInstallation(teamId: string): Promise { + const now = new Date().toISOString(); + + // Mark the installation as revoked. + try { + await ddb.send(new UpdateCommand({ + TableName: TABLE_NAME, + Key: { team_id: teamId }, + UpdateExpression: 'SET #s = :revoked, updated_at = :now, revoked_at = :now', + ExpressionAttributeNames: { '#s': 'status' }, + ExpressionAttributeValues: { ':revoked': 'revoked', ':now': now }, + })); + } catch (err) { + logger.error('Failed to revoke Slack installation', { + team_id: teamId, + error: err instanceof Error ? err.message : String(err), + }); + } + + // Schedule the bot token secret for deletion. + try { + await sm.send(new DeleteSecretCommand({ + SecretId: `${SLACK_SECRET_PREFIX}${teamId}`, + RecoveryWindowInDays: SECRET_RECOVERY_DAYS, + })); + logger.info('Slack installation revoked', { team_id: teamId }); + } catch (err) { + logger.warn('Failed to delete Slack bot token secret', { + team_id: teamId, + error: err instanceof Error ? err.message : String(err), + }); + } +} + +function jsonResponse(statusCode: number, body: Record): APIGatewayProxyResult { + return { + statusCode, + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(body), + }; +} diff --git a/cdk/src/handlers/slack-interactions.ts b/cdk/src/handlers/slack-interactions.ts new file mode 100644 index 0000000..a726b86 --- /dev/null +++ b/cdk/src/handlers/slack-interactions.ts @@ -0,0 +1,244 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; +import { DynamoDBDocumentClient, GetCommand, UpdateCommand } from '@aws-sdk/lib-dynamodb'; +import type { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'; +import { logger } from './shared/logger'; +import { getSlackSecret, SLACK_SECRET_PREFIX, verifySlackSignature } from './shared/slack-verify'; + +const ddb = DynamoDBDocumentClient.from(new DynamoDBClient({})); + +const SIGNING_SECRET_ARN = process.env.SLACK_SIGNING_SECRET_ARN!; +const TASK_TABLE = process.env.TASK_TABLE_NAME!; +const USER_MAPPING_TABLE = process.env.SLACK_USER_MAPPING_TABLE_NAME!; + +interface SlackInteractionPayload { + readonly type: string; + readonly user: { readonly id: string; readonly username: string; readonly team_id: string }; + readonly actions?: ReadonlyArray<{ + readonly action_id: string; + readonly block_id: string; + readonly value?: string; + }>; + readonly response_url: string; + readonly trigger_id: string; + readonly channel?: { readonly id: string }; +} + +/** + * POST /v1/slack/interactions — Handle Slack Block Kit interactive actions. + * + * Slack sends interaction payloads as a URL-encoded `payload` field in the body. + * Currently handles: + * - `cancel_task:{task_id}` — Cancel a running task via the "Cancel Task" button. + */ +export async function handler(event: APIGatewayProxyEvent): Promise { + try { + if (!event.body) { + return jsonResponse(400, { error: 'Request body is required' }); + } + + // Verify Slack signing secret. + const signingSecret = await getSlackSecret(SIGNING_SECRET_ARN); + if (!signingSecret) { + logger.error('Slack signing secret not found'); + return jsonResponse(500, { error: 'Internal configuration error' }); + } + + const signature = event.headers['X-Slack-Signature'] ?? event.headers['x-slack-signature'] ?? ''; + const timestamp = event.headers['X-Slack-Request-Timestamp'] ?? event.headers['x-slack-request-timestamp'] ?? ''; + + if (!verifySlackSignature(signingSecret, signature, timestamp, event.body)) { + logger.warn('Invalid Slack interaction signature'); + return jsonResponse(401, { error: 'Invalid signature' }); + } + + // Parse the payload — Slack sends it as URL-encoded `payload=`. + const params = new URLSearchParams(event.body); + const payloadStr = params.get('payload'); + if (!payloadStr) { + return jsonResponse(400, { error: 'Missing payload' }); + } + + const payload: SlackInteractionPayload = JSON.parse(payloadStr); + + if (payload.type === 'block_actions' && payload.actions) { + for (const action of payload.actions) { + if (action.action_id.startsWith('cancel_task:')) { + await handleCancelAction(payload, action.action_id); + } + } + } + + // Slack expects a 200 response within 3 seconds. + return jsonResponse(200, {}); + } catch (err) { + logger.error('Slack interaction handler failed', { + error: err instanceof Error ? err.message : String(err), + }); + return jsonResponse(200, {}); // Still return 200 to avoid Slack retries. + } +} + +async function handleCancelAction(payload: SlackInteractionPayload, actionId: string): Promise { + const taskId = actionId.replace('cancel_task:', ''); + const teamId = payload.user.team_id; + const userId = payload.user.id; + + // Look up platform user. + const mappingResult = await ddb.send(new GetCommand({ + TableName: USER_MAPPING_TABLE, + Key: { slack_identity: `${teamId}#${userId}` }, + })); + + if (!mappingResult.Item || mappingResult.Item.status === 'pending') { + await postToResponseUrl(payload.response_url, ':link: Your Slack account is not linked.'); + return; + } + + const platformUserId = mappingResult.Item.platform_user_id as string; + + // Load the task. + const taskResult = await ddb.send(new GetCommand({ + TableName: TASK_TABLE, + Key: { task_id: taskId }, + })); + + if (!taskResult.Item) { + await postToResponseUrl(payload.response_url, `:mag: Task \`${taskId}\` not found.`); + return; + } + + if (taskResult.Item.user_id !== platformUserId) { + await postToResponseUrl(payload.response_url, ':no_entry: You can only cancel your own tasks.'); + return; + } + + // Attempt to cancel. + const ACTIVE_STATUSES = ['SUBMITTED', 'HYDRATING', 'RUNNING', 'FINALIZING']; + try { + await ddb.send(new UpdateCommand({ + TableName: TASK_TABLE, + Key: { task_id: taskId }, + UpdateExpression: 'SET #s = :cancelled, updated_at = :now', + ConditionExpression: '#s IN (:s1, :s2, :s3, :s4)', + ExpressionAttributeNames: { '#s': 'status' }, + ExpressionAttributeValues: { + ':cancelled': 'CANCELLED', + ':now': new Date().toISOString(), + ':s1': ACTIVE_STATUSES[0], + ':s2': ACTIVE_STATUSES[1], + ':s3': ACTIVE_STATUSES[2], + ':s4': ACTIVE_STATUSES[3], + }, + })); + + // Instant feedback: replace the Cancel button message with "Cancelling..." + // then clean up all intermediate messages. + const channelMeta = taskResult.Item.channel_metadata as Record | undefined; + const channelId = payload.channel?.id ?? channelMeta?.slack_channel_id; + if (channelMeta && channelId) { + const botToken = await getSlackSecret(`${SLACK_SECRET_PREFIX}${teamId}`); + if (botToken) { + if (channelMeta.slack_session_msg_ts) { + await updateSlackMessage(botToken, channelId, channelMeta.slack_session_msg_ts, + ':hourglass_flowing_sand: Cancelling...', channelMeta.slack_thread_ts); + } + const toDelete = [channelMeta.slack_created_msg_ts].filter(Boolean); + for (const ts of toDelete) { + await deleteSlackMessage(botToken, channelId, ts!); + } + } + } + } catch (err) { + if ((err as Error)?.name === 'ConditionalCheckFailedException') { + await postToResponseUrl(payload.response_url, ':warning: Task is already in a terminal state.'); + } else { + throw err; + } + } +} + +async function updateSlackMessage(botToken: string, channel: string, ts: string, text: string, threadTs?: string): Promise { + try { + const payload: Record = { + channel, + ts, + text, + blocks: [{ type: 'section', text: { type: 'mrkdwn', text } }], + }; + if (threadTs) payload.thread_ts = threadTs; + const response = await fetch('https://slack.com/api/chat.update', { + method: 'POST', + headers: { + 'Content-Type': 'application/json; charset=utf-8', + 'Authorization': `Bearer ${botToken}`, + }, + body: JSON.stringify(payload), + }); + const result = await response.json() as { ok: boolean; error?: string }; + if (!result.ok) { + logger.warn('Failed to update Slack message', { error: result.error, ts }); + } + } catch (err) { + logger.warn('Error updating Slack message', { error: err instanceof Error ? err.message : String(err) }); + } +} + +async function deleteSlackMessage(botToken: string, channel: string, ts: string): Promise { + try { + const response = await fetch('https://slack.com/api/chat.delete', { + method: 'POST', + headers: { + 'Content-Type': 'application/json; charset=utf-8', + 'Authorization': `Bearer ${botToken}`, + }, + body: JSON.stringify({ channel, ts }), + }); + const result = await response.json() as { ok: boolean; error?: string }; + if (!result.ok) { + logger.warn('Failed to delete Slack message', { error: result.error, ts }); + } + } catch (err) { + logger.warn('Error deleting Slack message', { error: err instanceof Error ? err.message : String(err) }); + } +} + +async function postToResponseUrl(responseUrl: string, text: string): Promise { + try { + await fetch(responseUrl, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ response_type: 'ephemeral', text, replace_original: false }), + }); + } catch (err) { + logger.warn('Failed to post to interaction response_url', { + error: err instanceof Error ? err.message : String(err), + }); + } +} + +function jsonResponse(statusCode: number, body: Record): APIGatewayProxyResult { + return { + statusCode, + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(body), + }; +} diff --git a/cdk/src/handlers/slack-link.ts b/cdk/src/handlers/slack-link.ts new file mode 100644 index 0000000..60ba20d --- /dev/null +++ b/cdk/src/handlers/slack-link.ts @@ -0,0 +1,112 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; +import { DynamoDBDocumentClient, GetCommand, PutCommand, DeleteCommand } from '@aws-sdk/lib-dynamodb'; +import type { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'; +import { ulid } from 'ulid'; +import { extractUserId } from './shared/gateway'; +import { logger } from './shared/logger'; +import { ErrorCode, errorResponse, successResponse } from './shared/response'; +import { parseBody } from './shared/validation'; + +const ddb = DynamoDBDocumentClient.from(new DynamoDBClient({})); + +const USER_MAPPING_TABLE = process.env.SLACK_USER_MAPPING_TABLE_NAME!; + +interface LinkRequest { + readonly code: string; +} + +/** + * POST /v1/slack/link — Complete Slack account linking. + * + * Called from the CLI (`bgagent slack link `) with a Cognito JWT. + * Looks up the pending link record, maps the Slack identity to the + * authenticated platform user, and cleans up the pending record. + */ +export async function handler(event: APIGatewayProxyEvent): Promise { + const requestId = ulid(); + + try { + const userId = extractUserId(event); + if (!userId) { + return errorResponse(401, ErrorCode.UNAUTHORIZED, 'Authentication required.', requestId); + } + + const body = parseBody(event.body ?? null); + if (!body?.code) { + return errorResponse(400, ErrorCode.VALIDATION_ERROR, 'Request body must include a "code" field.', requestId); + } + + const code = body.code.trim().toUpperCase(); + + // Look up the pending link record. + const pending = await ddb.send(new GetCommand({ + TableName: USER_MAPPING_TABLE, + Key: { slack_identity: `pending#${code}` }, + })); + + if (!pending.Item || pending.Item.status !== 'pending') { + return errorResponse(404, ErrorCode.VALIDATION_ERROR, 'Invalid or expired link code.', requestId); + } + + const teamId = pending.Item.slack_team_id as string; + const slackUserId = pending.Item.slack_user_id as string; + const now = new Date().toISOString(); + + // Write the confirmed mapping. + await ddb.send(new PutCommand({ + TableName: USER_MAPPING_TABLE, + Item: { + slack_identity: `${teamId}#${slackUserId}`, + platform_user_id: userId, + slack_team_id: teamId, + slack_user_id: slackUserId, + linked_at: now, + link_method: 'slash_command', + }, + })); + + // Clean up the pending record. + await ddb.send(new DeleteCommand({ + TableName: USER_MAPPING_TABLE, + Key: { slack_identity: `pending#${code}` }, + })); + + logger.info('Slack account linked', { + platform_user_id: userId, + slack_team_id: teamId, + slack_user_id: slackUserId, + }); + + return successResponse(200, { + message: 'Slack account linked successfully.', + slack_team_id: teamId, + slack_user_id: slackUserId, + linked_at: now, + }, requestId); + } catch (err) { + logger.error('Slack link handler failed', { + error: err instanceof Error ? err.message : String(err), + request_id: requestId, + }); + return errorResponse(500, ErrorCode.INTERNAL_ERROR, 'Internal server error.', requestId); + } +} diff --git a/cdk/src/handlers/slack-notify.ts b/cdk/src/handlers/slack-notify.ts new file mode 100644 index 0000000..a9ca5ee --- /dev/null +++ b/cdk/src/handlers/slack-notify.ts @@ -0,0 +1,333 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; +import { DynamoDBDocumentClient, GetCommand, UpdateCommand } from '@aws-sdk/lib-dynamodb'; +import type { DynamoDBStreamEvent, DynamoDBRecord } from 'aws-lambda'; +import { logger } from './shared/logger'; +import { renderSlackBlocks } from './shared/slack-blocks'; +import { getSlackSecret, SLACK_SECRET_PREFIX } from './shared/slack-verify'; +import type { TaskRecord } from './shared/types'; + +const ddb = DynamoDBDocumentClient.from(new DynamoDBClient({})); + +const TASK_TABLE = process.env.TASK_TABLE_NAME!; + +const TERMINAL_EVENTS = new Set(['task_completed', 'task_failed', 'task_cancelled', 'task_timed_out']); + +/** Event types that trigger Slack notifications. */ +const NOTIFIABLE_EVENTS = new Set([ + 'task_created', + 'session_started', + 'task_completed', + 'task_failed', + 'task_cancelled', + 'task_timed_out', +]); + +/** + * Slack notification handler triggered by DynamoDB Streams on TaskEventsTable. + * + * For each task event: + * 1. Load the task record to check channel_source and channel_metadata. + * 2. If channel_source is 'slack', render a Block Kit message and post to Slack. + * 3. Thread replies under the initial message using stored slack_thread_ts. + * + * Notifications are best-effort — failures are logged but never fail the stream. + */ +export async function handler(event: DynamoDBStreamEvent): Promise { + for (const record of event.Records) { + try { + await processRecord(record); + } catch (err) { + logger.warn('Failed to process Slack notification for stream record', { + error: err instanceof Error ? err.message : String(err), + event_id: record.eventID, + }); + } + } +} + +async function processRecord(record: DynamoDBRecord): Promise { + if (record.eventName !== 'INSERT' || !record.dynamodb?.NewImage) return; + + const newImage = record.dynamodb.NewImage; + const eventType = newImage.event_type?.S; + const taskId = newImage.task_id?.S; + + if (!eventType || !taskId || !NOTIFIABLE_EVENTS.has(eventType)) return; + + // Deduplicate terminal notifications — the orchestrator may write multiple + // failure/completion events (retries). Use a conditional update to claim + // the right to send the terminal notification. + + if (TERMINAL_EVENTS.has(eventType)) { + try { + await ddb.send(new UpdateCommand({ + TableName: TASK_TABLE, + Key: { task_id: taskId }, + UpdateExpression: 'SET channel_metadata.slack_notified_terminal = :t', + ConditionExpression: 'attribute_not_exists(channel_metadata.slack_notified_terminal)', + ExpressionAttributeValues: { ':t': true }, + })); + } catch (err) { + if ((err as Error)?.name === 'ConditionalCheckFailedException') { + logger.info('Terminal notification already sent, skipping duplicate', { task_id: taskId, event_type: eventType }); + return; + } + throw err; + } + } + + // Load the task record. + const taskResult = await ddb.send(new GetCommand({ + TableName: TASK_TABLE, + Key: { task_id: taskId }, + })); + + const task = taskResult.Item as TaskRecord | undefined; + if (!task || task.channel_source !== 'slack') return; + + const channelMeta = task.channel_metadata; + if (!channelMeta?.slack_team_id || !channelMeta?.slack_channel_id) { + logger.warn('Slack task missing channel metadata', { task_id: taskId }); + return; + } + + // Fetch the bot token for this workspace. + const botToken = await getSlackSecret(`${SLACK_SECRET_PREFIX}${channelMeta.slack_team_id}`); + if (!botToken) { + logger.warn('Bot token not found for Slack workspace', { + team_id: channelMeta.slack_team_id, + task_id: taskId, + }); + return; + } + + // Parse event metadata if present. + const eventMetadata = newImage.metadata?.S + ? safeJsonParse(newImage.metadata.S) + : undefined; + + // Render the Slack message. + const message = renderSlackBlocks(eventType, task, eventMetadata ?? undefined); + + // For task_created, post a new message. For subsequent events, reply in thread. + const threadTs = channelMeta.slack_thread_ts; + + // For DM channels (prefix 'D'), post to the user ID instead — chat.postMessage + // opens a DM automatically when given a user ID, which avoids the channel_not_found + // error that occurs with ephemeral DM channel IDs from slash commands. + const channel = channelMeta.slack_channel_id.startsWith('D') && channelMeta.slack_user_id + ? channelMeta.slack_user_id + : channelMeta.slack_channel_id; + + const slackPayload: Record = { + channel, + text: message.text, + blocks: message.blocks, + }; + + // Thread all messages under the original. For @mentions, threadTs is set to the + // user's mention message by the command processor. For slash commands, threadTs + // is set to the task_created message after it's posted (see below). + if (threadTs) { + slackPayload.thread_ts = threadTs; + } + + // Suppress link unfurls — the View PR button is the clean way to access it. + slackPayload.unfurl_links = false; + + // Post to Slack. + const response = await fetch('https://slack.com/api/chat.postMessage', { + method: 'POST', + headers: { + 'Content-Type': 'application/json; charset=utf-8', + 'Authorization': `Bearer ${botToken}`, + }, + body: JSON.stringify(slackPayload), + }); + + const result = await response.json() as { ok: boolean; ts?: string; error?: string }; + + if (!result.ok) { + logger.warn('Slack API returned error', { + error: result.error, + task_id: taskId, + event_type: eventType, + }); + return; + } + + // Emoji reaction on the root message — the user's @mention or the task_created message. + // Reactions always use the real channel ID (not user ID), even for DMs. + const reactionChannel = channelMeta.slack_channel_id; + const reactionTarget = threadTs ?? result.ts; + if (reactionTarget) { + await updateReaction(botToken, reactionChannel, reactionTarget, eventType); + } + + // Store message timestamps for later updates. + if (result.ts) { + if (eventType === 'task_created') { + const updates: string[] = ['channel_metadata.slack_created_msg_ts = :created_ts']; + const values: Record = { ':created_ts': result.ts }; + if (!threadTs) { + // Slash commands: also store thread_ts (mentions already have it). + updates.push('channel_metadata.slack_thread_ts = :created_ts'); + } + try { + await ddb.send(new UpdateCommand({ + TableName: TASK_TABLE, + Key: { task_id: taskId }, + UpdateExpression: `SET ${updates.join(', ')}`, + ExpressionAttributeValues: values, + })); + } catch (err) { + logger.warn('Failed to store task_created message ts', { + task_id: taskId, + error: err instanceof Error ? err.message : String(err), + }); + } + } else if (eventType === 'session_started') { + try { + await ddb.send(new UpdateCommand({ + TableName: TASK_TABLE, + Key: { task_id: taskId }, + UpdateExpression: 'SET channel_metadata.slack_session_msg_ts = :ts', + ExpressionAttributeValues: { ':ts': result.ts }, + })); + } catch (err) { + logger.warn('Failed to store session message ts', { + task_id: taskId, + error: err instanceof Error ? err.message : String(err), + }); + } + } + } + + // On terminal events, clean up intermediate messages — only the final + // result message stays in the thread. + if (TERMINAL_EVENTS.has(eventType)) { + if (channelMeta.slack_session_msg_ts) { + await deleteMessage(botToken, channel, channelMeta.slack_session_msg_ts); + } + if (channelMeta.slack_created_msg_ts) { + await deleteMessage(botToken, channel, channelMeta.slack_created_msg_ts); + } + } + + logger.info('Slack notification sent', { + task_id: taskId, + event_type: eventType, + team_id: channelMeta.slack_team_id, + channel_id: channelMeta.slack_channel_id, + }); +} + +/** Map event types to the emoji reaction that should be on the original message. */ +const EVENT_REACTIONS: Record = { + task_created: 'eyes', + session_started: 'hourglass_flowing_sand', + task_completed: 'white_check_mark', + task_failed: 'x', + task_cancelled: 'no_entry_sign', + task_timed_out: 'hourglass', +}; + +/** Reactions to remove when transitioning to a new state. */ +const STALE_REACTIONS = ['eyes', 'hourglass_flowing_sand']; + +async function addReaction(botToken: string, channel: string, timestamp: string, emoji: string): Promise { + try { + const response = await fetch('https://slack.com/api/reactions.add', { + method: 'POST', + headers: { + 'Content-Type': 'application/json; charset=utf-8', + 'Authorization': `Bearer ${botToken}`, + }, + body: JSON.stringify({ channel, timestamp, name: emoji }), + }); + const result = await response.json() as { ok: boolean; error?: string }; + if (!result.ok && result.error !== 'already_reacted') { + logger.warn('Failed to add Slack reaction', { emoji, error: result.error }); + } + } catch (err) { + logger.warn('Error adding Slack reaction', { emoji, error: err instanceof Error ? err.message : String(err) }); + } +} + +async function removeReaction(botToken: string, channel: string, timestamp: string, emoji: string): Promise { + try { + const response = await fetch('https://slack.com/api/reactions.remove', { + method: 'POST', + headers: { + 'Content-Type': 'application/json; charset=utf-8', + 'Authorization': `Bearer ${botToken}`, + }, + body: JSON.stringify({ channel, timestamp, name: emoji }), + }); + const result = await response.json() as { ok: boolean; error?: string }; + if (!result.ok && result.error !== 'no_reaction') { + logger.warn('Failed to remove Slack reaction', { emoji, error: result.error }); + } + } catch (err) { + logger.warn('Error removing Slack reaction', { emoji, error: err instanceof Error ? err.message : String(err) }); + } +} + +async function updateReaction(botToken: string, channel: string, threadTs: string, eventType: string): Promise { + const newEmoji = EVENT_REACTIONS[eventType]; + if (!newEmoji) return; + + // Remove stale reactions first, then add the new one. + for (const stale of STALE_REACTIONS) { + if (stale !== newEmoji) { + await removeReaction(botToken, channel, threadTs, stale); + } + } + await addReaction(botToken, channel, threadTs, newEmoji); +} + +async function deleteMessage(botToken: string, channel: string, messageTs: string): Promise { + try { + const response = await fetch('https://slack.com/api/chat.delete', { + method: 'POST', + headers: { + 'Content-Type': 'application/json; charset=utf-8', + 'Authorization': `Bearer ${botToken}`, + }, + body: JSON.stringify({ channel, ts: messageTs }), + }); + const result = await response.json() as { ok: boolean; error?: string }; + if (!result.ok) { + logger.warn('Failed to delete session message', { error: result.error }); + } + } catch (err) { + logger.warn('Error deleting session message', { error: err instanceof Error ? err.message : String(err) }); + } +} + +function safeJsonParse(text: string): Record | null { + try { + return JSON.parse(text); + } catch { + return null; + } +} diff --git a/cdk/src/handlers/slack-oauth-callback.ts b/cdk/src/handlers/slack-oauth-callback.ts new file mode 100644 index 0000000..e7f1d3b --- /dev/null +++ b/cdk/src/handlers/slack-oauth-callback.ts @@ -0,0 +1,195 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; +import { CreateSecretCommand, RestoreSecretCommand, SecretsManagerClient, UpdateSecretCommand, ResourceNotFoundException, InvalidRequestException } from '@aws-sdk/client-secrets-manager'; +import { DynamoDBDocumentClient, PutCommand } from '@aws-sdk/lib-dynamodb'; +import type { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'; +import { logger } from './shared/logger'; +import { getSlackSecret, SLACK_SECRET_PREFIX } from './shared/slack-verify'; + +const ddb = DynamoDBDocumentClient.from(new DynamoDBClient({})); +const sm = new SecretsManagerClient({}); + +const TABLE_NAME = process.env.SLACK_INSTALLATION_TABLE_NAME!; +const CLIENT_ID_SECRET_ARN = process.env.SLACK_CLIENT_ID_SECRET_ARN!; +const CLIENT_SECRET_ARN = process.env.SLACK_CLIENT_SECRET_ARN!; + +interface SlackOAuthResponse { + readonly ok: boolean; + readonly error?: string; + readonly app_id?: string; + readonly team?: { readonly id: string; readonly name: string }; + readonly bot_user_id?: string; + readonly access_token?: string; + readonly scope?: string; + readonly authed_user?: { readonly id: string }; +} + +/** + * GET /v1/slack/oauth/callback — Handle Slack OAuth V2 redirect. + * + * After a workspace admin authorizes the Slack App, Slack redirects here + * with a `code` query parameter. This handler exchanges the code for a + * bot token, stores it in Secrets Manager, and records the installation. + */ +export async function handler(event: APIGatewayProxyEvent): Promise { + try { + const code = event.queryStringParameters?.code; + if (!code) { + return htmlResponse(400, 'Missing authorization code. Please try the install flow again.'); + } + + // Fetch the Slack App client ID and client secret from Secrets Manager. + const clientId = await getSlackSecret(CLIENT_ID_SECRET_ARN); + if (!clientId) { + logger.error('Slack client ID not found', { secret_arn: CLIENT_ID_SECRET_ARN }); + return htmlResponse(500, 'Slack client ID not configured. Populate the secret in Secrets Manager.'); + } + + const clientSecret = await getSlackSecret(CLIENT_SECRET_ARN); + if (!clientSecret) { + logger.error('Slack client secret not found', { secret_arn: CLIENT_SECRET_ARN }); + return htmlResponse(500, 'Slack client secret not configured. Populate the secret in Secrets Manager.'); + } + + // Exchange the code for an access token. + const redirectUri = buildRedirectUri(event); + const tokenResponse = await exchangeCode(code, clientId, clientSecret, redirectUri); + if (!tokenResponse.ok || !tokenResponse.access_token || !tokenResponse.team) { + logger.error('Slack OAuth token exchange failed', { + error: tokenResponse.error ?? 'unknown', + }); + return htmlResponse(400, `Slack authorization failed: ${tokenResponse.error ?? 'unknown error'}`); + } + + const teamId = tokenResponse.team.id; + const teamName = tokenResponse.team.name; + const botToken = tokenResponse.access_token; + const now = new Date().toISOString(); + + // Store the bot token in Secrets Manager. + const secretName = `${SLACK_SECRET_PREFIX}${teamId}`; + await upsertSecret(secretName, botToken, teamId); + + // Write installation record to DynamoDB. + await ddb.send(new PutCommand({ + TableName: TABLE_NAME, + Item: { + team_id: teamId, + team_name: teamName, + bot_token_secret_arn: secretName, + bot_user_id: tokenResponse.bot_user_id ?? '', + app_id: tokenResponse.app_id ?? '', + scope: tokenResponse.scope ?? '', + installed_by: tokenResponse.authed_user?.id ?? '', + installed_at: now, + updated_at: now, + status: 'active', + }, + })); + + logger.info('Slack workspace installed', { team_id: teamId, team_name: teamName }); + + return htmlResponse(200, ` +

Successfully installed!

+

ABCA Background Agent has been added to the ${escapeHtml(teamName)} workspace.

+

Team members can now link their accounts with /bgagent link and start submitting tasks.

+ `); + } catch (err) { + logger.error('Slack OAuth callback failed', { + error: err instanceof Error ? err.message : String(err), + }); + return htmlResponse(500, 'An unexpected error occurred. Please try again.'); + } +} + +async function exchangeCode( + code: string, + clientId: string, + clientSecret: string, + redirectUri: string, +): Promise { + const params = new URLSearchParams({ + client_id: clientId, + client_secret: clientSecret, + code, + redirect_uri: redirectUri, + }); + + const response = await fetch('https://slack.com/api/oauth.v2.access', { + method: 'POST', + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + body: params.toString(), + }); + + return await response.json() as SlackOAuthResponse; +} + +async function upsertSecret(secretName: string, secretValue: string, teamId: string): Promise { + try { + await sm.send(new UpdateSecretCommand({ + SecretId: secretName, + SecretString: secretValue, + })); + } catch (err) { + if (err instanceof ResourceNotFoundException) { + await sm.send(new CreateSecretCommand({ + Name: secretName, + SecretString: secretValue, + Description: `Slack bot token for workspace ${teamId}`, + Tags: [ + { Key: 'team_id', Value: teamId }, + { Key: 'service', Value: 'bgagent-slack' }, + ], + })); + } else if (err instanceof InvalidRequestException && String(err.message).includes('marked for deletion')) { + // Secret was scheduled for deletion during app uninstall — restore it and update. + await sm.send(new RestoreSecretCommand({ SecretId: secretName })); + await sm.send(new UpdateSecretCommand({ + SecretId: secretName, + SecretString: secretValue, + })); + } else { + throw err; + } + } +} + +function buildRedirectUri(event: APIGatewayProxyEvent): string { + const host = event.headers.Host ?? event.headers.host ?? ''; + const stage = event.requestContext.stage ?? ''; + return `https://${host}/${stage}/slack/oauth/callback`; +} + +function htmlResponse(statusCode: number, body: string): APIGatewayProxyResult { + const html = ` +ABCA Slack Integration + +${body}`; + return { + statusCode, + headers: { 'Content-Type': 'text/html; charset=utf-8' }, + body: html, + }; +} + +function escapeHtml(text: string): string { + return text.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); +} diff --git a/cdk/src/stacks/agent.ts b/cdk/src/stacks/agent.ts index da99401..360199b 100644 --- a/cdk/src/stacks/agent.ts +++ b/cdk/src/stacks/agent.ts @@ -21,7 +21,7 @@ import * as path from 'path'; import * as agentcore from '@aws-cdk/aws-bedrock-agentcore-alpha'; import * as bedrock from '@aws-cdk/aws-bedrock-alpha'; import * as agentcoremixins from '@aws-cdk/mixins-preview/aws-bedrockagentcore'; -import { Stack, StackProps, RemovalPolicy, CfnOutput, CfnResource } from 'aws-cdk-lib'; +import { Stack, StackProps, RemovalPolicy, CfnOutput, CfnResource, Fn } from 'aws-cdk-lib'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; // ecr_assets import is only needed when the ECS block below is uncommented // import * as ecr_assets from 'aws-cdk-lib/aws-ecr-assets'; @@ -38,6 +38,7 @@ import { ConcurrencyReconciler } from '../constructs/concurrency-reconciler'; import { DnsFirewall } from '../constructs/dns-firewall'; // import { EcsAgentCluster } from '../constructs/ecs-agent-cluster'; import { RepoTable } from '../constructs/repo-table'; +import { SlackIntegration } from '../constructs/slack-integration'; import { TaskApi } from '../constructs/task-api'; import { TaskDashboard } from '../constructs/task-dashboard'; import { TaskEventsTable } from '../constructs/task-events-table'; @@ -62,8 +63,9 @@ export class AgentStack extends Stack { const repoTable = new RepoTable(this, 'RepoTable'); // --- Repository onboarding --- + const blueprintRepo = process.env.BLUEPRINT_REPO ?? this.node.tryGetContext('blueprintRepo') ?? 'awslabs/agent-plugins'; const agentPluginsBlueprint = new Blueprint(this, 'AgentPluginsBlueprint', { - repo: 'krokoko/agent-plugins', + repo: blueprintRepo, repoTable: repoTable.table, }); @@ -230,7 +232,9 @@ export class AgentStack extends Stack { // Runtime logs and traces runtime.with(agentcoremixins.mixins.CfnRuntimeLogsMixin.APPLICATION_LOGS.toLogGroup(applicationLogGroup)); - runtime.with(agentcoremixins.mixins.CfnRuntimeLogsMixin.TRACES.toXRay()); + // X-Ray tracing disabled — requires account-level UpdateTraceSegmentDestination + // which needs CloudWatch Logs resource policy propagation. Re-enable once resolved. + // runtime.with(agentcoremixins.mixins.CfnRuntimeLogsMixin.TRACES.toXRay()); runtime.with(agentcoremixins.mixins.CfnRuntimeLogsMixin.USAGE_LOGS.toLogGroup(usageLogGroup)); NagSuppressions.addResourceSuppressions(runtime, [ @@ -363,6 +367,69 @@ export class AgentStack extends Stack { runtimeArn: runtime.agentRuntimeArn, }); + // --- Slack integration (always deployed — secrets populated post-deploy) --- + const slackIntegration = new SlackIntegration(this, 'SlackIntegration', { + api: taskApi.api, + userPool: taskApi.userPool, + taskTable: taskTable.table, + taskEventsTable: taskEventsTable.table, + repoTable: repoTable.table, + orchestratorFunctionArn: orchestrator.alias.functionArn, + guardrailId: inputGuardrail.guardrailId, + guardrailVersion: inputGuardrail.guardrailVersion, + }); + + // --- Slack App setup outputs --- + // Pre-filled manifest URL: opens Slack's "Create New App" page with all + // URLs, scopes, and events pre-configured. User just clicks Create. + const apiHost = Fn.select(2, Fn.split('/', taskApi.api.url)); + const apiStage = Fn.select(3, Fn.split('/', taskApi.api.url)); + const apiBase = Fn.join('', ['https://', apiHost, '/', apiStage]); + + // Build the YAML manifest as a string using Fn.join (API URL tokens resolve at deploy time). + // Slack's ?new_app=1&manifest_json= endpoint accepts URL-encoded JSON. + const manifestJson = Fn.join('', [ + '{"_metadata":{"major_version":1,"minor_version":1},', + '"display_information":{"name":"Shoof","description":"Submit coding tasks to autonomous background agents","background_color":"#1a1a2e"},', + '"features":{"app_home":{"messages_tab_enabled":true,"messages_tab_read_only_enabled":false},"bot_user":{"display_name":"Shoof","always_online":true},', + '"slash_commands":[{"command":"/bgagent","url":"', apiBase, '/slack/commands","description":"Link your account or get help with Shoof","usage_hint":"link | help","should_escape":false}]},', + '"oauth_config":{"scopes":{"bot":["app_mentions:read","commands","chat:write","chat:write.public","channels:read","groups:read","im:history","im:write","users:read","reactions:write"]},', + '"redirect_urls":["', apiBase, '/slack/oauth/callback"]},', + '"settings":{"event_subscriptions":{"request_url":"', apiBase, '/slack/events","bot_events":["app_mention","message.im","app_uninstalled","tokens_revoked"]},', + '"interactivity":{"is_enabled":true,"request_url":"', apiBase, '/slack/interactions"},', + '"org_deploy_enabled":false,"socket_mode_enabled":false,"token_rotation_enabled":false}}', + ]); + + new CfnOutput(this, 'SlackAppManifestJson', { + value: manifestJson, + description: 'Slack App manifest JSON — the CLI URL-encodes this into the create URL', + }); + + new CfnOutput(this, 'SlackSigningSecretArn', { + value: slackIntegration.signingSecret.secretArn, + description: 'Secrets Manager ARN for the Slack signing secret — populate after creating the Slack App', + }); + + new CfnOutput(this, 'SlackClientSecretArn', { + value: slackIntegration.clientSecret.secretArn, + description: 'Secrets Manager ARN for the Slack client secret — populate after creating the Slack App', + }); + + new CfnOutput(this, 'SlackClientIdSecretArn', { + value: slackIntegration.clientIdSecret.secretArn, + description: 'Secrets Manager ARN for the Slack client ID — populate after creating the Slack App', + }); + + new CfnOutput(this, 'SlackInstallationTableName', { + value: slackIntegration.installationTable.tableName, + description: 'Name of the DynamoDB Slack installation table', + }); + + new CfnOutput(this, 'SlackUserMappingTableName', { + value: slackIntegration.userMappingTable.tableName, + description: 'Name of the DynamoDB Slack user mapping table', + }); + // --- Bedrock model invocation logging (account-level) --- const invocationLogGroup = new logs.LogGroup(this, 'ModelInvocationLogGroup', { logGroupName: '/aws/bedrock/model-invocation-logs', diff --git a/cdk/test/constructs/slack-installation-table.test.ts b/cdk/test/constructs/slack-installation-table.test.ts new file mode 100644 index 0000000..a2cc546 --- /dev/null +++ b/cdk/test/constructs/slack-installation-table.test.ts @@ -0,0 +1,68 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { App, Stack } from 'aws-cdk-lib'; +import { Template } from 'aws-cdk-lib/assertions'; +import { SlackInstallationTable } from '../../src/constructs/slack-installation-table'; + +describe('SlackInstallationTable construct', () => { + let template: Template; + + beforeAll(() => { + const app = new App(); + const stack = new Stack(app, 'TestStack'); + new SlackInstallationTable(stack, 'SlackInstallationTable'); + template = Template.fromStack(stack); + }); + + test('creates a DynamoDB table', () => { + template.resourceCountIs('AWS::DynamoDB::Table', 1); + }); + + test('table has team_id as partition key', () => { + template.hasResourceProperties('AWS::DynamoDB::Table', { + KeySchema: [ + { AttributeName: 'team_id', KeyType: 'HASH' }, + ], + }); + }); + + test('table uses PAY_PER_REQUEST billing', () => { + template.hasResourceProperties('AWS::DynamoDB::Table', { + BillingMode: 'PAY_PER_REQUEST', + }); + }); + + test('table has point-in-time recovery enabled', () => { + template.hasResourceProperties('AWS::DynamoDB::Table', { + PointInTimeRecoverySpecification: { + PointInTimeRecoveryEnabled: true, + }, + }); + }); + + test('enables TTL on ttl attribute', () => { + template.hasResourceProperties('AWS::DynamoDB::Table', { + TimeToLiveSpecification: { + AttributeName: 'ttl', + Enabled: true, + }, + }); + }); +}); diff --git a/cdk/test/constructs/slack-integration.test.ts b/cdk/test/constructs/slack-integration.test.ts new file mode 100644 index 0000000..33f14a3 --- /dev/null +++ b/cdk/test/constructs/slack-integration.test.ts @@ -0,0 +1,135 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { App, Stack } from 'aws-cdk-lib'; +import { Template, Match } from 'aws-cdk-lib/assertions'; +import * as apigw from 'aws-cdk-lib/aws-apigateway'; +import * as cognito from 'aws-cdk-lib/aws-cognito'; +import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; +import { SlackIntegration } from '../../src/constructs/slack-integration'; + +describe('SlackIntegration construct', () => { + let template: Template; + + beforeAll(() => { + const app = new App(); + const stack = new Stack(app, 'TestStack'); + + const api = new apigw.RestApi(stack, 'TestApi'); + const userPool = new cognito.UserPool(stack, 'TestUserPool'); + const taskTable = new dynamodb.Table(stack, 'TaskTable', { + partitionKey: { name: 'task_id', type: dynamodb.AttributeType.STRING }, + }); + const taskEventsTable = new dynamodb.Table(stack, 'TaskEventsTable', { + partitionKey: { name: 'task_id', type: dynamodb.AttributeType.STRING }, + sortKey: { name: 'event_id', type: dynamodb.AttributeType.STRING }, + stream: dynamodb.StreamViewType.NEW_IMAGE, + }); + + new SlackIntegration(stack, 'SlackIntegration', { + api, + userPool, + taskTable, + taskEventsTable, + }); + + template = Template.fromStack(stack); + }); + + test('creates two DynamoDB tables (installation + user mapping)', () => { + // TaskTable + TaskEventsTable + SlackInstallation + SlackUserMapping = 4 + template.resourceCountIs('AWS::DynamoDB::Table', 4); + }); + + test('creates 7 Lambda functions', () => { + // oauth-callback, events, commands, command-processor, link, notify, interactions + template.resourceCountIs('AWS::Lambda::Function', 7); + }); + + test('creates API Gateway resources under /slack', () => { + // Verify /slack/* routes exist + template.hasResourceProperties('AWS::ApiGateway::Resource', { + PathPart: 'slack', + }); + template.hasResourceProperties('AWS::ApiGateway::Resource', { + PathPart: 'commands', + }); + template.hasResourceProperties('AWS::ApiGateway::Resource', { + PathPart: 'events', + }); + template.hasResourceProperties('AWS::ApiGateway::Resource', { + PathPart: 'link', + }); + template.hasResourceProperties('AWS::ApiGateway::Resource', { + PathPart: 'interactions', + }); + }); + + test('slash command handler has 3-second timeout', () => { + template.hasResourceProperties('AWS::Lambda::Function', { + Timeout: 3, + Environment: { + Variables: Match.objectLike({ + SLACK_SIGNING_SECRET_ARN: Match.anyValue(), + SLACK_COMMAND_PROCESSOR_FUNCTION_NAME: Match.anyValue(), + }), + }, + }); + }); + + test('notification handler has DynamoDB Streams event source', () => { + template.hasResourceProperties('AWS::Lambda::EventSourceMapping', { + EventSourceArn: Match.anyValue(), + StartingPosition: 'LATEST', + BatchSize: 10, + MaximumBatchingWindowInSeconds: 0, + MaximumRetryAttempts: 3, + BisectBatchOnFunctionError: true, + }); + }); + + test('creates 3 Secrets Manager secrets for Slack App credentials', () => { + template.resourceCountIs('AWS::SecretsManager::Secret', 3); + template.hasResourceProperties('AWS::SecretsManager::Secret', { + Description: Match.stringLikeRegexp('signing secret'), + }); + template.hasResourceProperties('AWS::SecretsManager::Secret', { + Description: Match.stringLikeRegexp('client secret'), + }); + template.hasResourceProperties('AWS::SecretsManager::Secret', { + Description: Match.stringLikeRegexp('client ID'), + }); + }); + + test('OAuth callback has Secrets Manager permissions', () => { + template.hasResourceProperties('AWS::IAM::Policy', { + PolicyDocument: { + Statement: Match.arrayWith([ + Match.objectLike({ + Action: 'secretsmanager:CreateSecret', + Effect: 'Allow', + Condition: { + StringLike: { 'secretsmanager:Name': 'bgagent/slack/*' }, + }, + }), + ]), + }, + }); + }); +}); diff --git a/cdk/test/constructs/slack-user-mapping-table.test.ts b/cdk/test/constructs/slack-user-mapping-table.test.ts new file mode 100644 index 0000000..761ac51 --- /dev/null +++ b/cdk/test/constructs/slack-user-mapping-table.test.ts @@ -0,0 +1,83 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { App, Stack } from 'aws-cdk-lib'; +import { Template } from 'aws-cdk-lib/assertions'; +import { SlackUserMappingTable } from '../../src/constructs/slack-user-mapping-table'; + +describe('SlackUserMappingTable construct', () => { + let template: Template; + + beforeAll(() => { + const app = new App(); + const stack = new Stack(app, 'TestStack'); + new SlackUserMappingTable(stack, 'SlackUserMappingTable'); + template = Template.fromStack(stack); + }); + + test('creates a DynamoDB table', () => { + template.resourceCountIs('AWS::DynamoDB::Table', 1); + }); + + test('table has slack_identity as partition key', () => { + template.hasResourceProperties('AWS::DynamoDB::Table', { + KeySchema: [ + { AttributeName: 'slack_identity', KeyType: 'HASH' }, + ], + }); + }); + + test('table uses PAY_PER_REQUEST billing', () => { + template.hasResourceProperties('AWS::DynamoDB::Table', { + BillingMode: 'PAY_PER_REQUEST', + }); + }); + + test('table has point-in-time recovery enabled', () => { + template.hasResourceProperties('AWS::DynamoDB::Table', { + PointInTimeRecoverySpecification: { + PointInTimeRecoveryEnabled: true, + }, + }); + }); + + test('enables TTL on ttl attribute', () => { + template.hasResourceProperties('AWS::DynamoDB::Table', { + TimeToLiveSpecification: { + AttributeName: 'ttl', + Enabled: true, + }, + }); + }); + + test('table has PlatformUserIndex GSI', () => { + template.hasResourceProperties('AWS::DynamoDB::Table', { + GlobalSecondaryIndexes: [ + { + IndexName: 'PlatformUserIndex', + KeySchema: [ + { AttributeName: 'platform_user_id', KeyType: 'HASH' }, + { AttributeName: 'linked_at', KeyType: 'RANGE' }, + ], + Projection: { ProjectionType: 'ALL' }, + }, + ], + }); + }); +}); diff --git a/cdk/test/handlers/shared/slack-blocks.test.ts b/cdk/test/handlers/shared/slack-blocks.test.ts new file mode 100644 index 0000000..21a260a --- /dev/null +++ b/cdk/test/handlers/shared/slack-blocks.test.ts @@ -0,0 +1,110 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { TaskStatus, type TaskStatusType } from '../../../src/constructs/task-status'; +import { renderSlackBlocks } from '../../../src/handlers/shared/slack-blocks'; + +describe('renderSlackBlocks', () => { + const baseTask = { + task_id: '01HXYZ123', + repo: 'org/repo', + task_description: 'Fix the login bug', + pr_url: undefined as string | undefined, + error_message: undefined as string | undefined, + cost_usd: undefined as number | undefined, + duration_s: undefined as number | undefined, + status: TaskStatus.SUBMITTED as TaskStatusType, + }; + + test('renders task_created message', () => { + const msg = renderSlackBlocks('task_created', baseTask); + expect(msg.text).toContain('org/repo'); + expect(msg.blocks).toHaveLength(1); + expect(msg.blocks[0].type).toBe('section'); + expect(msg.blocks[0].text?.text).toContain(':rocket:'); + expect(msg.blocks[0].text?.text).toContain('Fix the login bug'); + expect(msg.blocks[0].text?.text).toContain('01HXYZ123'); + }); + + test('renders task_completed message with PR URL', () => { + const task = { ...baseTask, status: TaskStatus.COMPLETED as TaskStatusType, pr_url: 'https://github.com/org/repo/pull/42', cost_usd: 0.47, duration_s: 272 }; + const msg = renderSlackBlocks('task_completed', task); + expect(msg.text).toContain('completed'); + expect(msg.blocks[0].text?.text).toContain('$0.47'); + expect(msg.blocks[0].text?.text).toContain('4m 32s'); + // PR link is in the button, not inline text (avoids Slack unfurl cards) + const actionsBlock = msg.blocks[1] as unknown as { type: string; elements: Array<{ url: string; text: { text: string } }> }; + expect(actionsBlock.type).toBe('actions'); + expect(actionsBlock.elements[0].url).toBe('https://github.com/org/repo/pull/42'); + expect(actionsBlock.elements[0].text.text).toContain('#42'); + }); + + test('renders task_failed message with error', () => { + const task = { ...baseTask, status: TaskStatus.FAILED as TaskStatusType, error_message: 'Repo not found' }; + const msg = renderSlackBlocks('task_failed', task); + expect(msg.text).toContain('failed'); + expect(msg.blocks[0].text?.text).toContain('Repo not found'); + }); + + test('renders task_failed message with metadata error', () => { + const task = { ...baseTask, status: TaskStatus.FAILED as TaskStatusType }; + const msg = renderSlackBlocks('task_failed', task, { error: 'timeout' }); + expect(msg.blocks[0].text?.text).toContain('timeout'); + }); + + test('renders task_cancelled message', () => { + const msg = renderSlackBlocks('task_cancelled', baseTask); + expect(msg.blocks[0].text?.text).toContain(':no_entry_sign:'); + }); + + test('renders task_timed_out message with duration', () => { + const task = { ...baseTask, duration_s: 28800 }; + const msg = renderSlackBlocks('task_timed_out', task); + expect(msg.blocks[0].text?.text).toContain('8h'); + }); + + test('renders session_started message', () => { + const msg = renderSlackBlocks('session_started', baseTask); + expect(msg.blocks[0].text?.text).toContain(':hourglass_flowing_sand:'); + }); + + test('renders unknown event type gracefully', () => { + const msg = renderSlackBlocks('hydration_complete', baseTask); + expect(msg.blocks[0].text?.text).toContain('hydration_complete'); + }); + + test('truncates long descriptions', () => { + const task = { ...baseTask, task_description: 'A'.repeat(300) }; + const msg = renderSlackBlocks('task_created', task); + expect(msg.blocks[0].text?.text.length).toBeLessThan(350); + expect(msg.blocks[0].text?.text).toContain('...'); + }); + + test('formats duration in hours', () => { + const task = { ...baseTask, status: TaskStatus.COMPLETED as TaskStatusType, duration_s: 3661 }; + const msg = renderSlackBlocks('task_completed', task); + expect(msg.blocks[0].text?.text).toContain('1h 1m'); + }); + + test('formats duration in minutes and seconds', () => { + const task = { ...baseTask, status: TaskStatus.COMPLETED as TaskStatusType, duration_s: 125 }; + const msg = renderSlackBlocks('task_completed', task); + expect(msg.blocks[0].text?.text).toContain('2m 5s'); + }); +}); diff --git a/cdk/test/handlers/shared/slack-verify.test.ts b/cdk/test/handlers/shared/slack-verify.test.ts new file mode 100644 index 0000000..ec7d5b3 --- /dev/null +++ b/cdk/test/handlers/shared/slack-verify.test.ts @@ -0,0 +1,75 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as crypto from 'crypto'; +import { verifySlackSignature } from '../../../src/handlers/shared/slack-verify'; + +describe('verifySlackSignature', () => { + const signingSecret = 'test-signing-secret-abc123'; + + function makeSignature(timestamp: string, body: string): string { + const basestring = `v0:${timestamp}:${body}`; + return 'v0=' + crypto.createHmac('sha256', signingSecret).update(basestring).digest('hex'); + } + + function currentTimestamp(): string { + return String(Math.floor(Date.now() / 1000)); + } + + test('accepts valid signature with current timestamp', () => { + const ts = currentTimestamp(); + const body = 'token=abc&command=/bgagent&text=help'; + const sig = makeSignature(ts, body); + + expect(verifySlackSignature(signingSecret, sig, ts, body)).toBe(true); + }); + + test('rejects invalid signature', () => { + const ts = currentTimestamp(); + const body = 'token=abc&command=/bgagent&text=help'; + const sig = 'v0=0000000000000000000000000000000000000000000000000000000000000000'; + + expect(verifySlackSignature(signingSecret, sig, ts, body)).toBe(false); + }); + + test('rejects stale timestamp (older than 5 minutes)', () => { + const staleTs = String(Math.floor(Date.now() / 1000) - 400); + const body = 'test-body'; + const sig = makeSignature(staleTs, body); + + expect(verifySlackSignature(signingSecret, sig, staleTs, body)).toBe(false); + }); + + test('rejects non-numeric timestamp', () => { + expect(verifySlackSignature(signingSecret, 'v0=abc', 'not-a-number', 'body')).toBe(false); + }); + + test('rejects signature with wrong length', () => { + const ts = currentTimestamp(); + expect(verifySlackSignature(signingSecret, 'v0=short', ts, 'body')).toBe(false); + }); + + test('rejects modified body', () => { + const ts = currentTimestamp(); + const body = 'original-body'; + const sig = makeSignature(ts, body); + + expect(verifySlackSignature(signingSecret, sig, ts, 'tampered-body')).toBe(false); + }); +}); diff --git a/cdk/test/stacks/agent.test.ts b/cdk/test/stacks/agent.test.ts index de54c29..0ece647 100644 --- a/cdk/test/stacks/agent.test.ts +++ b/cdk/test/stacks/agent.test.ts @@ -36,8 +36,9 @@ describe('AgentStack', () => { expect(template).toBeDefined(); }); - test('creates exactly 5 DynamoDB tables', () => { - template.resourceCountIs('AWS::DynamoDB::Table', 5); + test('creates exactly 7 DynamoDB tables', () => { + // task, task-events, repo, user-concurrency, webhook + slack-installation, slack-user-mapping + template.resourceCountIs('AWS::DynamoDB::Table', 7); }); test('outputs TaskTableName', () => { diff --git a/cli/package.json b/cli/package.json index de5046f..231a390 100644 --- a/cli/package.json +++ b/cli/package.json @@ -30,7 +30,9 @@ "typescript": "^5.9.3" }, "dependencies": { + "@aws-sdk/client-cloudformation": "3.1024.0", "@aws-sdk/client-cognito-identity-provider": "^3.1021.0", + "@aws-sdk/client-secrets-manager": "3.1024.0", "commander": "^14.0.3" }, "resolutions": { diff --git a/cli/src/api-client.ts b/cli/src/api-client.ts index 94939de..abce8f4 100644 --- a/cli/src/api-client.ts +++ b/cli/src/api-client.ts @@ -27,6 +27,7 @@ import { CreateWebhookRequest, CreateWebhookResponse, ErrorResponse, + SlackLinkResponse, PaginatedResponse, SuccessResponse, TaskDetail, @@ -174,4 +175,10 @@ export class ApiClient { const res = await this.request>('DELETE', `/webhooks/${encodeURIComponent(webhookId)}`); return res.data; } + + /** POST /slack/link — link a Slack account using a verification code. */ + async slackLink(code: string): Promise { + const res = await this.request>('POST', '/slack/link', { code }); + return res.data; + } } diff --git a/cli/src/bin/bgagent.ts b/cli/src/bin/bgagent.ts index 982b1ab..663f424 100644 --- a/cli/src/bin/bgagent.ts +++ b/cli/src/bin/bgagent.ts @@ -25,6 +25,7 @@ import { makeConfigureCommand } from '../commands/configure'; import { makeEventsCommand } from '../commands/events'; import { makeListCommand } from '../commands/list'; import { makeLoginCommand } from '../commands/login'; +import { makeSlackCommand } from '../commands/slack'; import { makeStatusCommand } from '../commands/status'; import { makeSubmitCommand } from '../commands/submit'; import { makeWebhookCommand } from '../commands/webhook'; @@ -53,6 +54,7 @@ program.addCommand(makeListCommand()); program.addCommand(makeStatusCommand()); program.addCommand(makeCancelCommand()); program.addCommand(makeEventsCommand()); +program.addCommand(makeSlackCommand()); program.addCommand(makeWebhookCommand()); program.parseAsync(process.argv).catch((err: unknown) => { diff --git a/cli/src/commands/slack.ts b/cli/src/commands/slack.ts new file mode 100644 index 0000000..7e201fc --- /dev/null +++ b/cli/src/commands/slack.ts @@ -0,0 +1,356 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { execSync } from 'child_process'; +import * as fs from 'fs'; +import * as path from 'path'; +import * as readline from 'readline'; +import { CloudFormationClient, DescribeStacksCommand } from '@aws-sdk/client-cloudformation'; +import { PutSecretValueCommand, SecretsManagerClient } from '@aws-sdk/client-secrets-manager'; +import { Command } from 'commander'; +import { ApiClient } from '../api-client'; +import { loadConfig } from '../config'; +import { formatJson } from '../format'; + +export function makeSlackCommand(): Command { + const slack = new Command('slack') + .description('Manage Slack integration'); + + slack.addCommand( + new Command('link') + .description('Link your Slack account using a verification code from /bgagent link') + .argument('', 'Verification code from Slack') + .option('--output ', 'Output format (text or json)', 'text') + .action(async (code: string, opts) => { + const client = new ApiClient(); + const result = await client.slackLink(code); + + if (opts.output === 'json') { + console.log(formatJson(result)); + } else { + console.log('Slack account linked successfully.'); + console.log(` Workspace: ${result.slack_team_id}`); + console.log(` User: ${result.slack_user_id}`); + console.log(` Linked at: ${result.linked_at}`); + } + }), + ); + + slack.addCommand( + new Command('setup') + .description('Create a Slack App and store credentials (interactive)') + .option('--region ', 'AWS region (defaults to configured region)') + .option('--stack-name ', 'CloudFormation stack name', 'backgroundagent-dev') + .action(async (opts) => { + const config = loadConfig(); + const region = opts.region || config.region; + + // Step 1: Fetch the manifest JSON from stack outputs. + console.log('Fetching Slack App manifest from stack outputs...\n'); + let manifestJson = await getStackOutput(region, opts.stackName, 'SlackAppManifestJson'); + + if (!manifestJson) { + console.log('Stack has not been deployed yet.'); + const shouldDeploy = await promptConfirm('Deploy now? (y/n) '); + if (shouldDeploy) { + console.log('\nDeploying stack (this may take a few minutes)...\n'); + try { + const repoRoot = findRepoRoot(); + console.log(`Deploying from ${repoRoot}\n`); + execSync('MISE_EXPERIMENTAL=1 mise run //cdk:deploy', { + cwd: repoRoot, + stdio: 'inherit', + }); + console.log(''); + manifestJson = await getStackOutput(region, opts.stackName, 'SlackAppManifestJson'); + } catch (err) { + const msg = err instanceof Error ? err.message : String(err); + console.error(`\nDeploy failed: ${msg}`); + process.exit(1); + } + } + } + + if (manifestJson) { + const createUrl = `https://api.slack.com/apps?new_app=1&manifest_json=${encodeURIComponent(manifestJson).replace(/%2F/g, '/')}`; + console.log('Open this URL to create your Slack App (all settings pre-filled):'); + console.log(` ${createUrl}\n`); + } else { + console.log('Create the app manually at https://api.slack.com/apps\n'); + } + + // Step 2: Fetch secret ARNs from stack outputs (CDK creates the placeholders). + const arns = await fetchSecretArns(region, opts.stackName); + + // Step 3: Prompt for credentials and store. + const clientId = await promptAndStoreCredentials(region, arns); + + // Step 4: Next steps. + const hasEvents = manifestJson?.includes('event_subscriptions') ?? false; + const hasInteractivity = manifestJson?.includes('interactivity') ?? false; + + console.log('Next steps:\n'); + + let step = 1; + if (!hasEvents) { + const apiBaseMatch = manifestJson?.match(/https:\/\/[^/]+\/[^/]+/); + const apiBaseUrl = apiBaseMatch ? apiBaseMatch[0] : ''; + console.log(` ${step}. In the Slack App dashboard, go to "Event Subscriptions":`); + console.log(' - Toggle ON'); + console.log(` - Request URL: ${apiBaseUrl}/slack/events`); + console.log(' - Subscribe to bot events: app_mention, message.im, app_uninstalled, tokens_revoked'); + console.log(' - Save Changes\n'); + step++; + } + if (!hasInteractivity) { + const apiBaseMatch = manifestJson?.match(/https:\/\/[^/]+\/[^/]+/); + const apiBaseUrl = apiBaseMatch ? apiBaseMatch[0] : ''; + console.log(` ${step}. Go to "Interactivity & Shortcuts":`); + console.log(' - Toggle ON'); + console.log(` - Request URL: ${apiBaseUrl}/slack/interactions`); + console.log(' - Save Changes\n'); + step++; + } + if (hasEvents) { + console.log(` ${step}. In the Slack App dashboard, go to "Event Subscriptions":`); + console.log(' - The Request URL may show "Your URL didn\'t respond" — click Retry'); + console.log(' - Wait for the green "Verified" checkmark'); + console.log(' - Click Save Changes\n'); + step++; + } + // Build the OAuth install URL using the client ID and redirect URI from the manifest. + const redirectMatch = manifestJson?.match(/"redirect_urls":\["([^"]+)"\]/); + const redirectUri = redirectMatch ? redirectMatch[1] : ''; + const scopes = 'app_mentions:read,commands,chat:write,chat:write.public,channels:read,groups:read,im:history,im:write,users:read,reactions:write'; + const installUrl = `https://slack.com/oauth/v2/authorize?client_id=${encodeURIComponent(clientId)}&scope=${encodeURIComponent(scopes)}&redirect_uri=${encodeURIComponent(redirectUri)}`; + + console.log(` ${step}. Install the app to your workspace using this link:\n`); + console.log(` ${installUrl}\n`); + console.log(' (Do NOT use the "Install App" button in the dashboard — it won\'t connect to your backend)\n'); + step++; + console.log(` ${step}. In Slack, run /bgagent link, then in your terminal: bgagent slack link \n`); + step++; + console.log(` ${step}. Try @Shoof in a channel to submit a task\n`); + console.log('If @Shoof does not respond, delete the app and re-run `bgagent slack setup`.'); + }), + ); + + return slack; +} + +// ─── Shared credential logic ───────────────────────────────────────────────── + +interface SecretArns { + signingSecretArn: string; + clientSecretArn: string; + clientIdSecretArn: string; +} + +async function fetchSecretArns(region: string, stackName: string): Promise { + const signingSecretArn = await getStackOutput(region, stackName, 'SlackSigningSecretArn'); + const clientSecretArn = await getStackOutput(region, stackName, 'SlackClientSecretArn'); + const clientIdSecretArn = await getStackOutput(region, stackName, 'SlackClientIdSecretArn'); + + if (!signingSecretArn || !clientSecretArn || !clientIdSecretArn) { + console.error('Could not find Slack secret ARNs in stack outputs. Deploy the stack first.'); + process.exit(1); + } + + return { signingSecretArn, clientSecretArn, clientIdSecretArn }; +} + +async function promptAndStoreCredentials(region: string, arns: SecretArns): Promise { + for (;;) { + console.log('Enter the credentials from Basic Information → App Credentials:\n'); + + const signingSecret = await promptSecret('Signing Secret: '); + const clientSecret = await promptSecret('Client Secret: '); + const clientId = await promptVisible('Client ID: '); + + if (!signingSecret || !clientSecret || !clientId) { + console.error('\n✗ All three values are required. Try again.\n'); + continue; + } + + let valid = true; + if (!/^[0-9a-f]{32}$/i.test(signingSecret)) { + console.error('\n✗ Signing Secret must be 32 hex characters.'); + valid = false; + } + if (!/^[0-9a-f]{32}$/i.test(clientSecret)) { + console.error('✗ Client Secret must be 32 hex characters.'); + valid = false; + } + if (!/^\d+\.\d+$/.test(clientId)) { + console.error('✗ Client ID should be numeric (e.g. 12345.67890).'); + valid = false; + } + if (!valid) { + console.error('\nCheck Basic Information → App Credentials and try again.\n'); + continue; + } + + // Store in Secrets Manager. + console.log(''); + const sm = new SecretsManagerClient({ region }); + + const secrets = [ + { id: arns.signingSecretArn, value: signingSecret, label: 'signing secret' }, + { id: arns.clientSecretArn, value: clientSecret, label: 'client secret' }, + { id: arns.clientIdSecretArn, value: clientId, label: 'client ID' }, + ]; + + for (const secret of secrets) { + await sm.send(new PutSecretValueCommand({ + SecretId: secret.id, + SecretString: secret.value, + })); + console.log(` ✓ Stored ${secret.label}`); + } + + console.log('\nCredentials stored. They are verified automatically:'); + console.log(' - Client ID & Secret: when you install the app to your workspace'); + console.log(' - Signing Secret: when @Shoof receives its first message\n'); + + return clientId; + } +} + +// ─── Prompts ───────────────────────────────────────────────────────────────── + +function promptSecret(label: string): Promise { + return new Promise((resolve, reject) => { + const rl = readline.createInterface({ + input: process.stdin, + output: process.stderr, + terminal: false, + }); + + process.stderr.write(label); + + if (process.stdin.isTTY) { + process.stdin.setRawMode(true); + process.stdin.resume(); + + let value = ''; + + const onData = (chunk: Buffer) => { + const str = chunk.toString(); + for (const char of str) { + if (char === '\n' || char === '\r') { + cleanup(); + process.stderr.write('\n'); + resolve(value.trim()); + return; + } else if (char === '\u0003') { + cleanup(); + process.stderr.write('\n'); + reject(new Error('Cancelled.')); + return; + } else if (char === '\u007f' || char === '\b') { + if (value.length > 0) { + value = value.slice(0, -1); + process.stderr.write('\b \b'); + } + } else { + value += char; + process.stderr.write('*'); + } + } + }; + + const cleanup = () => { + process.stdin.removeListener('data', onData); + process.stdin.setRawMode(false); + process.stdin.pause(); + rl.close(); + }; + + process.stdin.on('data', onData); + } else { + rl.once('line', (line) => { + rl.close(); + resolve(line.trim()); + }); + rl.once('close', () => reject(new Error('No input provided.'))); + } + }); +} + +function promptConfirm(label: string): Promise { + return new Promise((resolve) => { + const rl = readline.createInterface({ + input: process.stdin, + output: process.stderr, + }); + rl.question(label, (answer) => { + rl.close(); + resolve(answer.trim().toLowerCase().startsWith('y')); + }); + }); +} + +function promptVisible(label: string): Promise { + return new Promise((resolve) => { + const rl = readline.createInterface({ + input: process.stdin, + output: process.stderr, + }); + + rl.question(label, (answer) => { + rl.close(); + resolve(answer.trim()); + }); + }); +} + +// ─── Helpers ───────────────────────────────────────────────────────────────── + +function findRepoRoot(): string { + const startDirs = [ + process.cwd(), + path.resolve(__dirname, '..', '..', '..'), + ]; + + for (const start of startDirs) { + let dir = start; + while (true) { + if (fs.existsSync(path.join(dir, 'mise.toml')) && fs.existsSync(path.join(dir, 'cdk', 'cdk.json'))) { + return dir; + } + const parent = path.dirname(dir); + if (parent === dir) break; + dir = parent; + } + } + + throw new Error('Could not find project root. Run this command from the repository directory.'); +} + +async function getStackOutput(region: string, stackName: string, outputKey: string): Promise { + try { + const cfn = new CloudFormationClient({ region }); + const result = await cfn.send(new DescribeStacksCommand({ StackName: stackName })); + const outputs = result.Stacks?.[0]?.Outputs ?? []; + const output = outputs.find((o) => o.OutputKey === outputKey); + return output?.OutputValue ?? null; + } catch { + return null; + } +} diff --git a/cli/src/types.ts b/cli/src/types.ts index 59b7c2a..6fad422 100644 --- a/cli/src/types.ts +++ b/cli/src/types.ts @@ -134,6 +134,13 @@ export interface CreateWebhookResponse { readonly created_at: string; } +/** Slack link response from POST /v1/slack/link. */ +export interface SlackLinkResponse { + readonly slack_team_id: string; + readonly slack_user_id: string; + readonly linked_at: string; +} + /** CLI config stored in ~/.bgagent/config.json. */ export interface CliConfig { readonly api_url: string; diff --git a/cli/test/commands/slack.test.ts b/cli/test/commands/slack.test.ts new file mode 100644 index 0000000..59e8c94 --- /dev/null +++ b/cli/test/commands/slack.test.ts @@ -0,0 +1,87 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { ApiClient } from '../../src/api-client'; +import { makeSlackCommand } from '../../src/commands/slack'; + +jest.mock('../../src/api-client'); + +describe('slack command', () => { + let consoleSpy: jest.SpiedFunction; + const mockSlackLink = jest.fn(); + + beforeEach(() => { + consoleSpy = jest.spyOn(console, 'log').mockImplementation(); + mockSlackLink.mockReset(); + (ApiClient as jest.MockedClass).mockImplementation(() => ({ + createTask: jest.fn(), + listTasks: jest.fn(), + getTask: jest.fn(), + cancelTask: jest.fn(), + getTaskEvents: jest.fn(), + createWebhook: jest.fn(), + listWebhooks: jest.fn(), + revokeWebhook: jest.fn(), + slackLink: mockSlackLink, + }) as unknown as ApiClient); + }); + + afterEach(() => { + consoleSpy.mockRestore(); + }); + + describe('slack link', () => { + const linkResponse = { + slack_team_id: 'T0123ABC', + slack_user_id: 'U0456DEF', + linked_at: '2026-04-14T12:00:00Z', + }; + + test('links a Slack account with a verification code', async () => { + mockSlackLink.mockResolvedValue(linkResponse); + + const cmd = makeSlackCommand(); + await cmd.parseAsync(['node', 'test', 'link', 'A1B2C3']); + + expect(mockSlackLink).toHaveBeenCalledWith('A1B2C3'); + const calls = consoleSpy.mock.calls.map(c => c[0]) as string[]; + expect(calls.some(c => c.includes('linked successfully'))).toBe(true); + expect(calls.some(c => c.includes('T0123ABC'))).toBe(true); + expect(calls.some(c => c.includes('U0456DEF'))).toBe(true); + }); + + test('outputs JSON when --output json', async () => { + mockSlackLink.mockResolvedValue(linkResponse); + + const cmd = makeSlackCommand(); + await cmd.parseAsync(['node', 'test', 'link', 'A1B2C3', '--output', 'json']); + + expect(consoleSpy).toHaveBeenCalledWith(JSON.stringify(linkResponse, null, 2)); + }); + + test('passes the code argument to the API client', async () => { + mockSlackLink.mockResolvedValue(linkResponse); + + const cmd = makeSlackCommand(); + await cmd.parseAsync(['node', 'test', 'link', 'XYZ789']); + + expect(mockSlackLink).toHaveBeenCalledWith('XYZ789'); + }); + }); +}); diff --git a/docs/guides/DEVELOPER_GUIDE.md b/docs/guides/DEVELOPER_GUIDE.md index cbc52c3..e0bbbc0 100644 --- a/docs/guides/DEVELOPER_GUIDE.md +++ b/docs/guides/DEVELOPER_GUIDE.md @@ -42,9 +42,22 @@ After deployment, the orchestrator **pre-flight** step calls the GitHub API to v The Task API only accepts tasks for repositories that are **onboarded** — each one is a `Blueprint` construct in `cdk/src/stacks/agent.ts` that writes a `RepoConfig` row to DynamoDB. +**Quick method** — pass the repo as a CDK context variable or environment variable (no code edits needed): + +```bash +# Context variable (preferred) +MISE_EXPERIMENTAL=1 mise //cdk:deploy -- -c blueprintRepo=your-org/your-repo + +# Or environment variable +BLUEPRINT_REPO=your-org/your-repo MISE_EXPERIMENTAL=1 mise //cdk:deploy +``` + +The default is `awslabs/agent-plugins`. For a quick end-to-end test, fork that repo and pass your fork (e.g. `-c blueprintRepo=jane-doe/agent-plugins`). + +**Multiple repositories** — edit `cdk/src/stacks/agent.ts` directly: + 1. Open **`cdk/src/stacks/agent.ts`** and locate the `Blueprint` block (for example `AgentPluginsBlueprint`). -2. Set **`repo`** to your repository in **`owner/repo`** form. For a quick end-to-end test, use your **fork** of the sample plugin repo (e.g. `jane-doe/agent-plugins` after forking `awslabs/agent-plugins`). For your own services, use something like `acme/my-service`. This must match the `repo` field users pass in the CLI or API. -3. **Multiple repositories:** add another `new Blueprint(this, 'YourBlueprintId', { repo: 'owner/other-repo', repoTable: repoTable.table, ... })` and append it to the **`blueprints`** array. That array is used to aggregate per-repo **DNS egress** allowlists; skipping it can block the agent from reaching domains your Blueprint declares. +2. Add another `new Blueprint(this, 'YourBlueprintId', { repo: 'owner/other-repo', repoTable: repoTable.table, ... })` and append it to the **`blueprints`** array. That array is used to aggregate per-repo **DNS egress** allowlists; skipping it can block the agent from reaching domains your Blueprint declares. Optional per-repo overrides (same file / `Blueprint` props) include a different AgentCore **`runtimeArn`**, **`modelId`**, **`maxTurns`**, **`systemPromptOverrides`**, or a **`githubTokenSecretArn`** for a dedicated PAT. If you use a custom `runtimeArn` or secret per repo, you must also pass the corresponding ARNs into **`TaskOrchestrator`** via **`additionalRuntimeArns`** and **`additionalSecretArns`** so the orchestrator Lambda’s IAM policy allows them (see [Repo onboarding](../design/REPO_ONBOARDING.md) for the full model). @@ -142,13 +155,43 @@ You do **not** need standalone installs of Node or Yarn from nodejs.org or the Y #### One-time AWS account setup -The stack routes AgentCore Runtime traces to X-Ray, which requires CloudWatch Logs as a trace segment destination. Run this **once per account** before your first deployment: +The stack routes AgentCore Runtime traces to X-Ray, which requires CloudWatch Logs as a trace segment destination. Run these commands **once per account** before your first deployment: + +**1. Grant X-Ray permission to write to the `aws/spans` log group** via a CloudWatch Logs resource policy. The log group doesn't need to exist yet — X-Ray creates it automatically in step 2: ```bash -aws xray update-trace-segment-destination --destination CloudWatchLogs +aws logs put-resource-policy \ + --policy-name xray-spans-policy \ + --policy-document '{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Service": "xray.amazonaws.com" + }, + "Action": [ + "logs:PutLogEvents", + "logs:CreateLogStream" + ], + "Resource": "arn:aws:logs:us-east-1:*:log-group:aws/spans:*" + } + ] + }' \ + --region us-east-1 ``` -Without this, `cdk deploy` will fail with: *"X-Ray Delivery Destination is supported with CloudWatch Logs as a Trace Segment Destination."* +Replace `us-east-1` with your deployment Region if different. + +**2. Set CloudWatch Logs as the trace segment destination** (this also creates the `aws/spans` log group): + +```bash +aws xray update-trace-segment-destination --destination CloudWatchLogs --region us-east-1 +``` + +Without step 1, step 2 will fail with: *"XRay does not have permission to call PutLogEvents on the aws/spans Log Group."* Without step 2, `cdk deploy` will fail with: *"X-Ray Delivery Destination is supported with CloudWatch Logs as a Trace Segment Destination."* + +> **Note:** Do not try to create the `aws/spans` log group manually — log group names starting with `aws/` are reserved and AWS will reject the call. X-Ray creates it automatically when you run step 2. ### Set up your toolchain diff --git a/docs/guides/SLACK_SETUP_GUIDE.md b/docs/guides/SLACK_SETUP_GUIDE.md new file mode 100644 index 0000000..b56fc5c --- /dev/null +++ b/docs/guides/SLACK_SETUP_GUIDE.md @@ -0,0 +1,170 @@ +# Slack integration setup guide + +This guide walks through setting up the ABCA Slack integration. Once configured, your team can submit tasks by mentioning `@Shoof` in any channel and receive real-time notifications as tasks progress. + +## Prerequisites + +- ABCA CDK stack deployed (see [Developer guide](./DEVELOPER_GUIDE.md)) +- A Cognito user account configured (see [User guide](./USER_GUIDE.md)) +- A Slack workspace where you can install apps (use a personal free workspace if your corporate Slack restricts app installs) +- AWS CLI configured with credentials for your ABCA account + +## Quick start + +```bash +bgagent slack setup +``` + +This single command handles everything: deploying the stack (if needed), generating the Slack App manifest URL, prompting for credentials, and showing the install link. Follow the on-screen instructions. + +## How it works + +- **@Shoof mentions**: `@Shoof fix the bug in org/repo#42` submits a task. Reactions on your message show progress: :eyes: (received) → :hourglass_flowing_sand: (working) → :white_check_mark: (done) +- **DMs**: Message Shoof directly for private task submissions +- **Notifications**: Threaded messages show task_created → completed (with PR link, duration, cost). The Cancel button lets you stop a running task. +- **Multi-workspace**: Each workspace installs via OAuth and gets its own bot token + +## Step-by-step setup + +### Step 1: Run the setup wizard + +```bash +bgagent slack setup +``` + +If the stack isn't deployed yet, it will offer to deploy for you. + +### Step 2: Create the Slack App + +The wizard outputs a URL that opens Slack's "Create New App" page with everything pre-filled (scopes, events, commands, URLs). Click the link, select your workspace, and create the app. + +### Step 3: Enter credentials + +The wizard prompts for three values from your new app's **Basic Information → App Credentials** page: + +| Field | Format | +|-------|--------| +| Signing Secret | 32 hex characters | +| Client Secret | 32 hex characters | +| Client ID | Numeric (e.g. 12345.67890) | + +![App Credentials location](../imgs/find-credentials.png) + +Format validation catches obvious typos (wrong length, non-hex characters). If the format is wrong, it loops back to re-enter. Note: the actual values cannot be verified until the app is installed — if you paste the wrong secret by mistake, you'll get an error at install time. + +### Step 4: Verify Event Subscriptions + +In the Slack App dashboard, go to **Event Subscriptions**: + +![Finding Event Subscriptions](../imgs/find-even-subscriptions.png) + +1. The Request URL may show "Your URL didn't respond" — click **Retry** +2. Wait for the green "Verified" checkmark +3. Click **Save Changes** + +![Event Subscriptions before](../imgs/enable-events-before.png) + +Click **Retry** and wait for the green checkmark: + +![Event Subscriptions after](../imgs/enable-events-after.png) + +The first attempt may time out due to Lambda cold start. The retry always succeeds. + +### Step 5: Install the app + +The wizard outputs an OAuth install URL. Open it in your browser — do **not** use the "Install App" button in the Slack dashboard (it won't connect to your backend). + +After clicking **Allow**, you'll see a success page. The bot token is now stored and Shoof can respond to messages. + +### Step 6: Link your account + +In Slack: +``` +/bgagent link +``` + +In your terminal: +```bash +bgagent slack link +``` + +This one-time step connects your Slack identity to your ABCA (Cognito) account. The code expires in 10 minutes. + +### Step 7: Test it + +In any channel where Shoof is added: +``` +@Shoof fix the README typo in org/repo#1 +``` + +You should see: +- :eyes: reaction on your message immediately +- A "Task submitted" message in the thread +- :hourglass_flowing_sand: reaction when the agent starts +- :white_check_mark: reaction and "Task completed" with a View PR button when done + +## Usage + +### Submit a task + +Mention Shoof with a repo and description: +``` +@Shoof fix the login bug in org/repo#42 +@Shoof update the README in org/repo +``` + +For private submissions, DM Shoof directly: +``` +fix the login bug in org/repo#42 +``` + +### Cancel a task + +Click the **Cancel Task** button in the thread while the agent is working. + +### Get help + +``` +/bgagent help +``` + +### Slash commands + +| Command | Purpose | +|---------|---------| +| `/bgagent link` | Link your Slack account (one-time) | +| `/bgagent help` | Show usage instructions | + +## Troubleshooting + +### @Shoof doesn't respond + +1. Is Shoof added to the channel? Use `/invite @Shoof` or add via channel settings. +2. Were credentials entered correctly? Delete the app and re-run `bgagent slack setup`. +3. Check CloudWatch logs for the `SlackEventsFn` Lambda — look for "Invalid Slack event signature" (wrong signing secret). + +### "Your Slack account is not linked" + +Run `/bgagent link` in Slack, then `bgagent slack link ` in your terminal. + +### "Repository not onboarded" + +The repo must be registered with a Blueprint before submitting tasks. See the [User guide](./USER_GUIDE.md). + +### OAuth install fails (bad_client_secret) + +The credentials stored don't match your app. Delete the app and re-run `bgagent slack setup`, making sure to paste the correct values. + +### Event Subscriptions URL doesn't verify + +Click **Retry** — the first attempt times out due to Lambda cold start. The retry succeeds. + +## Multi-workspace support + +The integration supports multiple Slack workspaces. Each workspace admin opens the OAuth install URL from `bgagent slack setup` output. Per-workspace bot tokens are stored separately. Users in each workspace link their accounts independently. + +## Removing the integration + +To uninstall from a workspace: **Slack → Settings → Manage Apps → Shoof → Remove App**. The bot token is automatically scheduled for deletion. + +To remove the Slack integration from your ABCA deployment entirely, delete the Slack App and redeploy without it. diff --git a/docs/guides/USER_GUIDE.md b/docs/guides/USER_GUIDE.md index 8875133..8064580 100644 --- a/docs/guides/USER_GUIDE.md +++ b/docs/guides/USER_GUIDE.md @@ -6,11 +6,12 @@ This guide covers how to use ABCA to submit coding tasks and monitor their progr ABCA is a platform for running autonomous background coding agents on AWS. You submit a task (a GitHub repository + a task description or issue number), an agent works autonomously in an isolated environment, and delivers a pull request when done. -There are three ways to interact with the platform: +There are four ways to interact with the platform: 1. **CLI** (recommended) — The `bgagent` CLI authenticates via Cognito and calls the Task API. Handles login, token caching, and output formatting. 2. **REST API** (direct) — Call the Task API endpoints directly with a JWT token. Full validation, audit logging, and idempotency support. 3. **Webhook** — External systems (CI pipelines, GitHub Actions) can create tasks via HMAC-authenticated HTTP requests. No Cognito credentials needed; uses a shared secret per integration. +4. **Slack** — Submit tasks, check status, and receive notifications directly in Slack via the `/bgagent` slash command. See the [Slack setup guide](./SLACK_SETUP_GUIDE.md). ## Prerequisites diff --git a/docs/imgs/enable-events-after.png b/docs/imgs/enable-events-after.png new file mode 100644 index 0000000000000000000000000000000000000000..83b3a5fd189079d7f2bf535d5effc0a27ff48299 GIT binary patch literal 124204 zcmeFZWn3Iv);){{ha?0I7Tg;R5-hj{2-`{jY|UsqMvsUx*(pS9Osrvnw_Brs43QDIDY+lkr&DSe?V?ziQFc>SajEVWK+yjL=Mm{_`-ov`qT0RB+{1 z;ACE|PaS%HAJP`I$y%5eP0*!HDw+TFDs_-*A3LnR>Y1%fCC*Xcs@=DBZ{ub#Sqrr) zcp(2V^l{M|$=udb!`!}U@aE)0s(oqRWl(&q`&1o+Y4cKo#=Lual#hiC zL94ociO_pgBB5B-dqU}59m3~%g~1xN0kfsEO+JmH9mCsf zy2HZf>0@WdVrl}Tj$j}qqJWM818W7pvJdRX8iA$Wzj*^g4{RgDAi_R{fd{r=fqxiS zLKwt9wqanTVW0nNTM?G_&vW2lU;<2G5dJ(z1NeOS3kTjn=|4Z=BmH5JfW4={`(rxX zKhH)KN{9dFHrzwIU|uVUNJ#;oN(OdDMppJF)((LJm8ZY~6dOr(dl(p8s)skMlp^H; zU_z6o%3ufZ8(CfhYfEN5Lu-8_W@k&AhwH%bIr9RWmPQVGWX_frR`$Hk{N#U}!3%6Z z90rk-{c(zeIX^l0jRKj7wVe^!OJ){k7IFbpGBPqgJHz+9ilX9w76kCntZX=wE;TXs400>0dQj+5g!spo5@?Z$PZfETI2Y%)#{iZ;Cy9^N(VG z^y?qh@jYCOSHaZT$O0^CY6%QA&@=&74i*-^KkE6ful{Q3KZ>f@8`+6iTLL8=1pc~N ze-{4tFMlogN1f__)yc*FA65R_H~&`hp%1)@M)uYgjt^s~VrA+ez{UsqUx$A!rT$kj zpnn{H7W((2zm@?1&l3NB^w$#dcBa5M=sh$|fc4KB{{7gW=ktLc?)|^n!aoe{kE4L4 z383-Fb%C{q@dTr+!f&DSaG^-fVe{f0kN zq}X_P?0;q|<;hV=!AMCr*i1GMlc8Wmz@UWx?jCHqiiL|f(Vmx7p- z3x21)Wc(mS;A)?f`Q23SuJ;Ag>SkZSJ|+9z%i9E7GLAV#%l)v^u7@h_n^BxLH36HJ zf^`F(FsM?~O9LlO;RA^vM2k)^OWXOUJRGIaZ(nVXy`FN||Lm8hE5u2^Qd?iif~lq# zluzZOlL#gHaY!i>%NWUOAYOkmEaSmZ^d7*;?M67=jXPVN6>5JZ6#n&Fl1w{#5=~F{we1?*C@QzQV!MieM4*8qy2vp#%xa zMg^Eq=-6hU$QesC$ZW?anqqEFIdJ$W1vpnlQG>zMvg>yG0 zHVqZ=Z~MRvyTP{9i*46FWNYR@1BpSTeVIyfNNw#wdOy8To>rl@V z1>E!=v1Qx8tMHQqoU&J!K~Y8j-#k;P$O^DqDA*K#XWA67^g=5YW8n9HQ=2?OKFsOI zz=+=(wim*31Po64;iMTO`|n4FD534dd>d{5HhMzN{I z$$#JE|1+QeGoRl*&HraU|L1-Fw}<}!*!vhBJPZEqoHP8)TV>|ux5AQbqutVyO2>Pv zDf?9~A^{gIxfGt1+${o`nEIVa87j@Lemj-%WJOvv61s%i@MtDw;a*%u5}8g}d!r0E zjsZ?OhTr(x?+CFsw~hTe^;)>4>MsK1iR?qa4&^`bvUB0O!z2w~s4eCkjABy4EpQpY zP=spX6sQ(95quB%_PB22;&4T3{d-CjJQ8L;Q7{ezZbEVb+HYnVA=$?lu7~IZ$16lr zmDXyq(E)xoGz#2KI;QH?sZ|B@L;O#}5Gc!SSHvCp02medLgW$9ZZc*P%Kz!!y)UR( ztSXuHteHI*?Jj;tFlE+?ZsmD2GIonAU^tk&sNLctygn1h6m9< zD&21jooTHS=?u3Usj{6@;S|ZbVA=b(!>A96;4c@Ep=I$~*$Tg`^3xq=#R3lacI*4p_0HwchqNAQ=s zl@@18PJF+Gy^XU8zJ6({wxVjZMi5xp&g*cJxp_2o(-S&XT{ZqreTBT9nPdpO2*61E3!=q=OQ2Y|j+E`x4t&dThBa#0N zRD}AmTYV%>E(vbm(|<665R6v1jpjBX6~3+)rdqv4a+N$EeALs`{Hj0SUbb>AnPXKjZv9pSN*qf!ZU+?EUr>M4_b6lf{!8w+qK$x5umK3QZ{I!;F zAB0Ep1SvkoGP6pjRwGm@jDovgGZ4hod7JMG2Vb1{>YWR&V|Nkj!kxfw_4&Fzlz$xF zx;NKo)NzHeg*Ef+SG$zNfQ!Fs0iLN*Zb#u1Y&4R#b~aT6qt^+=J`k@vAzK;%{JnZk z@<+T)3Mb-^9zh>dBstgMIJQt!b_H=f4(uoX^_ri^y(5mPMOmHRW58jQ77<3>aaOQA z?R}4PhQxqzZ%Hq7o51q%;W;Nl`Ao_+&zkK0U;T_kXwl&l`9LZV9+`)JskJ$hgT-TM zMzb?~P&&%&vwgX1B;qLqP3Oi=$5Jq6?(rA6?H`E*I0C~J9{~Vx$=%j}K>R)ycx^B3;NuFU}^L#OkF{3JrigZEi8*@P;fcjC67{&Fq zWCeuyxt;awYmO5tReOdLBb|4Ny1?UP8tl&Kx9{g^5-edoGrF<3Gh|1-5=+{`81S&t zA`?Q~K*W7*S#3F^YPbHKSea0q+FJp+yv$FS>Bw}vSe@ej_FQ+B{e9@KU4M+=P33vd zta-MJN-owbYUwV5;nHC0)??>F4aL@p;S5;Zzar1c7TL|MbRMuaJ3aD{z`E=ViShct zX%!NaSr-d$R7EfJ12iO97_+=Q^T8w;&YGs(1fwK{b9AP;F6A{|0SnG<(nAb57V36&hOS&=k?0)4{I*6 z<#$sw`xc_7#SYvd(T>A|X#E!zqk{dyovn{>(piU)D^x$)uYd2E`eM9x)CUTy&aB|0 z3^zl#yEz_Ie#IsKU(pv?x!KGk9`|K%e`{TyDmLlbx|GP&<=c_~;|I$Eg$y5ph3ziE`x}a2Jf>JgG~921t27);<+r;y z(2Hq$*XColTRkDYX)Ys^B_6VxXijdN*kaI)*%mbY<^8}@i+#az-Ady@W<<1S(T^|) zzojtkM>n|~yOxN955Fh#Pz2*LMJBKt_gX`5sjts><9v~@q+8rCl~ZK2m87L(=&4S( zC*nR6u=_ifj!HH;?dxnVltBjz*tL>hn~mqw)p9lu(D2n0pLECzT#D9MO>JSH#`@Pv zcKGjw#{S6r*`G@B<^5o!qxnS7-R*PsofbT_I6oXm|+` zsLvS5umo?)<*zMfYTk5(k%EBx8I$trL$5bHQnt-fyJC%nx??GINRs3o+~ojY^2;Hv zmll&`+v6osoSr3z!N9=a5}bC@LTwPddScXcHl5K)@u@$jk(JZW)#+vNc7IQKwH8#Y zPNnue*~f2qYrKTvbZa6?2Gl&tiuLH1S%#9tTg6|+s95r~NZ@7bz`(%rjd^jxK`T;O zPs7|yKg)HO?hKdIwUbWtkFfIyxGr*m$Fw5*rBjmrg9OH5sr1(|L2+_1$Nu(;(JsI| zoT#3jrT}ZUtneI|0*)kOns;Yv`nv%qqy3^t&JF`L8wVRP9hY~csdsv9E%pMuTD0P_FnDxM#&4% zrI7CK(0S(FI81JUBxK5TnpaOYM|dS~g%3Xoj^6rW351`|d&--Q9i192MUlb1;+|Lu zSEH2{$w{Yu3 zUl>!Az22KTPG;X|SP&VCs-PwB;d*YnV~>PE#dJ4bs?D(AejIXzJY1`*TcFe2kO1QP z1>HQ2gUOBV4sx&>Qe^J2sZdX@5d4mje>3{zp2uEeKJ_XF-Q>OwGjaw)FqYzHXk2zS zCC*v@E^)TQU1sI=0c=O+2|JJbQ5{D^O9MxdmSzcan54OrRRm8_Y@d^ianhxzewIbs z(}-`>V#h)WC8$H-EgCvh^46YVMD8w;0!bKD5^&F)lP-<-a8Kz?6&^;=u+uz5V$aMm zuCn+GY3*KzU8#5o;c%I*pxRmP(WP?@AEMUNJm=*vO~cS+ zIzowgd%uNAOk;@|l8)RUVGuGp&DsWJk@s#=&eU4QxlJ!n$nzb3G^N^p2Ey%_t~Or> z7lR}`Hu3kKA)`ryU(6tm2j$3Id%k$(uo2F8Gt_aUe4a-HczySBEQVG8T8?PFeN41` zX9sCCnV$nmTrw--A!|_)X_QGM6Usm+u?9R@w!L!d^^X)GywuXv<>qmvM?=0?E_?R* z@-r_jaYPQXe__NaUwW5ZJ9VRbnTKrdXuP|%Iy_*jMGFpFLWd>Y>E9Aq^n5sJ7hmEF@%YhAL_DKa%lJmj=3IW`_I*NlsL!Pf zBB)Ad*ZegkhTCb@B|rhlG<)yj0329h|>i?v1rGYsz!yU~;o9WH=mMJ^Y`(e-9tS}))r zMS9Uxt5jvC!rAo5{}X0;*U^-(OPcH-MU*;s$uLK`->0>QHaU?@(@3B*47^(%+uH1es+ zBU`&mlhCcgqHL2NnUP$&I&18znV1qL#UKo7VItu7#4W+;d`i9G=Zsp9f-f zo+`=nuXUqG3g) zjedpZQF?m?uSZiLVE4oF`hgTU=`U);2NJ7&*edSyNAVN^&l~<-wcgIi6y{FR^*oK{Yaif-Gk(n!7XPdbd_zMO+^?N1~CBo@>q_O5Q=XZU4^D z>2fK6)V-Z`?(TF#CysR?>=5O=GKyK7*X3$6FUKYLr($|5;ukyFFwdhvni%L?Hvt8W z5EA}r8zh^wTZN(PgDK>+!Vlh_gS7!IOfmFoM?9m2Dhw_+hutbufNNQ|-vNAy${qU` zAo#;3*-Vi<^9)apff7wn<+d z+=m`0Kyv{;R2{gyNWV(9QBjCn?$tOYv6HnfqqQ5MvFU2Mh|Q?? z+2z%CS;)04?;86ANx-i`V4%ce^pYSuZnjNnlR)RBqX~4dC5{*zqCq9`lcBir=h+#& z+iDw@Zk+wS?g}i_UhS3=YOP+B`;|gJV)hb2{LOSgeggN$kUmg7$4BLYq^~+Z!J9M% zGM(o;$#DC99mn%hB6HyG;pR1Z$x#NG^!N3Q;z&pQlbpm z7!O*AZgVQ9JEXT2`j-bwZ$ziHy6BJhG2PTE2^o}T5K$?(g5S7lHHXnn?t31zIP8v( zNn8f5&`t!9de8#V@5m1ih@kU5{93>$4a+y;S!B1folRrdV6m)uw|#!WwY={FKnAqX z;!I_;0z5F3A>vq-e=A;CmJyPIi+6RImo}!a=1qTadww^b_Q}(!vC$*4O%YdGuF;D) z`be%<{wtGG?&q!N3gMcFK@!c#F`ToO&v6Sn=AY-{7FAB*OvnSMHd}mvFtlf`l%V_D z>qq)e=o{bJ($lQbEN95KSK|)=$fv_3VB(JiX7nT#8duB+`kU{?QtkWo3A%r^F&)j1Fee(#nlYFo z3frHqmPvQOkSO;Giy|)+>Bh9XJ)J=6C%hxmLoth+`tp9pSKk%-X69w+nlEQXl8}p_ zRq?$om@8^*w|FHLVsGz+0QhZ*r7FO; zw7~jQu})I2+hV*#cO8EZccV(Nj^C;$lIj8IRUsAKT58tv_`6{w^UtWOPi0GC%d0CF zXmo<+W0^D!yF-Z~OBIAe!v|28!%n%+mZP ze<#_9P-)apgdNl2BLNPVlxa&=Ln&tQjaYVZpHKp*8aI}nEZpWGw+ajJ$cve9+M6!8spD4XeYF;$gz1)V7rN=l8N@5nMs;UEsiPHeT4ptAVQKBPR(e5?rd|t0C90& zTT@itAmHfO%HTz&{LeQh%E@+q(vms)IRkZh-%}$>klgXa*syXBy3TyvsGvrE*Utnz zB=bZPN_-%~hg1Lw1i~70>w{=f%f-f75lr4XHFTm;&AwrM7PRp8`jU0*HZAIY(s%3* zx_;+~j>R<;vRz}@LVebjjD$8M^uhv9_H|2rDc82Bn?|!|>j5I+n?MI$-vzm13+uRw zg|Jg4FMZzY6Vs91w=tg57c*5sBlMfxn50?NpT#?Ea0j;(x6)!(LAHa&+)TkuhCkxS;A5`(7S(2PN87|m ze%oP6s9#C$n0O9QE7Cx5#&L06V}8go=?sD4_GfV&TbV zCX3)N@Q|BYfvpVcRx(=n-8yNacan5HF|S*CwSyG$_TAhjH8|g7qgh^N%BORHHtBpX zdJqzCxR-ase_si;*i6v#4z56L-$!gGo^|2+ zYa3>?3)ifTudZ_yzHx7|6u?OAIkh;WZ4BoG6Y<+Ai+{$C*ohm6qLKRs#I1c7wkvD( z>uE|#t1BffjG+I_R|u`5L}R3DeZHBB96X%cT#(!y#_2COKt$I~ryy~Wq9%+@_q0%_ z0W+eYooHEJTr(z=mCwFid*5SrXb|M$+}!QKXx!nvAm0+*)_LL5q1#6F$$RpQty@Dd z5LQ$e(S)%|7&Q*|PFQ#2(x*R}N9j^kc4>shjki%yDJ9)TZ@n}AcPbVx&bt<&7%bsmh@z2~E{k)MYH--h z2INC$9slL=Sm4T&`(x>Xi3DsJsm&laqf(o9mt-y_j>dG6ugd6^8iI$Vj(Z(Pb<>4Y zxo^YJlR2c{NfFA}ZG3&J-U5kH4vaEApk?SSM!fAX(<|!0zKug2LfD3l--1|oyCI^T z*P-Ad(koVddd8@r!1TDvX+cLKEy8NE17o3iX6n#(sa;I?JMV)eNBF1Ow#@BD-f&3)Qx3e?3hOUsk3gnyocP>u z7=)&uo9nqdN$CW=^>Jv)$(hy8dRu8VrEoxsku&#vA?#BEV#*Fn-hB&))w6WkB9$RQ z+PeoqiE-q6k@9faq?eY6N-4XFh01ho^rPi99nXx5`r}zCsGp^awU@(mR_(X@p$2&=?U6rFHEj#by>4Ed6V9)>P8w>I%NR2A@S-MFy z`}+6Zp#t5W9L$g??}AApn2DQO`6$y<;ReuuYz(|ju5>dQDP%YD$lZOp5f!-ViQ)a?deb}9j1bITH>N}h=Qh59`F$4tEO0_m6 zo-llCL@Ab*(b5(kFFSU`_jq>?+lG25hX$%&i!oW6(6SFnBw5(4usYgdALOM^Q!Blp z_)%Wo@(WFjiBNvzs%Ow}2?Rq#p}AH=g_h3|JT*%D6Ghl`>=G>a%U?}ZKXxFz`9Lz? z-LPGEI}n-R12yT{5F5$aE-A^1@en-{BLJo^@4MHBG_5L&w+Y!(;hQ7wAavztXctXC zu0!G#AenqXH0x_IYqRt|kOf(lE1*-0TQTcBM)&G|%W-M4fXDP9SOfE;ZqG~08|$CJ zaf}h2!MN8dw_8PJxUvhFl$_?H4t#tECElS+=qFU+oaU+o9M0idkju3eq|eO&e|qW1 z`itO;j1{G-SOdgN-*W!#^;DC!u|n@4xM0%wn5Hk(*Ucb@8?q)er66APRR&rf%ac=6 z0P}`!xWJvHc&ORq`U6z)-IKJ{Rj-cd%hh3S;sqc?RVtUClpyt3{Zi&MU1dr!RcSQR z_~Q1Z$xy4ct03ESrBN{Y^Rv`-J}%4YRa4mKg9N$yU&l){(Qwx*P#J}3WaHmqD9-Fo zS0AH&LE<|Z5(({nb%Cv|PpjJe&4po6*9e%!bTacKi7vt%BefgJ?>jk_a%Dq%@7Rpo zwUxMI0`z{lbAhkZ-<2?T3^{qy?iEJ zo+ZItTp42lC-ZTKr?RNikMZ@}g{IX=8H91804&loo{2|D<}&6VmpTGu(gb>vQZ+~F zENeM$!Z1CqE$w4$&G{};-3zakLSqAH-6pKGOMZw6DrZ)3Cn>4JR?gq?je`%T1(>ONA>23lgdtaS>MYD3>mH>&&` zOtYSg0oY*WJqwpS`S=kzfM#Cn*^`$}o4@n;*@i@-Jkm5%W4RrzT-`IvW4{J~)#wMp zlSy{0(aE~LvH7~nt^0H4<4=ff$*Z+EP?Tra_4ezk0fQ;8^3K}E=oPkFjA^ItZ;s_n zhqD7YtcE9DCyk$z(vROYkJF&PGU|&yMKky%*D198bVIo|;e>#T%@#IWXu$aPFiV+P zM_dDl72%AJAwjl%>nK2)?F1?46`)0%n?m3lKKdRD8-~Pt@ij_b+DSwzdRVc+!Bo9r z)X9|(!ux+a5HN8EO|CVA9w+@T%!0Yq# zSKrI{!-!u|5At6py8~>5Vu=Q4b-Mg_A|9jdnvzPFk@pFFMwJ!|AKIh|ERO&wW)Ejh z*%MG~?-`qfouKZWyU*B8Mt&`7ud{iFW={2zG?~a1`cZSmryr^OZiek&Q517!3D~!~ zDFkAHEJV?*R1~$8Ul7h}gapak;Lx^a-&mu**d8=~-N#@HO+-@ILggF^a|Udy|B%QD zWnz0NTGdo+4A~ioIZB@(3-xFLY63d7e9;rRr=s5(YD>?R+|}sbzWf$F z)+vGPaZr&4p9-n3sZh(s(*oy07dY(7HVt0r%q4A0r}DWNp6|_-cD4l_>LA9}cwC)D zywaF`VPf5Qb94;y5d^^n_tGilW;ei{WCk-wKBrd>&%qqI_z|`!F;36#b`ov7(oM&p zN-K(ld35T1wGD#yieL$3hl;}~4!w#?KyBODfNdkY`uJkfAgrek1l_Tr zT=Ug&Jrv6+Ke77>ptEm4mZBiD(0nWT7zq&^-oAA@IOf?vFStEcMgxG4BRh?*Uj*io z0JM_bney33`(bsa9dITCXbN(+G9`f-1f4cmW$11LDY_Ma4;cM4Z-@tydA>9q@4f1s z?w9FYoUoa6>xf?H0zwlPsb#`EeZQciu?bzN%cC{z6)@Jjw#-0m8tDjfvEsHTGhNS| zWb3;e+>8B5KCkws$gmPz_DHt*aGJhOU;MB#lxu0yYkg5q^vbF@agUgh0!$Hh;rx*g zNPf3bhiJId9%h7}k}FJi6k;pZT4|3>_^6N@10iOr^D>HoH}id&n@(>l_kX!-7^S6| z2?t$cGFDnqXzcUzz3}f8SE#w^c~y(a++4lyaH`yjFKMb{L9sQyBR5|ad(>mYkz0{| zwu_8SOBXf3knfE=w_F#bR?r&0_S+C?2oFWe*R6NpI3d(0xR?5P}sPs2o^ zN?#f821SWR^%2@RA&g-BLCn?EdYV+!Ok%!Y-R!Wi>144w`=#@0H=E@ZNBvr?=4@uJ z26t(28T3-)9nLo8#`YlJ^=C$KozR$AxA!S~u^)|GVt#SKlR>HUkIV|?UR8~aDZTLP zzU2Qc1@}hgo3AV3DA~A|!=uFrLzIUZk4u^NR4GS(D~T@nDWriG5UT4V? z<}@bFmpxHj^0Sw9U-|8CuTCq0bnKc&rt{(Q)6c^s6C_uH?w|C%b27z(3*E~XpZNXC zkqQ5)8;V2BpfpM(L*b|^Ep#w-RvW$X(eJ%3Cs?>DISbVnzPz;SL-J*`)fWrcgM~}M zM4!xuc~g95Z23QxzQZiu8A{N|w`h5}ON3pjW4z-nZ>GoURO}4D6Gr$D^Fc(#L5a+1 z18F<)q`A!_Mev%tU2DS>zUupGgWYx2Oa&k%D+Noq~6dVP<-J~5K2E<^GJMCG`|0Cx3i&FB&Cx=-} zR4p%=u6eC$sSPrBvWx-pczvl9NUH}uD|WpHN>YKC-hDveJ;nAuwy5%FG@z4^>}m4L zw#azuKRC4fgXe|43g9A*B>uYUzjHL+2$V26&vC3#CJ#`+YYr%2W7WS=+mpQpRuLqU zVGNl4lB@q~Fonn;RPs+WQyhP*lJ`b<0SNMaI5>)aCu9?X3w+T2i&{92|GqU(KLV0{ zl;NRb>i=XX{tdrTk^`24T`{I^{F?!WeJc4Fkc3f7ihN1@#Y6wK8~zCxz&Br2jZ^;T zQ=q#(iqBhgOQvV!lNI{O+Jn%FDo%_1fndv)iM!z%>j=Q=yK>w%>gd9#^qBe3 z6Hk`~(3#FFAwQUkyJydLrYQEC&r^f60o{@5SYb>zAocmMG4x`p$}~#LaZLrFLImnJ zGJ`Wc6;of(BS7wNoh|`(Hrs5hkaZ%oPFy~j`^Dw)x_r&v1Aii$%>B00e6l=4xk#01 zih~Yk2~Z}eOrU+AXm)ezNd#C0IsWu}7y>S3?s><@KV)s*1tL1n_~dLZvBaCP8^5T z?Br951L{X#0E`1+l(o$y&f{XE4xwOE zOD+g_7y+shYTQ|_tJ7`cJ$niWa?|nmS6doFftpn&FGLnd61V(x%inpU-<#CkoKEPP zp?`)m`kt&V4G7dq8~1oO$4in{dt>^_k{<*MF3m!Egfgf@fB>U!m`X-Dfz)*)BcDzP zAmOkG1R+hlgQr|t``yT}*Jry?I?b*3WIAGX2QaFpRq_2O`>4Lg;6s}^Gse)L)I&>-}JZ;zqba^_`+{+@^T8Wol0WBlt|u#5Gio88f> z)CB75Kpy)p^y7n=dKlcQQPeKcj9Mz=;Iz@p=MdpcYvWw1Gv;Va}KZApg> zK)RVQ!MnODXk&9jKnIKvTIekhGD^3p*UD*M0vy+dl(5c*oI~uVYl1xzVQ#2=MDAo-2p}zhkAF0oCr{cIjQR&c<$whb0fI(tmKdB!+-UqX_oF~X z>e;zFs{-xDno@etm1vk~k_Sl>y+=`_hE&&Q0%CKYbuB+soYlNEh+=n+9O{(|Ry zOkSF+1}0%_O!)O)qr8VnzbWk@tv5<*<<80z(jrN~CB(GcUP%L)?zQD$5N2|?1pHHQ zl}SX?*|fQ0v9m2H+KpErxpTR4Ph{oD0Rc*nE}3VcoG)ZEC(dwo(zcLslRX4~MnefXr7^%P8)%eeEmws=6d*2UI#bGo^vV0( zAwCKvEiAYti1GW1c8%p6?!L;qOD2Q^*1;loz9R#pF%;7D@>K_5b#m7? zK+lws!=A?#8|tn(OoFt@0zWtxVLv3bb{Hul?EZ|utCctGg4+69jy;deha z4S|&lhJeyk(ROhg-^zNUapF-#XE~fLRY+&{HWd8q;)qDls)>G@34;)M)?~^E zh^^i$z*Atxq)}u3b9uK=;p22H1-zXw{2@hk>afMM1EzAqX`Yv+S@ z<5kn%U|?VT^S1y13Onv;GFDe#{uv&4_~5x8U6s`lu2+TIit@m^ zXiQ-vRXlD56j=!Cb!_J`!w2L3udg%Pg_$M8Tr(h@LAX(DMt#W1ZH*{fVKH|HY!)hj z3h@Jwz6Dg-P~=>L7?7^ct@ta_+MBudx5iCEK!`7mNz9jhW2Bd(TpXX6yt4q+tGOiSO;u)DXh&fc^!}`IwJ%Nn6y;(_R_;I# zE(ovOcb^Sh(^{5L4Mpq~$&>JuO=E73ZmFs2?bt+AI5#d{ExhKx`WD$KV+eQ;yF)5G zG)BRpycgiddiUP9X3xie>Re%vXARy~-O%Jnwo89OL`}XI%3?b@z}juFTa$K7!3C*m zmC|{HeB2Ir0*RC-5?or^xqI7+e@->~YEfWy+Pn;Bc7?h5MDhOH6J(TX(56z>8&-bz zv0fFslgYPZX+wFl?uJ_q-Vn!yiUl-Q%csF%J2O!EIhwv`I_wkawhTUNg>gxFtocJv z-GDj)@-@8Y9!Tf;Dn)7qcRt2+rBr#_BO!vSZn}rtsA~(4&-VebH2r;()u9LmR$f}# zEmV`3HjSL_;5cX-lL0eJ+h$h}(Yn!*a4+TH9{JF<3=scDH=HlKR-Bv1L>z*m&FLa1 zddHdCJgdCP(FUBq>_uv=9>%Q%nLbv+B$@q5GEOjvH88_@E_ z*@BoAvp;P$$`y?uDKS?e9f?3ib?R`NzJZ{3nVD@gWl4T#Q|!hA#mvoLufH&jUi-Jm z72l$s+C2}8_d70s((h=#yRwnxe2z?6S2|SlxYi9L{+(8U`Qo=96uqQOrGKRAIL$BK zir)(hj==TJ0oodM?LlYb`hw{<5Yl*s*fl}sIDWTt$qXOAQGAx6)6)8xeV4YDi48W_ z+f!H2d19Jo69BII>OBW9n}fMKyYV-Hbnce+P!GLEp0}>nt{u|gg3t>53I8k}FpaDA zIJE-~!Ple3jGfqtlpWxH~tSjt=_$@y%TYT6BPBUh@KNG+&>b zxp}wBoPT;kvAUaKT?CtZ>!6@~MmnU+M6D<2e+zqy6hEE^XpNMxp5-|^e|y=ydxK{} z>-MuhWd*y$cn}ZWZ|Z4*+wp+^V2wPYuMZNbv%;8+1ku%*0_T|2KGKz6yZ%u6>)!jM zC^&?>MIGluLDo47@%?0x8YqDU;zM|%IT(D@VlIpKfpArVo^<;X z&eE6l=0gY(&#?8FY7@6U%;%cXAZBwNuu8oy6e4|Sj?sMvOpmm_0q7ry97KAi3yl~! zy^?@LfTA5H$E1fpdVMh&tPy zxki6RF(!EGasqmkUq%=^2BgwYx3NPAIU`^DBGuDx=gB3|H@lsGNbU_r6ummxT`>#v zhn)fvBxPC}CTT4Vvd%r5&ejqxfPUR0w_y{4EcUZkg<&kfAM@Nn0iH7j*H_{M;~U^H zL4fJhPm51)^?>KydA4L6)7swk)7LqCblT*x5HH#mKYe37ChO z&v_mXa3LxsRofwSmxp%&sil%1hTn!>JfyrYKkBuH)^u)lf9S%8nJ6{TlDNG_Dmggj z2{fWfZuw|o<4MSCn7?R%*K36neeR7!5}ua|>CKY|uOLj1dmshb&!Sbpv1^qALWYrj z!jIObRR-yJK?-SH3bc!<=v3ETAl@%sXxR+M<5*MVt zbNquY*_>|H91+5}v~O4Rqnqn~f!?|=b^xNq`oUXQj;YQGdeqBcMjehh0=?Myga~qk zPAv7@GHcXH@;dDmXX@4b7#ZZ-jS>x;00OYw*__3!gJ4k0#)NUkq|4@7+=J#qV6%Bo z2sUsX^{U-z0YVe@!DZBZIDNSdiKSGtyz2ZFSWKTtyV`8g4L;QXTxSNvGLUug1rPhy zB*g+dDyTsZ;ycFKQp;DI0^Rlp*A)viabNjDvA#T}q1p>ku~v5M>^5WKcRf)!w`mSr zAdR~>nNt~zw@D4V;yvUgIpnGDlcSwrdUhW60WwMy(5A~Ffba@M;OpWoBB}fVtNHM% zl)#Sz;CFBQ@PL?z2XgL#@AvLS+1Yv3xm1=@IOvL~Yr%55=1K7(%T?bGftB^`(nh(K zyPxK#tQui>txslDy~8GS%1-QVHVW#uja~BhImeF?r!miTNN7QzZXI@am=)ru=cnpl zjHLpfQV~Thd0gJfofjE^571^)5C9Bii#;Z2g9UDIC{W@U``}#GM&6-NsM*=~N}kq3 zEv;idcPVtxp+ye5)TH!k%@`v|z_MX+9=^@T0{>MV%DnYSdn^M)bIF+U$@gQH**ya)NILrG38?7dj3Rj-{R)zG}mni1qmbRZZ%JI!-^D9hQE&9k8nICO3?OV`2 zEND?|S`>ppvl4Pa41W0GpaNK0o%T#7xAR>UY4np9V>F*3M%9%a0bcKGx$Jka@h1h2 zzEPMdAhv)V(sgcKx28Wvx&k5mFrdCUHqWnSHmLae zQmNx?cPaGF)fai6!Q<)mxF8r7j0n%rgpiSD z+O^S9zWVxlkpjN=<2Lf{(3mO?pJc~oTNV0YO=#~J)Tn--J^9g)d@KL zBpi&I30X&Zbols!>+3PT=OoGHp`^=3TL7amh9!G41hS^0mbh~g-x@eqaj&`W!t`S6 zkrB)@frj}9F6rt5HHVi`kOlX(=eUnKHoNX0E7GXC&}_)O;fT?;g|_Ck)c6M-ZzQ#4 zGISU=W}L+hy5!OYP`0g@6xcYd=Vz56nQ4n1+^G!Z$^kg&(d1Fom-H46S2ms*++St5 zrx87H&n3a}rVK7xMWE)3$iqWD8_B$OSvV#IWk4w=G`H>mu7lE&9$Efq@~cdi@D$he zHTD6{llaE$PC0W1SdznHWRYCi7FRl(`+SWV(!5Zs6c>dj^BN3~Hf|CU0 zv_b6l5cb(F{N|xM7AY?M&;=4APFFXOBh_AjtXq->zjH_E#z!0!``pH2)yA1_45yb2 zzs5VC0f(ZM;0Ve7LfG*Fqqy$W4S(8pvDKTNCzTZ6ZCT6tk!H769qxYPd5ciq+m##1 zrU?XIDcbWRp-UH@@j6=y91H`J&uw!E{)`#`|CBqewy){gMl^^f2`ncp3Fx=f0-b+o zQuCPgIvUwcL1K?crW|cCA7mIc4&^7Uy_IZMYFr~NIIu|#h`@(tkVFjWi3TAZ2in7R ziLmvQyGpYalaHnyD&$Qf;|IT>!U42zw{rlh*vijXlw`{l%P$Aki_j3Dl4}-bQyRRp z$Zaed(+(Jdbo0K!p90$(_GNIHfAS>bS8ORmFkx!yh% z0TwlT18d5Q9) zpxjCYvp$w(D?W|nb=ZhEq@8mpzY0;lud1N}$Iz?OqwIW!jpW7JLd6{y&}+K5jP6u; zN*zP1BRrO+I-ns?{N#zp7hvV2R2O}*z-GAtdV1s#9w)p=V1glS*?{w+9<5GfIH;7g z2;64{{(pR(bzB@@o8^OB;|@WBy9Ny|2@b(s0|W@}?(PH)PJ#p{xYKBGhu{|6wSh*q z_|44jyYKGIf54}qs9U$H?tPwfzK5$!2-GK$l+U90O~}eA$%OOE9NfMkAlURI@4@-~ zEv5838yvqe>2c)E90X&g$Kws}B}cNv4yTO;u*~D!BBBsV0wH8yR}a;?RV*?oU0crz z8$JK-RY|8M4$l8k)%mn2gmi+2T>F$CZv*y)g-{rXR{!Ga7rp|PA97QVZQ7HjZ-l>= zA7fh^No0WajI_dncn4L2=r(k#QBUlfFbk9nT3zbNFY0VrnGa&U^G&S2{WuN%{b{m5 zS{86R89Qb2IH#JeZUDPBt>x(nw=j(`Pd2lOgXx^PhQ5aLP3!(_VedHQW>Ba{5~n%; zptgW+AEU+r$$VSaM+n-o+EI{Sfxvf6#SE@Kdep@}mAdrtPeSuYrVO9HRGMfo_of3^fn!Ee46di z>pIv=>tB&ddX@&yvM&;w^@LOS{VArnlX6-BJBz1*tM#v<3kPhP{7teVq1-v5VG?3} zeV1prW+P!xoC~mTkFH%O$N<*Czn@z%4WV<-h6s~LErcwW`KG+%;Xx>2Nv3XYir2GdG@v-$xbY7+DY;GB^3j$CliEqihZw z2>M_1cBQizX=1oo05Xy7NA0*m5=Le5n0xS)yk>>i!80Lb$58DXM>=HhJQD5~<&NL> z&Pu1rIR6gAyy^O!*m9r0#Xk`4o@!O+s@{~rKw}NesV{&36ng#y)PGzEWcxqt{E)+E z&e+c4Gz$Z6V(sSeOGDf}ukPmV=Cs3KVHY+GFrzm3r(#M$H(cfUic0HI=h0uabL&0U zrcHf!#l0RvFUD{qJ8W#H9R@60{D9?E2e7=dLMH|M&$WsmNw&i`owkRqm5qrf-r;$QjcL@h|?hw@fs1YG7;V; z9Jp5ji@^k=(Zi4mcOg+T{4B@$=~M10XsetpIQwN7kRU=qT}S8F>xSWG3Gv|bAyLf( z%3PzXic(-HeD}R_4opU+iv;I^;;hO*O^ygrA~>czqC{+X`bMATN#zK9V>hH}v^iP2N4VB$-zI3M z9I3o+imWGd%thBMKMsV-Gx(zHzAXy*=GtStq6jK`!%dDC29BsN4`T+2_9c&@vHP`D zTz}yA1$8ERtx~dI5&E(nUWb~w1>$@hsAm>))vss^g`HLe$@6hj(9`Nc=v&LSn&^%w z(91nV=8ie>F^8}!Sf&Ol<~{N{;xGwXl=2zGs29d3{XY^gBue57sa=I*_&B(#Wo>Tb zNAYHj-!JzISG~U`VR|ix2zAy@Lxa$)%+1=BTKMJloXhCTC$?y+kgs&q+suP2ziZ>` z_h0D^@aH1}V^NT$@_G^aON9NTxrOc4120Mp8wo>@;*cG$xBu#jhCy_hMj#YDSy~B| zIy=`DWYXzRLXf-j0nO}2qRWY2IJ08QunZOt!n0DGFXToVe8466xVaT)Vg5{M78{S5 zFGzmEYKQX^8g?xR_WVj3-;{#1k=SJC_&gbfn~X%EUPqK_zjM2F;^zJ?PVKA)k)m!H z^tR*n0qtwmw66iP80Q!#LG5fYufOA3_oG}R_DP}=g#X8^qp^@FAv45b)dto;d1H0> z*c`)ctvXB#lqb``Jdlva87)mV@GgRLTF!O}9sf!oc0u!iU&LCwYDK2~QmWuocj;}` zc}8XJl6}+ZjNRSAnGAy%P*r(v`e4zXwk7D|%{S$`!;bO?}Up;d1WuWW2A&hRZjyy{p!X$Uw92H?$)O0c}?m1vwSrts5@%QUKY{M+^n zq9f~;IiCGlyk>~Hyd2V_OzBU~fJIGa!O6S=yu*91N!GLb27dZA9P8Lbot0XkG6#L2 z*&!-EQ;DR*u(42iRzY*v@shX5)1bdnOTX+-xX9slhFGgW)^DxTpGi zDuolTd8;b`kK*j>S8Sy4X4cPOV`<732LATzjQ+YN+_cmi<5xy@SX&7C>*I^E7UMa# zBJMz!%~Hu%dRfLuenX#G$=n^aRzxz`Glzd0Ux}!n!Y&%JL7Xq$ShEVbM|(~IT+u3( zdgXR839Gm33}LFWAcPhoRL$*+9-9t9a-aLnaYd44CoucpessbIOzNj<_wb)TC;x3xt6S;Mv)h&6znDzAjw<)!{;~FXg|C||UTU)i!K|D; z!031FxJYr)uGvG_&r>4ECh!06eQFrted>A8;gG1&s!!Ov3bgs? zxQH5cz|VSBsSDCnuHu7>jSWL5{kF|*;iQ9kXZzvMmuA_!*+@JXG@&+&9$Gk(`EH!O z-h`!~8x;C$hExBucuYKnDFf9^!&5jyRdpUI{FZW~4PTafj?9&Tf#JjZ%M9E>cWavr z>SnToOAeeZK5yafS(87PTYjc5J!rF5z~H{3E&}ePu-o%6@c`O>k4|0Da6UNVXJ=u# zzr{=q>cHt?xD3`(al#kBd$0%TRp_*9NMQ@vlGE%qc}phGH=rMeQ!DhYiq`CZT+~>C z*3!>#5dxjv4q>rxn(|Ndv{IM9v>mlZE>VgPggdFoQ%aY{nLV2{NZlwNVZg>!WH{_vagPEzM^RX8phUMSW}heA3dCH1=-dRJech!Tm-9`qJaI@-YLNes!+rimUFXi5D)qFXpUB^TD zv&f&1qv9JoH!x`1-5=u0s@Q%;Mc`XYrijh+ja3;vHR{|8jo}}TXR3Jaxp>eW5Hj4- zV$hsblrIe}5`?8>?l0j{%&t%KktFFp3aJ=ewZC#q+A2OpSdYaYuV43?K?U8)y5QUz zg;C}_l|(;&)_>VOGQ?|v!}Vj%DYphW1Amyld494W3n+$upx4bIK zK0-i6CQ=uKh$g-dMc*_5AsOAY8=jae5+vFl-XgINYu5PnPRMy2o*OrE<{W-zAwux4 zzRe2>Rje2fFuth0zX>sdIMC=qVjcRa6Wi?aKl$%0SmG6Ahh3m;ahnlD5OJ%hYj-|9 z`rPYru)H`$S1*qr2W&*uyw>hX_eA17>`sLek6K%V0*7!u z`xH%wLl3XB1(z?I3Nf!ei6YN4+Z7n|d#ZE4LapM(!s@gN_hymHY&VOl2t~Mx1_Ua* zV%X2`L($_JzT)y<&6)b{PnaY=U8@$Uj7NHzCHy>$_c7)%HRz>FZ>tD);2*}+kQlX` z?pNGltk)qi8(Fc+=0O)^)i8%5_Y{$4#y)bAo621Uzjqtc0}$W ztT67=_sOtb{!z31MH{4d*^$8H+EAW4u+(73jRv#rQhzY}X>gNv2xp(%%n?qgE`O#s zpd65GTIe74zmHCFYO>Y;({pVn?9RVL6thJ;=1@zii9r-W@>Hfi_aXi@zE2wp&Anfk zk#>*n9iklJ2xpmjd>T|aznkzR^WIFAWA~C|URR4*@^KRGjwQWQtW=|nfMYlqY3$ub zyoJs+&u4`NwfUch`c!kdd@x{7{?8gCn8ZR-t9%53Xf*c=X0~X)!j#$d_6S4t$!0Zw z#w&b@qbkHqeF=bPgXrqcTY`ue#{vhR=VShOT zdAs>2wyHFvwi%Jd!e|h&khU+S_w}sS_KL}ADJH*1PM0;ugnUh!a|r2&dEC3M0yced zUx%t53W8VJoW5bY`DCb)$mO>-q}-aznwJAetEVd ztAX3(A{Pa=HDZ|keECrw&s2~8vd^L4V&w=cpzry&5@n1UF@>)ZMsj%cSaG6=`Mj`M zeDrIW=7L}%YcL7+q`Xa+%}zxPFQ+I3v5eA&8IKFo3`&D~+UF#EDQX&IOCV0gUY_VZ zNQ6STnw9!L`=yOBZm@dhi*^5^Qgj)oM90Udut>s0Nq?<=RZLL95W4-HvtAzw>CvYB zS!d0&JZp15V+)>g>U2hF_Y8;NKcAC#ZEcc&rX6zOkARkVJuXUhd`cF&KNqYGPQ*1r z*S8Ttd`A0@wmHeTB@dPL@w0(a#Lpfjhx>7HD5eZp%wHvRZdz*!*1URDag0_ugsD`6 z@Ez-qmh08*5g$pdMM(K<-;SFhJHoR8yP?YgYiSLfP~(!RCk<8(+j6e@7apeN3R52DkLsO)vc$_Rd({auKf zcsem|ajE86eu)V3Wqt9adJ0<8rix`fRM&@dY2~SXO}VrKSel);%(mJO#dX?HdtIMZ z?Iqap{=bW`>>3F;T4@}a-KDSUZ&_NHGZr*!?DNopn1amDT5zHrjq-C-mIF&{S^9FLTBr6 zu+ma(G4n^)Xm#;|;^GneV2FFmS~Z42X~B3FCpQfOgGfwI?Bueiv-!%RYmi_53JZS< zoEqEpK(oVu;qSFGvM)JwvPm>6(i@5aJxwz5P23iy=N;JlhXfFcCZtle);O+&01d}` z(0<`AnlMj)KxY$#UB5}?`VGTh&XpDGP*M)Z7&6ecFO4eX!ogvE3llHT!|2g*A-+id z+fTJIW&bJw579LWf}hK7(%O`iizgRWCz{&#M$tEu+FB*v?9~?-L;wVZD0(qnBn%rlDL6Vp zKBUSZcAiKujxHp+^USe!rA+bpzBNM@nRIfm^$i|%2@T`55}A7bmqf|`oN1XAM9Z{+ z5m?BlxSyq>5^lI^l+=a6Bj=8Zi=Kc)f;cXZc93x zC-rgpb$c+{XPjUug}NOto71uD)4I`2|R-@sMwJH1uL?;WpcJ0G7iFC5Drslilm)4x^q+>SdY z=*v&2%eRBZ8CjlcfdV%%pI_E~C!ymi;D;pPIJ}+XU2U-~!-%^x($+h~q}Rky*|YW+ zpR?-vsgsY>$F98vhVgUyHSM%kSER^hP(846pLCs7(>+mPXZ7f5W*epYNQLvuwgz`8QTw(|4CEm_F)C zcxJ=b`oFXui=5bW+hlx=r{$PO_GHFbgVl1*@!TXsNk=ww1P&i1Iq)c6;4Z!h<4m_} z4@Z~de^2ZENu!f15;AHnsCa50)9Sefl+usgmj;uaeZa56(r^g;u zB()|Fk)aXQc{u$=WzYJoq7NL(9i*2A3eBILO2dU&{z4L;TOFf%+m{XLs-PY@Vu>gj z+}?5bp-`5#frI^1p!~1(QygxkFGb+Hsi*Ub#6hPfx$^%;n zXtU%3=8orQU_1xx^OF;;WGDq*l<*%ILbg=icXeY1S#2!RXXt5a`qSQqMBpC(HoK<_BN*#qKw_BR6j@Bmwp1Yl* zBa+Fo+PVty&?QSL3WJxa*q+^GbCt$>ZfI58-_X zA%&L5d7ws#TX(!uPm6|p%_gCUpf>BbYvA2i?^F%#oeaicpsR*;vyM*TEE1)o*X$IZ zs~aptyJU)bJy=kZW8fY7m&f7BK3$U+ho+H}>II zHsLtp0uEBf`g^C{I1ofKzu&fD4Odn!S*KAgLU3fyvdTy0x$=#JpBd(e08@$9mX8m;^vIQva20QaR8N}Io;l<4lt*O=YCv|603SL z>{0omXCRs9yMaprE1LJ&rrpa2(9(Uk;Gq}<-dhxX{*32JWTTL}zyCB|q_IV7m5gC) zszM`s`U92Qfu>4XQjfL6NmetA%{hQW`!-8c+#kJ`nzp4Ww4eN00SnTJz#m(?Xmyv<|AsgNwY0E z9YfSZO8p`3t-My1pRhA2X-j*xu*+|ihaaWMjB5Q?XgpR^G~3L7D#WVoCYa^6TB>vl zOZ8@|yWy^B6(-9+UbeZyK3rQrYno(p$VF1$wMD98_Y4uFN-W}h8F4pDKK*OV&0_Kq zc9Z<%>Q}{O9h*;aPuo+!sc4mn!p9l5SJf9z92DnA*I`s;I<*!|L}jfK=e5RQpZYbR z{PTfg^4x`W;gIxmr|Py`SfQ^Ue&4+iN-|w)+=d8rF4KN63ZFTNmB1&>27Eacz21|V zvuM~U?&~bh%5LTQx-54gUgSXrDf|&FbZPY3PV;UglTTT(27`9`VtYIuJ=hh^SXApj zCdbX;ymB4>{-tn^7MiN*$1Ej?yDEbNsAKUMb{h-+DcPhwlYk}*k|?t}++$*u-2yN~ zoicb1+cYevm)I2i=kILH8FTPIk4uJQ{FIy%a#@yneE;k8eW`-o-H+aP^{!#sl)|t> z9v8V2E+}^6Ju)$C%YQht;JaVUI{a6#Kl-B17l-V-0$?gNwO{=EKh=ZT3tsBUe|4v{ z`*fo<5f6MH(P$6JSWhNeKR(uDTven7%zfPqy#0Evuh@i+EV zWeM;Okl8j9?p!@FIaj^{kd&nk($HoL~XFkB= zEO$Fsy_Kud($~W6lR))4C|07VFj^*EW|8Me0OE}r1bH5etqMcfhT9>lHiqmDmU$Hn zSB{6L&wt)waxg~Gfzm#q$c+)h42qTnz{?g$eH0sn4MKsZO^;y0kwU>yhli1kf~So{ z4Wg08Quv#d_?jm8WX*^|n6I_5wbA6nPM~vBpuw`JxOF%C&+M#5x*@;Yh<5JoTFyMT zZ}=!XJ04XBye15Q7@g1DIN7RbT>W)|JMQ~F?zPp58Bp<@@>>+Tgl~C0RzK5dZ!|1n z0<>utcXO+}Oo$%`LzGSHZy@#lO^4ZDYk6cUPQ)mUX7)oUyM)2G?S`j?(Ovb^fB@`x zcw8?-V-s%CWcjDL^t*fV|%2VQwXUH z!kVTBy$5dF_qesJd!t`cvi3SuUMu|D-i`oWb*jnHjEB`HWLz9(bS!+)q91q%MmOmiMF`C*psD<7NH9bqYG?ccfa6*z`Huw{sMLdJf|Y!2y)aSA+Y| z9soz*d!xhEL_D1^avX3Hv^I@X{!}YY1+WH(F8YtVz4fG8wzX+Cm5$}k1pshi>Bpoy zZ>=gJ`%`}z4D87pA$#9z0ToS#Q%U-cwGqd&H25qak*4J9TU+xKCXJzc6{+Iye(m>M zz)MvaHHyLG%rkfra&x?>M?id5xKI4*CqQJ=e7gj+vK0m0_DZPF!1mZa${RiSO2ybx z^z~5^ujhk)F24`!;GU_Vj*8npGwCVxtlbg8m$5LqMC${8k0qZa(5$ZR4QHW(-xLQK z#bPOBh+okHd9+UupRO=T$D)jW4(uLUZpPzVzYDe`&*MH^!m8CN}#Sr<51I1F*f=T zmjc{GN5HC2a~2+I1FHsdRP?z8hqw4Kn3x29A@o6>FENzN@py=riCzR4VuKX(u(?`_$(x(g$|>V- z@xOqED70rl-uCH2vrmj=&I{i^xZ70s)uD8xp9ux#U81b{01NPW2!Y^91YW1bD2eBF zik7Ro<}GEADWf*vGw3uoK%_AGN~bslK}fzI7kZ4zyvVa{ZBV`42^dRr?o0;Q7QcZ_ zn5*8|Q9u&GuE$l$WDD`$?Tt^fWwoNyFvUTAh{U?n*1l!V-1bHfCboP&e~$p5seuxx zbuNl5Xfk83`dlhz@Ujk>u2f*3SFg`N5f$q(-->f$gsIqV-4C=UVg>!2-9BL~F6)np zYH>ZVmZoP3cVNT9CxQ!cC9nKmTqp9peCd_lUV$8A0YCo^Hh+V>%lUOMiEs-f!7|r( z?n2S>0uh>tHShVwwwE&J{xgH98rheU?>Uf_N!Ig*;0+KfOVtURq0&F<0ixM zTF~WT17lAU_cCVy3NtTN2xXQ9OhnhdA@&+RdLpY=j-L6KXmjQ9FxCgZK3ep;wE=eX z#-a!_v2H29em|8MQ)11YoM8MLrwz;6R0saFkqy2|J&O96NT`>1j{66^c6rG2W3VPPioSk^MMnhu!XyRa7yn{bs_UC|0Ymn5w%>*H!_g*HU=_oz~ z$}#|%1z;{eDtI>vnAJH6viLP+G_K3*l>Pa(3zVawxTfW!W%DKE)ubRbrRvTN!&dMd zp|ziLteHRk{mklO;BJZMhc~ZY-^(y-RnGY7<>!j6{hXwZb;%tD@q4D?jzK3PPx;1g z95Ud$X%kqMVVgSbVFB9mgjzSp6hmEulnc0+Oxu)9ZTux0~T zqEBjx+uX$Kck)lQtCE~Y>gg};7lf(l>0Z%s^nyKmV%+llcMWh5%CIhh_Yq z6v93IyipY~Ph17g%sduV(`ca+;9g%0aIJn&NPU}ezs{#zFI(YrSWWfH-jC}UDkKKNGHAH@tKxBR; z^X&I{oy%wmkkjUP;H1I3+@kY=b$Pu(swDoa@Tol1YZQ#tW9T0w+EW#>t5v}DoCl8| z@BKozOW6aZ;b8q}lKIa&#Fwy>(Z@ZsSGqQb{1hAxvC}$QeQG3&iHELN+r5Xo5zww% z5j&u5DCMojlLmkVqH#1r2_sYx5o;nbEE8eN8vNzA{&1g(PH+;AL7v3M?lL((umuVV648XJ;-Q`ZB;iAQHT`#IYp51y%&mZv^zNvL-L%~d_L(s4G0`D++s)mINGt#b zzGEv0pD2hZ82)G}Puw?GdZx@sSG7mHAb0m2>3iCqFwAL~T@K0}MvvXldmt+SI$A5NPZ#KbG6DNmKgjPU9DnYxs*?>U z9ZWujDZI5kf|W+6+Rvx1xq=p|9u|pG+4pV0nSi?yRFxPFjtC0U?@^=Mq>b2d7(i!9 zHSv{R%*@NKDwK-Zf*N_C;I61wbL9~ynt*>b<6-~PBUb2l?=8wzqwKR`e)}h(iU;Y1 z_s02wd;35L0I0-yLtUWAZ`?>5Er$5rd-piUER`rC@o>^Pb`^5dmh_eR-8}K&IwwMQ zLI%8;wYo1lwS%N`HL+c<_}%-Hx{`@=JJZRdUMT{ugVashsKad~kbmJgY=7Jo0qVPU-TnkQg#D~Y7X_CNYrc@db#Sox!iD)8 zWuDXL_x?3dE$IaneTjunh;Y>yLExMhzi{hmJ9Bk;gC5AZ6m-H0Pjsi6?LQvi@R1h& z$)A5d=_f+W1WFH}V8zZhXkBmVzW+I0bRb?L_HOKkD@*R(bqBZ>(i1OI2b-Jk+eCO4 z6BGo0O%t-N^Xl-vh9V}`@iH3-P%zQ~2-OYOLIFz7tfoFH> zYK$dMj`)U*kKt}$11_Wou#(kFlf_XCSP=?ccI^&O%xecSA1xhQH7#=x6gKUU3NQZd zSg;XHI-zCIKlACPOu|0v3fS%nv_I6S*1b3B!-Rcasiq6Mu#I=B2?~^Wjh1Y5NjTE@ zK=jSYuF#0V+M%=SVu3q>yo2_96$ZCSUtFx$7=bN2tc|-j3Lf2ms2UauF-mjU`y;N0 zwM7;Zhy-mNG{l@UGse+eY*H3R>f^vCJUs%eNBj1lpdEof9CJ3(aK?G+s=ON+qWi>d zq?a66#W_lh%dO!S=Jj%9eC$HJ);7O!!lA|U_>KG$yL4LyiUze7e(Bh_GTl+!sJ zTKT<|ypRPT#=*@s;AzZVzGHfxw&PAH*K+kBvdYzQg#u+)Cr*d8s59_1O(i*ZJ;Dzy z#-6eX$q~Z`rJy|%Mpnq#X0Cjnx$OI)WV;)gtrSbBz)JCr23bdZ$K#2faD=%jIVF3J zKvUX|pMVyG{!HoYhK%&&pI4{RK>sxj7HZ(qOi3{sgqHx%st0LT!GX!R zGC3+$wB8HpTt0u#upeW(orx$G5}7vI>^UlMpG=-bo*T*G9WQhpqX-eL$FfC>*FwRo zTTMG>K3&{wB4Z{mGxe;`nH&PgLJYEcEkV%JBy5ocE>sLl$Cw*oC1 z-voBH@NhR-mOZB&+_L;=4r<-(mox2XZ|NRwkv-?jC0ZxrXsANU5l$NF{&WbuZz zuvelqtp;B0E%c0rJCv9&LZa(-5f@XjAgq;&LVyT22s&QbTXQK_;vxb05agSxRjIDC zK8$Ne`6Qo&HE);aBYCWbq}wrA3|;iTv6f_EsFK8{Uk%^z=?tB+IJsP-3$PbP?hrp4 zRYutJhkD5*e1}};V|_8pVxs@!mGOU*r`HQm6RSBLp0|`mz3TI*3VRjTH4oyuD!N|E z`N#<$(yJ5L#X7t1OOD#j==lj^KXB54 zID=1v-=vW;qh@%28NB=g);v7byr+&ng~0H?QIjbHIgnk{#EAg+dS0+a=tqz{Z6H5w zKwcbR7;V#gHN;<$5c)zw6N7(&tH3JDncBbPVwD@yM+lOa@@puSTs!|OiZ<|>7e-3J zZmr|dpS0WmcF#WL2|4J4wC<~)&u8X6lEBerC}BZC$ztm|tp6=MB_ZGvo(O)>vxp_} zzkz!Iya-AO6b@w7kQ^f3=>OqEK0swTY&?PX|6pSN1=8{#Ka^qs%yiUOz12GZHn#uz z?FKGz`aWSSf&as?Bwo^0^XbDz|A)v^U`~%vFPytT<{a&O=?f*9E|G!^!1BqXsZ$Ub+|HH9DUaq}_GAL8} zzlnc)nPMWqDE3(X#`%8_@xOmUl?y!fB~tB6u%(<`zh1V1b#x% z5jZ5c1A?Q>fovfX=`=P28em2C#>BBSD}iZO2}NRk=BL`lapRg?Vz>0)Rp^Og0&le{ zaEwI%r@Ie;->?`zuGQ^0X*jJ)ChqmZHehm31tOHZq(h+YKpDzQ50HTu0=^)_%g|rH z0Lc`W<<0AbTJQLnTn>?BswPa}R(l1nS+4zNIF)r;01(8nm=7hR7_(daE1^yX8Mv}^ z@UD8h!Kc`LrKEwbSW#!enJA@iZRKrGo(&ymR?i zs0n_)&_Q4aVWyr%?@s;`u=vGXYdbzYcxJqHOj^}E1nb5ziIu5W7U1U*QQiSilS07W zYq->vG6^3CU>fTw$}6;JXn*S zv2rHcOKB{%!bdOU5%{-LFK`DMKW|VmiP;z8lI7c?U)@Jf>ub=r_fhQ%WQ=WIGPmtP1sn%w=3{2H_?_-T_Kw-AW1 znyS#_vjTQxhP!vUmY&*0z+{bB2MAy1rJ>!lO?-efB!B~;jr=q3pG{!F{@c&tCg&5f zl$9vuhV8nmUWcrV+9e4_2n>P)FR?!jRFauPS_~BPie`7uFtCA!{?9OYHRM#~C$SgY z{!b56o&NrTw3al;EHD6HlIn&0DEf3O3DnK$w}~D0+&f$Bp>a6u>c<6t!7&^ zq?pCFplz-P%d$F!(#AEa9I^vl#5F_OGcg_cQaLd5bvpk%#T zW{7z-F4y!jWmhQU8=B~nH&ObxN0~BkXL{jmaG}sp!Z4xXV2P9w+}ix;RWb$`ESg2# z(x`g-GV(%GXV@!0q6yiCrV8b8e|UmH2Q)Hp)YVgXjH)s~H@70ycC~Fmj{Co+!+$;Z zNMMu#F#||hH~;_$onC_-wu?d(A$ujOUjl}d-Ez~Lmk_AfPP^nKwH3BPxwNF#lNRQ^ zhzg}-XMo_alG+Zvk?RK$UpxL~PY~T}@OXCuFvf@e32L|@OJeorWi%{rx-i$__;lDC zO~^h37L$1W{Y|7D>~+G%I# zXHY=O#A%T6BKFX`CB3^1ps?speWC$xwsf^iC-4mMeEc$SNft^j(=J@Dzd z=JJ4~LosS+kRjBmaQ;pq$JoDp*7>o&^8$LZ^=o%e$MuW*kgvOC8cky}QkLK&1b?A= zi(SC;=GWh$EX}BrhEL<^bn6GtA7Kt|$c2lEauRL$o+hD$Lm7subjk;fF}RlOgO1l} z+ha2X_F3_+OL0SEl9n`{zi3n+{XJ>)!qRO~AZ<`vBEJ7X6VfmQcCD_XEcS+!Jv6TQ z{R5iXQOtBzm-Uv<14$&W0E+!TTCIiW8{t9}zPE`UN}?fCpGN+0+THoG@_)n-WH<$R zey|w*MjPQ~L+B!7=zFXIaF|@n$#9^4bi(dq`ovtHA~bK(U3Umkhp?$X?3MfmCSa$^ z>z4v}w(m=Y2tXbSZ+rJ&5zpO;oh7D}X|~|sT^CgSgRKU-SS=L;5(rQrUY*S9G4mfCCXOWweCU%8p;mSZ)b9RQv8QT6dWhg) zfFzgX7tjcRje}?}?XgNSumD9VgFEv__FwjEB4xkXcl{WLJB%z?sW~qm6P>}?(l83>xc6q?LMBxR%QFDaS8wJ_nQsWAHJs?-CgWPr_m|p2q@!+ONE@h}= zkQLqhOVzyhAi(t_`yNBUs<&s4>kkcwj`7Ai7GybekUA>1iC*~L{r#$37qnQ1*6G3K zdi3X`*VWORC+$Cw$kVsUc3V5oY}09WiD+7t%^JCHWpS(wTAN(#)Rk0=&MHHK3r@a! zb`I_iH(Hw)>A_g%>%^K)J)V2hYDA^4R0mG`P06*C7CH^56WXBR#jo_UeKoTzK>CWf zrm1+K!BP@!dwnB;zq?BNxTu~)Hybt7#?$)gY8l;WGYiV6+i+#|X<{1lcf0g=#81LY zcuT+9a|Xy6sCqiJ*=x0q5{Bn1^;%PZ=j!xBO1|Sas>F4?bIu+yXqK!jJ2h>6Td6B$ zXk`elqPicN%pxRrDEG*yj24W_dnkG*zy5t>+M-2F2C|7ypJXau1a|D$Zuts zwX5@HYXp7vs^0?rD>0odMPtSrAYWl9VuPBc4-Jo2$sUm`jwpU2XQ?yi&o z!*{E%MY`A_@uu37vn3xT-G#V6{mx5qQF+N987SpTfET1A%Q>KAZ@)?^dkGg{l?^66@9QAK0$C(D&YA?@~oZ<7UbeS z2y?RC9!k;GF;2F5E{V5%Et%(UA?nO>+t&dEC#E$bwb?R?P7>T=NLymSmc7;wSJC!h zmb6rT-pC0+*fxt7F2cK~utvbDG&5U>@FDeEpu9eqn-F#-gjQEk^ErGx>x0+&s{AjZaE|JD)9F(5Q%%!ShmC~bswgRpIT@f@_5SR zlhz>j9y($5p8h$bIM;D$oFz{ZL`xue@3u|fuvE3iV>9<#vYsLdNVB!tHa`(+E(8+! zR12-~!M$0DSrE+hKg0=u$j$-6C+`17a%N!spu4}c=QKFV}sH?oPxLnR03fMPm?hF z{frq!O$@TRwdxSqPG;vSbfLbf2)afRyFHh4GLf6K3S3J5Ku)M}3Lu91p=el4d1ABD9c6>VOB=MJA=x0v#G85)fHPM>0O z9=X*R-{(?1WqWDfiQM;;lBvLUaGfCWZPVZU&Jx)PfSh_O$vn%J6|Viz(7i)J8(h|z zVnmxLsa&n8CEU(1SsNPH`<^@8VFPJ5?};;;y6oBJavcQlfJ_H6l^uMP{B8_nZ`fn+ z3>~sm{4BIIQ;DagF<*-bESM+TH?njx9nKa-ou-w!YY!>amM?}=}m6GV;tvI*yLwKoj|7=|^{ zE_gntT+Zp)_c72X-~)-;zlH#bO2Hw3({tIl56N4R`?#yB`Cc;zPKHfl_0MYn7vIF#zN;CO@#5oA0WU`PJ$^ zZvwh6U?o*G{kii%sud6_?x_-VvlTu}d!}5hXdIoG3IgTeXJQDHto9^JpV?fnnoLK%qzDIq?=h!srL_jK!9Bt9kM(zs>9x$Q=6fT&=9#ux6HH@VJQ;_F`o)= zpVX}4-?V{~E!Wr^T!sl)D_UlaW5$m>cGJx?;rQ(ClDQ_C;7)DL(NAxddxdA}ZM2v% zSBGzQQy9zj7n}f^#5sMLRz<^*YVhZ$UtTLk`aDg^!{lWk9__+Y(XYg79>#%|8fk9hCqPgw(=8kJ~Qd{nE^?}2EeW3GW9A^8qHQ{LuB!Sk{AflA4^2kz84i96n6qZ5vd zw4Y;a$RNedZiaggL8Nf>1Y?Fxn@lSv1=sFdJB@Ob=38o=vrA}K9osoMNB16J`^rPU zf)3Y_C!?yBy zR&D#Lrzz094Mo+&zMWZz`{YFxWt~~W*O1zt4%f%F z>xjdl`Vt|+Dt%|hzLM3j;}VJi;_`GamHuZzrKy3UqKrdRmH7Zh8yB*5Uh6T$Y&$-W z#KW$dJ|WufwlTg~xpk zRPEr(kLk`QABDpt#&odlLjA}XP&Sl?U{#konQ(kVc{EM;EUvsy^<>wS9o+BN%U?fmZYaBXP z4-nLd`F^9F`9Hf*Z*O^UdZKh-tTTCQIU{#SBJI}59dOIyD+W^S&8ED z%=PZDAk@2=I!}3%;|%xtF@qM?-+V{yCU%)X?SW@|R4@&YxnFv>y~p0414?Ud`(_&R z(q9T#^eP^5P$&AL3H6rpmTzVk-qTlnPAm{)Pab~HXmikz8{F-V?{=rk!Vrxa-T7;s zyA|mHZ5vK7j{gRF(muW`3}>GG(M4=>U!XbwH5L}nJpZynUk82}!~4BH<`C8IO=Q{v z_H#E8;dlKiL*Aq;;u$NguJhM<$9p5tq)LN=WW*sVmj3pT{Ncm$!Nu6R0Xeqz4knL9J*zW=~`*Xp&>X;^ga+EP{DdY;ci?zdQP(u9hX zBTWY6*@s7T6*$!@ZGO96FU!H^RaIOiMHGcv;|M{?(@K`q^ zzgyX4C#63Fn<+!Q^WdVDRy@>x2?1GIzQQ2In~b@s+_&HhHPhFuH9gV?X48FhA7kQ*L`GiHAS%rPAzkYnM^AIrfoi{uYA{_*29g?^ML-L$H29nv z>N;}blFvx&j$|dm`sR|}&$*EW<-&QQ2Qpa=fV^iDjV(*6-v|!ZSVU2M0?W0hLWg6^ zRxppm=Zjr9w72{4X^em}uF#&ulNcaJ-eoaWN=A&!^ZjZP_923A1Y1^*+W3Tk(Bdd? z-Kr93H#&}r7fG0f?kuD_IKoD?Z^F*BD0)xU%82(~GW4Ril*E5Ol+qVSJJRO=y_lin z_oEHA2O$3(Mr+86-^3KXzsWi&hWRtI{8Em`!lvkQ6t%96Ez!9CU2s0qF*?j~Mp+Ic z`8*eVPA-gl;J3Gy^QFaDl&e!>>vC-+%T+=}plyZ|!IC93S$O-fyS4b@jPw)ZF~q&F zL&?&TXaC^CPZF+?T-8_B8rkT%z&r}^9?*mpLJ-lUe(Z8pW6N?~W@@VfNqsWFx|+Bw zFw>akSHW&R0mNW(0KV+3WAO>XA>Rr~7fSBWjyg63p}JMlxwxi@gEwSqc=N|tJj*hW zlb$YDgu*0#heBqOp0P)g++^o@GHkRt5G!=M)0l3q8@J%#eYA<%6 z_Gx{Oy_B@fxV!Rk>fO&^b9(R5jtjz|3Sxk9MISM)0jkmx`jp0Kq)pQ&(P zslO3G^$CHfL1at@<7KZ+x z=7rVn#=rh!k5Ct=R|h!TuFUtL@E18=olVm|@ThIG=mvXGSefQQMeVhEGyDRpu|>fT z{8nfD4MRhwX~=oHyQ09=diwhf6iwO6H%-Q_33Ae&_u3Gk@gEB zwG^|}wq2yoPM;lc<0?XP?B_TcS4emW z<-wbVwK%;_Z9Y;*=gWs9pZnuknQpNqKpzkLaQQ(wcH(-(`XKS*$DNuC3H*>hI`L>o z8>CszTxco4jdyoQfsd@VE07cPpk1Hsi!Di)e`MND1tSJcU{_ zuZ{LRVGx&y)nF1Qsom(llBVF%LO{uM|s8A9kY83l^({-9)bb@#SL>RM)$OAObE1SXaIgMvNWx8$1hzN{1Xa%}- zHm_uDgF?;|*i&@Pq3qM>u{JQ?HxZq9Jwc+hHx+9n0Qsm!DR9r356V)$kjq$8s?|U* z73-eo*P9WEvBU98#1&;NP9AuG<3GP1lD`YR+wCv2KjH*aE~J#k>dpy2YnsF?;mJ zZq+aKZx862oqB8wo`}hQLL(&T>#f;)h|kVy>6_$e3#vo8FeZiL6fJeFHdqFY5@n#2 z5+rR5;obe%h6!#Ay+|3Z8o1x)L1P&R<5Bivu35ubobCsuglTEu{t@BLL2gLPL9oRNrrbB=B}Bu z_?d7->M9P9xecqgnPHSCbh!g`!bx*zt!mYm^TWXw`STNq=%Gc0Vmor_@d2Bk_#O5k z1cq(o!>P@qmN@&dKkw&oRp&=g*(0e;_R*YKThmUEi>XG%D)e%96KvN`h!u2gn#J~s zYVUUk5~%XH2Jw3KWS;I?J&4pERL}v-&mpp2=2x2vo@ym`twObX#7aJ|g5JYq@CcGDH@(ZA|4P*ZHef{Q!2JuyuI(C*!8GV!uA!(APCciG81&tBE#?nu|1k8 z1owO@CoOGAdQbBKlR&J$7O=6nF)BepsCK`$bg&4n!=Mmas7iF!3|Old?~gr+APH@| z7#c|6*i0}<9X%`Z7R|gp-~HWzE&O6V!GeMpZNnwZqyhH^Vyvz8Ft;3MbCrDI^x~ZR z+v$*F;frc6;F7wrL%&ckhp`WQZw0Y&DZRl1BA~t$eH4@xjIm3#kdC5nSSkCMn(tJ( z?Z{{)U@b}X(4<Q9fxE{~Urp!Co8#$!9LmGi08%=c@}Nb(3(j95XpBPc3i>X|bP7>K8@)PxJ%iqTfno;|9`gmJJV-vT)(*(l5Z}8?gg<9W0sUeu zmwwQoGY@|ec9N6ptJxO?wGhc0N_mesTro-R#tz}_T#6jA5+eY{r2W+n}Z4c zBrnyK{zKCK@Ttg>@U+$YmaP4oZd%?jmG|x7dCvtOR(P~itm>93K!1{sbq*fAUvNEd zFga^&q}x-u9JDp5?sA?Fl)659N-}@!UgMf4tzD_^NG4=pBom`Gh^90?!gi-A?ia^F z?3+YqKo}i_-_1@C=zNzpgIr^Ii(evL3nRs#q#1T&J!AjpQnMWgU=E=>g=W@$os#&b@!g z@R0xJ$$Ad&Q$yuD_0oD6FtQjgcUfJ7VUVby6n?XiF(9|P@CjqdMD#VuV~%S7389LP z9}?DyrffawsE-ef=duvZgkG7qM=4+Tcl08V{~O@;QSZPiP00PyI$D_73-O(vt`txvN1 z<{GhGj@$tPOzfjI`dr&RcRk8)_yccw+o$gGYo0ZRpyXN0haa4=u%^?nP%;h`9$Zg$ zAhN{ffMZ(7qQPR`vC@5({YDQVCcx`U))VogG!eq|a}m+*9(#GhqJbmW&AIo}F(9+3 z*{n>b`7tNf)uY^qFM?t!N#2`Dt6YBAUH$xy{f>-N8`0ReRU*62gs@cmbfMFZzly~9 zm`1`JMtkD`v!bA>n_XT+#`>VSE}$-9Zp3%?_^fer^SiRFPHVA-bnTx3WJB*klbn{F ziHaK2i3QA)zG(#{ysi^tyvu@OMf$jnhUb?kH!Vl^cDRspg z0O`NQo2NNg(E=GkN}J9_q>>u6j-;GlUSbRXE>9)F-jh%xytLD@g0@F*Zl`+4ZcCUD z2({_&{fhTkUn8bilJ_PTaFk}v;h(Af<|YVi#*N38mB;!#2&uvI?O3rqGcMQnC1jrS z-N`6_U#m&r7Hf1dZv+!@*$U}5nh0@2lqALwytJcwVswxpra*?QmfRU*l$(OcI0UC0 zfY4tsqCE;dl}U0(&NxwJb`R9wWkeX=GC+U5Synt#%Qvb6a%knDz5h2#%eo)olTI+hzDk~^JvE`ir?Bw1h@orW^Uy^-?jX>;B{1;RCY4!N<1 zh|ukdnCV<~0Xf21o$vyDeC?|=RPuEz3ebF_(9-8eCeC7CD_%7)61uX!bg_lC3Ao3s zPh4Y>@qa<2g?0!CB~zE#?pNqvy686 zEWVNayU1hH!|A(BmT4HSFmnkc$%0)dz<74UqhHdBAz?1zgH}ZzAkbBFiPKt>8$;aQ zANoVeD3QosbCvcQG$;p0&0X6ZHd4v$`+ivC9`oK4U85bT6`uX0hDKm6jz?C;N7NGa_s1CBS{H| z-|4M>4_)8zsy88SS&UmF>i(Ny!W9x%CC*;rUh3=Sn&L*<7KXrtk9y~fcswVA*1wfr zpcLVdAT;#Bxk=NTuxcq7q$XlKglF`|zo3lzyCtiUm?(nJq>2{3utFgIfjHki!adFp z1pIP3A-?$YuCB7E(1)hyF<|?GFa5V7b1yzI#<6Hxay0;vJ~o-R?-7C8Oq_H=7F?ko z|J&T09%_6V+3MU4DtVmT?}1c)NZ6IW_iZ%4T7BR<=$MN=*q%LQ_}p7KSyYWjuoJoq z&QQqu@Ui>njRoxIOzLLPee-!<8n9CnLkd5f{>k|HGWC5bAQbAdq$A48;87(|y{D0B zEkHaa{`H&1G?EPg5 zm6b#wc1nXNACLf?xngE6QFvaqDNYeFs7M2$1IAXeO*v^w_wAJ?!=-yk+#ZdsUEg>_ zeoPZto9ryC& zoynrOoRzbM=MJxC;wuz6=6^(vq&?IJr%8u8T!Sle&z$anXGAq=TY`Jvxy5{m%p1w* z^0A6H$!j>8Z*7_v>AF{ZW>J35Fdhqr_o2o*WrI8Dr|wIuRFL9XEkqrgyqf!f?L5Qg zYjg?SRU}o64*}Su%<;JTzSRk5mt6uchSQ!}VV0|`li`#WVJ!F=bccaNds@H^V8 ztRvc|AW9z5@FBD0i*9OHzA~*$ou?_O)8N&ss}B!6j1+mPMkP8m8epswEm&uz63jdg zih2gF0CMYMCpn`py7gyBsRsD34clp^xO7i+kDeaJq7PQq zLFz5Nt5L-6L=W?&>+BYNM3eWw7=wOUZctDNG4dP=Qnwt2I?CvuoT|Ro-X%C$pi=N- zF7NcP+Tw3m^;@q;Z0W10Qt+dYDIz4i`FyUc9^kg5upFL*CAA$PW!M{9V|#2{ZMCjD z-+ueYmcEVDOZ5dJue}(oHyDf}vMGW&F&M&hdk6+bNJgswlXCOXh94cU6o#XM4PkA&DTX}6{=92R1Ce5g`a+Yz{#B{B_y-z`?{Ok%KXX2)vx@-DJ+|x ztpsg6%dSd~ZUTX?C7Ly{jtBFf9%Un4Bm`3OfWE5n(4O%9>vZXr=hL#0|4xyT0^ua$ZD zob_?C8cITy4}di~4uI5yH!o_u*G-o)8&n3`gi|0$AU9>r0^|Nvne-7qBU;8}=_9P8 zkPx~6$lMoDcz(yD(d^NIC@PZ3ZA!oBW*-NHhN0(XikV_Q`~)gK6$H~LKi91ao0@Os z$E})1LAwR5uggONSTv<0zWE#VMZT$F$KC!q5YOft_JV)R%u|ahzV>->D-R371(2LI zv7KX?(l}P)#zUuE8NK4ZdZ~b%n?YGAFf_hqMYLx|>d=OX$p0gr`8wnK!tH|Hu(~C- zH524w$<39X!M9{4=2Pkc#_wzNx@P&^rsHnXYrd-!1{Sc4&BLRfI$SY8#CE%n30v^U z+l0e|S)i-U1o623l~(tcUBHsb_yDH7FZ4S_ z6)!~dBqf?rK~c`Cr@0PDuzTx_3Yz=ybt3;2u+PXEqIcK6*bT&VWu`j$Iq(6gBtNYn zcOP(c`{J7J=k_Ydy$a`*`T+65P7zAk-Z8mY^ARDIPmEp?w?)$y7sJgNEU)Zs(>iOq z-_A(+v#txQ=sxQ+HvLN!Hi#12$Y%gNQUyLk57A22q^0ihx~(V_DBv_*c#oJhkiLw} z;Hma%eA4?lqg4m4APepS>arOx%=w||a!l&$NP0E-7r&%uf^I-GT~?V1!s5x+17|Wf zFEC^HhpK3`|NPPV4j&`$`R+LuqQe#1=GjXwf}+cztw%n#~8|lrnyYtjX}pi!7F*xE5l<7$*Ze6!TWC2u>u8kx}swA zQ$Us|VYBRc6zbmaHL!Szz~~@>(gn{Y^Lnw-SN|#+@v1PtaRuF8HxPN_JX%4!q>BF6 zXeg`>`hJsQB2AO>fl208Q*)wGbE|ZL85~1+*j@wP1e}+?>7Sjp2We64s}EXD0RefS z`$fMFCY49x=dr6%+8on-`}Vi6ZDySqOM^Jm3)Ec9vKs05=gPUB_kSo2odNGgJ~49; z|E=wCTuo;BEdJm|X}i;>#_FAol?*@IN2m2mf2)zyx2_sb@dZO%E}EUr?D^fBGS-hG zuj6ac8D(^zSD0Ne?*Ol7!7<4CEt zKwaY#X`O;k5KphGNiE&zZx1kK=l^1eVyq|s$u4AYejA00pOD+YlHi}D%Li(_6F zZT0aKAqPonx;@QX7yL_TrREP_2f;t=;E(yPAO=9(c&gH@qE=%*%ihhM43Cch|FmFV zv_LW64saPru$>>*=zF8(`-H95hj)u>`>`~F{EUS!^T`V5FmpWKq4D?1bDr z>=q$F@F_1;Eh`=Ox!*?U=QJJrBAf^$D2`2@!=^z;CJ4|XktG3{L{3}`xL4(91fK!l z;%KRHx^zdg@5M7;O67bt(Uv%wtBm`#x4svr^H5(*2=B3wpFX))sy^c=n?c8?oNgey zil%6?+D?ru6-bg4#y(nHHT(G$cyy=Agj9sW!gLAKogH;+(I6BrFI8BluG#488{m|t zO@2wrqdcQjG;i2& zWuA=B3LmOVEZy4wD85}!H=j9%ZXysJaGW!cNf$%K(%2WL|QHu9~gsW1*S4Rq{MXYM~ zq75NK@ciy=&_`o+&hy;Cj(6}%FL14?G^fl@x=F2iRZk&f3|2 zUOn?$q(mX(ORj5!78(PkRDEntU-lGUa@y8bJ3w1A=S0H)^uq{|+Ic!vuvtga@@M~|LMbWvwQzSG68?%b{s4oG* zU}k36)<=R~g=YDl!*n8#X=WB!sXPwiY)Wx_G7R2SLIRB*cq6VAl|-RKhVYSo-z&g;1} z*sOn;1!8+Whh*>VD=|ogq$T`$gan&o@CWz@Vp~11i)0bFD}|$unSHpZ4n5TL*TJnj z+qlsMfD9|I1#NDsan zH}&YP3K#&^3?cXW`!KXTX3!0=AjYaowr(M{@mgu}p>f}FqaQd9?Qw0Y%9T#RGx!Pc zVdXS~QkAC~j+x|J-_9R-v6nc(7pPE|8A_#fm!O&|zM0+=cHen*wURUEYeZFk-r1k@;#ZMn6}b|!P3lNQn+w`mBT(uFUB2~K#4wr@_-*W#eb=6eOVkx_`>fC*XS@gD z&EhDP#2b%*-`5&W8pnE8EJzHGM&_7JA0YwOE*uq(6-0D;{FM$JOYOF1XvCsnxN*EZBjQj3kRq+!sYdjm%^P7h>-@LYHtiBd_ z75#3AuHVMpjDT5-H+x%y)nRS^=`_RA>}4*1C(coV?OQ|Hmf0?;vChD_DgzQ&6r&dm z3yqzQ54zWaS|;%#YHi8j`d+v5cIB(R--s5b@mykGeJUBbeJFbGpt~HVk@K(Jx;ewt z=(<%*^q21A64AU4u7x87%=kayCCR}DiXhl6Jt$A_9d?)?Lgz7dGLe70_=*9#r0IT}XBgZ)xY%8F)lr477RbHYpGfL0Cs zD%?l^;lEzi3^+%hy}O0JxiGvSod5XePts9ER)f9O$|K)@Hbz7JCiz5k@?}DmVQfG+ zCq~V)!+-ahp~?adPXu8^^FJ-Uyb@0oie5d^!yxo23<+=U;!ui#gjr<7cD6dpN&YXw zl@D)J1XccrW6P(P=4jbkpYUqihv|fBR0LIdBv2 z+7SNJMf)!ku82NBCH|r>kR?d|Kl=P1x`Y4mBq>;|CYPzxk3s&%|RwD-(hAU(NgPH?O&Y^FUq80bT!}*53coF^^3s2b%mfL-#M+ z>wmNs`0vXK;5=|vq$rRB-r@i1m4ANXE$)r>f0xex);<4s>HOcN^PkTFZ-oDQ>iqxx zsRN)&Oqi47x>`yjPUBdp<g;Q$XupUwT>$eCpWAuy z8TBl}<^M;|*Yw0NJ zABNEAJ`+zbQp?-Z@D~D3P-x`gIj3#lHM)4IP75{7Lzr>Gs{^t~e(^&2?`WoNwq93% zvH$>k;++KK(zM{V)(T88m;lmHEn%RGd=p+%TqE!hO(uce>k}ohxzcBFQm43E$y*EE>k+S_RcOYS+CR+1k zdzi%{)tqXxKki~+t#;qVgB#EUdYEK5RegVoNS&`2u#7n5SF2fSdJX(eAeV)2mMc>Tv_Nf1J#so|Zc;J3N-3_2R^7o3KT!`ohGy-a9>@FvUK5IoljwW2c zpyVx%_v99Usosb}P3z4S=IN5lvH9Fz5S6!avFsHGP&Ge|Q_JM2S8bhar+IZNSR8gy z%S3)AS=1cVxGLKNB^=$U!kG=}8ZM0S0Vs`|Ma}Z~jbMpQn%&#;i?kyH)adkSORc)t zgWxw_#WA%8*EgR%-{ESpYBJw2OS`=~I$uB~>d1y>y2zgnDSo62`(IA?m#4cU376Xe ziLN(Y#Fb7korJ3{Y1we6prRIiq5De%fSeLKG*$)@rc*D>ZrQJ!s0E}v3cwZxaDAvV z^4V?#o!0U+mNiOiKt$4SzqN)_MF%?ct6=3Hisgm(1Jp6_riE5U?7XczqoJfzUNWy& zcOlyNRTRySt9XI43qBWTnFEZu8Qy!akPcf9y|cLgHmff{uJ{>&>m}L`slEuIss&JXb@A+dlJZ~^NClzziS|*yq)mg?6eMA6 ziEc7v*?_4>H507ZdiHs|0@q(q`Fr%(UPT^)((&8PtT$Dg3prnwOODR2y4QzYjn^wF z;Fhg4XjZ;#9N(BpRY_tei2t*={BM&bkxoEw!`Z47A>`por%?G#^N`Dm|{vKzX76!@l1?*jN1B?vV&}xG9a}U^H5Ez<~R7=a^-~&j~-`}Ve$qb zjJ(*vCgzJ`Ms5-ufzVsM*#rRtl@?{7mef*dy-r^z7`|}h{aVS>c3l%nRIjSVnnS^Q+{@&SsqLi)wxcZ=M%ZMbkpHE8{Poz%^)XORH8r;%)G zYj9L0!;MX>CBn)p zsZ}OJA6F^;HxI$Esfd;g`5!VvDFQStx0RymDV8HsKH}dABG`?fz3|wyMPS3e4L}X{ z2s7H%2MqS)bPAMnwr4l6xW3hnz+!scuHBN9FYATMqbeTxSpf56$}<(U{%Py6`P}ck zM?lWWW`ABd>KQ<3ndJb_vooTo0{RebG;htq=z@R1Kq~aRvH=k`+ik(S;|A;1cXjLl zxZ_}I2`I~}1GhJN^A!aE>8e-T)CgYa;819$W#dq?iSJn^a?nHz zh4B+R6DTz;sqfBSm8S+hIGil9Nz&)aI^o8lm6GwHkWuvqL0^O%gIGlqtP__nH`*yL z=3$uh;ohL~Bh;{Ob6Y#9*a#FH-KW_5a6)`sqn@rNem8%{b~vpBLpK^`60h8jiFARl zTDjXRMhnQH9P4;@w%^sV$=sD^?vtrVod$FD;HK@xgfYd__wzhZuE!2U6tG~75LKs& zYe5{9>4YVE`%X>HaxqK~f8tuW0m(B2f3xfi`V6cS`K^u9FPm)E12jJ^!A-wVQCJ5z zPsmJ_YVXBPGj0s0fdE3|dm!<~P^IhAKeOB}ZwT&9euQ}CN1FacCD|pf2M^PUUkZF4 zyU{w+08fDjk=9*~8B{y4PcOgZs^onS5Y5N(oG2JTMN=hB^dc-E2qOUC`EpfV?O31i zF^RjRX=%>^pitDPfj3jSfZIrLNB{kpr;E=yN2+=^)T$Rh=8q*?^$OoPApw z?u+Tj9I1gdrZczWcJaD%Aailif{&S)WKmUyn(;>QUP00nrTETs;W+Sf!;P0tk$?A{4AnVdRwMnnmZyMzG^@C0N|GVhZEpl}(NCW$M1zD_cGH~osNxYzK0cT-Q} zdC0E=6XsN&B8T!!6EmKOA8xgMBUfn}dzz{xCUhbhtaod9@zb5Te&9`ixuuHpUBDA9l-;|d6n9|ER>A7MJpn+@Bk;iCv@ZMBw@ zb9pED0xxMts4yu;RjSk=&ZF9VK@P#6hG;`pEao$rp4phoZ*|8RHctH_4J~tC zcD3B)Gf@m;&9oHCs5f3*>Y2W643`6(&|v4yN{p+ol}+3R)pXt4uvjs-jTloHuw@eQ z9CzLzDwO`6yH+pq@?hk4H}-kK?fVpA*uv|<4-jVgT357GvSwil1_MaKPVQ~>wqN)p zQ{efWDqrfMMqPu-*G%2Z%i9@a)KG^n%iozue@=|$*#tUQNOPSX$Nfz|zIy{a3+4M3 z7qB6;87o!&Q9w}8CyS@LVK4YHnS@!i8?&qQNKYp6)x{2*PGx5+T|z?1-)j8CW;Z;- zaRHoci_!V`m{--)Ip{Jf#Z6z{44oj#%MZHH9_SMHG z@^kb`iiu7em4Fp7&yJf!`sIc7nHv#a?=2lPh8iVJ^+yU%Ngj+rw3&1h&rK(ZQX6%4bFH}&VQSZed=&4)aa+S5l;zM*J1oH=y#;N``V_M*6Y3Aqco7{MHK z70G3nJ+Gf;JWQM=&=<1aGTVV^KXF4c84HB9D?Z{Zp!npZBcwIjMkpHuCjQ8_oP|!Y z|6Oqtrw=IYVIJ*kH9CI+gofF6paxsf$nFHyhJu#Yl@--$is`T~#< z5oFzVqR|SFa+>RI(rMNfKcbp}lKUH!bOgj_=LtuB2n@sJ7Xf|3Jee_R!0C(`HTYn* zoYjjU{^jQUV6)&{4mG!|r$(3lEkWG}z`#cZkBrF~qVZh4#nZ!dx;CX)t>Rr7Y`LXH z5HJP83FmDOr#a12NJ12{B-C$I3pB*}g%%Y6^pYi=a7Bg9diSm{?vZy_Q3N3G*}FC7 zi}ZR>IK&&ML6}Ch{_(_2fH#ERQ@>u1u^EX5)YH*yu28&0tJj!G}41VhBfJ{ zdK=5e=`>DR=nWT+(@v+s5h!&9G9?=y1lCHstTOebu+3e--XezdHT!?>8(&|Vx&oFt z@^+>QS9;ADEg9=A4`cN3sA~GPF6oe(QqKnZF_F7wP8T(depQAjG1O|a8b#-_B@}%{=vRT`?}Rh8qy)eDb}A*T#)X#G^V^$Rq2{KM}Ls{$Q#(Nqqvkm?Ge~Yeaj8 zg9Alz_jkp|*M-j4YC4eleoipk@hQaq7_!Bb4O;fJgbsf$Q0#Ng(YhdZrY{W>4h~z> zSuAn38eiFds2pRG%b^USOzYF&(VJCOAyJqD6;F?8aHAsVxaLk77%RwX^U}BhMrN-Q z#k<(CPwMnUg9&mc`K=#wK6}41aM-mH&Z}cuD3=T?NEiQ*`dLy6d@^4A0J_hdiyUKo zsC29P^tE3OygYKNZrd%-No9AufT-M>zcA%#6H_mfa>GOJrJ~!1COYq$pDrQqD<(uRU@8>xSlDnWTj*DFC4 zE7o2W7?%!Su60OCs>G4xkmiu1<#YX=pDg4tR|o+t`Wm?V2l0Ybtzxe*=m20%QqmIy zC)ceVlWOG>9z)q^tO zOfSMOwwrlBidW8fjI=+Z2Q)w4Tnpw+f&SphDw&`0W~|+bWwRh6+amM zy8`&}WhCnBkd1C}#d+PqcuH|JvI8;*$pIWgGqKLE7af%NF0B6Z%m6nF=N6Ij5&8*K zXrQUhZVQ#$gGtjCd=O&6a8tnIZY$T|2KTjlNLxXYQ`)agsVQQZbMV7(JVP>qtKpxEBLki@O-m_aBquF_-D>3;RnT)veWh$+O%4=06DqK3(m@$ znO9L0EdV*xWCY!E&z))i)ZnScYZD!^%vDtB*eeqba78HN9f2KL2Du$-M}7t^`AvDKk9G;s06Gx=m|7^^VI_xv@rIP%cFA zMfv`juycu4Cns2+n3Uf2z_pqCccJROwgSwgOxH?R441Gxgi^fXiLW979VIP&(6S(( zVc$@~VhYoCGU7c;ONVTqA^WglB#+h7Ys!~!f4ydLKGxnE+HGnOoqG!*$Cp9wp}MW4 zf`;W>x_k&2HV?yHIf34Gp6A7p{y(&4%stH}Xw_#ECs#d8N78*-G!N(fovHCWfM{A8 zCan$fZ-{A!^>d$D8K^}uK*0$j=%tR)7so^G`Ni|*)XDA33{BRZlA|6~z>vUI z8!5?QSl3-it?i}5!Vw|iVW4>X6`nm8Fv;Bm5 z)Q7F^tYL0VM7uo6_aX@Y`ODEMR{$PCe^w9)*#L6 z8PWQ2j!l%|`W#^TGOdNh&uT{Moy}X+rTjn}Rs!8)1W>4Ee@hGY{}Cp*+Z*~xLzwk; zzkWO{*jjKMT@1u37J$K4{4D%M$DzfAgh>pP_8R37VII5BcqOa^j4efF*^!`PAG{ z#ZIVw%iS^9<>pjw0BcY)NiJ7Lb|Fzb*cG{`IfTg-77QUcN#KB zv0c4dELNygePw5%0(6&YUzt>;Cv}{s3cv9AjKRS&P_1PeH%WD&W_zGpU3z{R=5n#< zG)V5Yzsk(;i{-<|fQ_4u(dXa27HoQQnz2t40-EhQx+kh}iv?#P9&TcujX>NGUK>UI z!_#p94qLSzR)o~(qyNoMUXejf4?@wMZ{L@ zI(w4Sd6w+6^hQZ&PCXM%m?4+?b!J|g=984B4~tGqGIQZoRqE@8@V@{S!Sn6PURF{o zEsh=Dj=?IzfE9pe@YZG)NccFQ{1^<+X9;ldpvi7a4FP(qHwSefMMiuYY3VtZ4J_E0 z%Y37=Rl^lg)t6DqI?^kFqZ1$0G8s5v)a*LKXh0brT*#A+r}&-hm11!8q2%MN)y-S{ zj+#$BJxVRCFt4av=G(4tEe*DyHPK%iAqmTgAb6@@iLW)kg*H*hsMj>QEo__D+bm|M zD|yBzRF{$A;ynGYm(ML~?~_F24k9Lv_^Kfx2D*Sa9rwPY?d+~8rcmLY4P**;UE*t- z?T(g~`|F|vK8{(Gu}Y)<&Y$Y-;djpF1*>Z>dN_UqQ*dtD;=02KO?;IVjHr4xAzK3Ag?F|yK}3y+rDHnVKs-Xy>7DEDF>=MJIN_UbtM z1iJ#f22zQ}uasUG*?6uOPRhj93cSwLx!$JOO6f~`b51&0YUMarX`#QoJkxB{M}YOB z7Vs`f$SI4F{)uT3kg|09-xO&3e1sx58EyPcc4#em%~DKFHE?x9dB< z%p`XD74mGLr17?_C9=Jo;}}f0RW!>XNjCl8{R({IGk{?DWN?7iA_ySgPgYxw^V4DI zq@QjLR`nd=G@leQL=6EMQL|e<$mFao4?30U7&KnD#}amSD-QKyJ!Aui-~&q?m(7?? zu4hc(!)EA8Z}57!z>;(_?y8@J3FDwtAjI!?XA`9Uxsp30fb_71ft zP4}>Qdnwy`l?)>QLi|e%TgVUzsEuETXcUja?^7L8Rph>DHbsq-@T_%CRym{4+9Ve}p z?5bxLZWo6Zm>I;{_7PkkB6WyNTn}odBin0D=ev`w+fhIDR4&e%=A{g<^}L9(e{Po+ z_MC%yM{Q#0+cEwCp{iEIxz$Lzs6w2vAkq1e*73#nPA(6}{b<8#nPe31p~F$0KJ?#x z7ZUMiI?f}vw|j-+C9L_Cjkj$)AYClfdrME#atd(;D=USTj2*DV#d{K$*r-DYwCUmO zTlVe6S@Lt^m8y%xyHbJq7tZ4i##_D(!DfvX;E)3C62l4(EdAGSFGe*FSZ=C(%jFOk zWSe0mRnDfB$I+*F|8=kYaZaZOU%Y=chO3L!pJdtC_j`A;|F)*7(+=Hl192Oqd+4>| z=|%?(wR2^v?HmLhD_$%&WqK%FMFA}8m9P7(d&QGYMBngq-v1t# zJJze;QE~@q0z~&Ez)Y>-IDj-t@MDMG+F^(NMiSNF0L)}gYQ=S_VLJiWD)b{eZ{WJY z(}E*P#Z}fH+-8Pq-xxG^%EhI|t93dQ$rJaGl#qWf3Ar3o2_N#eCCBGE2~23+w2Pgy z4xcOpTFtdIa&dFVz{C2|h?qDbqG!PuIy^V9kv`7l*DiC&!b|#dLKS8dr`_MM2lxHo zoSvMxZTa!UpG|8IbI#Os7YTZ*O}$0E%A^KY#~h2Jcs9@9~APO+FV?=iL5wztfDP z-sQPM2ro1FRk=a%Rd(BRVYBH119JBx(W=o8q;G~KEM9p09^Go(D`PNpGQ_-r?Fw{TnMM|+g}eCwmfWs-M?O^8Ao1l-7Cpy!Z@BWJaYlvqXl4r-Inav zWz>hIG-|#obJ)+w+udJnlLoBz;0E-yTx}&GVUN5+F|EIE+>6Rg1h)UUf@sJXw^PcA zY3pDM)M`ilr#hjMW1<2MTn~Il-(Jhfw^z7chYJtOv3puRD^B<9(#tF6?v_h6=xFtJ z85U;Y1|xN>dR*CEv7atBQAA?ICogBXnAs_$t>2|@1uZrvdBDq!l=F6&<~YzNjGw=q zNFLwIx5haL`Mc4#^W{tUFBl(fe3L!SXC3RSt#~_h`2aw=8(%j>iluo%@Z#1kS1C^x z30o3GU#3}!gWa+D9FM#v9;cEv*MUY ze02^mwX4o1?6zsg@*aZn9;Q>p34EIq zN&`UJky+p`u$^-!1>^O+Hh`Y+xtrzJd?WBpgw2dT$<|Hy<_a$>TS}&Fv&B4_n@L_VMJ`IPXZs>So8Hw znRn_r5}WMWv8x_yiuVIEKnLA3b2;E#(Qk(>~rFxwE~{S(zE8 z4QFZ9rvkxBmqnSu3b!-%jv+AL7|ydjYQkqHPWx*~)^GTtg8?EuOaZlsAlDe8> z@aZ+--;HiT61pk6muJfurzyf-kY+f)m~3~H6^CHtFK1sT2Xot!V~Z)tRgZ2BpSc4g zUQ`p|act97ZW8{emi@8#7Qnid-4Eme80*G?vK$DhlZ&T>V_X)yoK=Uedm0^Yj=OO& zx(56j+mJ}r#0stK2khV4704!W50dz)eXW$ANqCzqLe2aSK((aOtZTw^;r zQ4Tt6Xw?G>Vs1y<^>+`jCOPu8AaSmfL=$@w-W!WKZJwHh^g-_47B`o$m$OEM`FNM) zZw41NP1J0P<)&K2QMiAdho@5g^T?ET{k0NU64q%olR3OH>f_y4y3{Oe))$D8gi zC{4CLf77}DoN>33NQoegaGg)?w*BWK?yo}-0S;4{{BLHge_oAh29M3@hG_gh!rnU^ zuD9D8j}W~^!stZwHhPa1MDz&as}n7H??jI}dY{pW5CqZtXwh4UI(ldHI{59J_j=ED zuIGK8^ZReOjD7Ff>t3_&wLV2M{Xbs`_!tJz|7CUm^G91wGz#gNKe}aDr2qH-{=b)u zM|;C4qQ z4FNjH!+^ya-m|iNlK*u1paq<%Z`y+b_H$FUwlgCFpQczZzf1>nSUgfaO^hI-a{$;A zY0RN&|8Zf`*Q6bq5GgxdfSN4~z&1D@UY9d_CZh@TMEd~p;=@3NyFUw9tz-hxmkFqJ zmtcQ~|LfZS`?fR!Fg8b^wr!{rWqyzS54IS96J&zueieLx2d!)z`teb$m!4OE8LB&_ z0Z{Me^HTs%F#MYx`8O1Tq8L9H&<2Vew4zQ1r&GgJm0`I>h)6OST;2>pTOG4M%`rI) zB6I&XNdoU@Wq%Bk`C-a{A7Ld)rNjqBTaq^h9<6GvBIu%m0r|hZQ|$4dswxWx&P^^Q zX5fpFkEnT0Ji>`C^}l20Ute_WN_Wgw1L&VNv6uA*ldS00*urI23@7*aLE{zwVUI|U zKXt0(w3=t13)PYC`uOPkqwS`m|M0g!Oi5o8kFg(Z!1X-;eIx|6;BW%+tV1x#d4R-* zKmpS{@4gc3s5EIncu56d&8on|2~+_I%4p%dGMND&Xm%a;1+PI^|%1r7r~V%=mz!;-|t`k#brlFiCl)gsWTm5y&k*tvp3K z|1N`?a4~+~V(C>6f9(kdd)Zu63ZvubE=HZC29XZ z*V67FA(KcfU&Jt=b@DblC{9?M9DI~X!xKjKZ&N{#3rp_rr9m3tjx@aKFLhs_TOaPb z{cjPKKpKx$+ix77$nx*+_wT*Livt_S)vAO;{y*p8sB9ql$=?SjOZ*z0O0iwiuzQ^M$v&a~9C+Cu^Xr+Y!b)SUBmaunlh zlZ6In%K>4nAzI%LAeDV>!p_7`y^L23P{>x-c^54b%L)&h>QeEgq*m-U<9g%Q;|Ho&ciQAiv6 zpKJ5mZG*GoXgn9jsXbB72{CVwP|pPlZ*IRTz$vWwA@VMX&^*0y?Lr(M_lh~o&J5E) zprao7LX+}cu2qIzoxjHuCH7mVjz?H+bGDFBdbH~*rr)9ZdOI(s# zG183hbE+a$o(A=)4^GpEzgYtJ4bVKq!>-9MxY^8d9Qq4p17!RoVw5^vo!9#lHle)8 zkNC}ESj!X%P>;D^<@HNGN|3*}H@&qj%UG(cV%02W=%gASnpBP-po^WV@A4(F6&QeI z7zf@7P9tviDvjBrh?X8YD5XS$$p7{p_1I$wzetNc2IMpHxUe3s)*x=3(*v%jTch>8 z>a?`x+h4~EX5JE(4a%(%Jlxn;Qi+`m{A1*^!*qHiM>MZV;3j=X1Cn6^qQjOv2>47h z#yR%FBs~xX2DELQ1GM-dAgN=cMT<1Ufeq2=?yN87E%i-xwWVw08muI&0gq1}aou}9 z6A!~L`Ac;K9CqE`5}Xq%2Al2xW&l5oJZ!&V5y$rZGFGXB&;}?_K8$>=kC4dink|^R zFD4NF3C|PJY*w?cSqY~~#f1j}p5*gu*^X@%r~P2+a^uRjorNOT($j@LrJ{ip{!Mdo zo%R=xf`AxXlsH?KBg2fP^(NAP7Wn}5tW3Y@lzj>?JSmf${+bZp!Ls~prFY)3)n1%E zqpb*-V_PK3#y|lXDj~XnBh!rT$~Qn7(V=^s<98BCGyC3kEmpPJzB-GHeZGWqu-ak`OO%53Z}59EYf#Y zbNZ&<*G>8Hd6fIdRh`1;u60~}KRL&Y+N(}WW-!OuB(-Iuib{>q zXRN$A(-Yk2wkd&G`dm!hFdw@n%BGS7xp*+zjRJvX5iHAIQT{7T5Feb++f6fT4w-;^ zWhc)3Fz-uVin%bmv%&$7?yM+M!xDP;^_XaL38(}IKtk-&8y$N!K-W;S1URAaJ^e5_ z_%r5_8HNe>%9^^!D}^^tO06GTWaLC>w-ks4gh?fVL~EjO=cTp1u)b3Uz~HtSlxLlSL{5;jP6cSpT{#{E*ubirfK zese?DNC=^JJ3WGT*f-K;_I&72rA_`%$>}vl5P^9cNT4k`syEXp+vC^Y((C*KJ}`;De>%3=1Ll!fsdwa zujOn{WlN)7Use^T*@~KtTa>W{RS%2;eFxzgV^9CCt44rLmsRuNUT4VVEht~~5jgU# zD=kAk-%ew6RA~ZZQwj6vwiby2S~6Do59QWS_vuKrFL9PH>EkF!m>wr<8$ugoL>>HI z?YK@B_!9A3kJ0nH4@|x5RZk3t|7J0l;#H&$2yHy-!Xr44io`Bg!&pcAr_gZ^KsDEq zdhwSmT4vc>QVQ9ndkFU05#&0!iNY^sXwN80ZpPKQG0mg zoC3eU>GH=4+uCgdAOX%*Q`F=_&c45`gTbU7^$^i>vaP#c&Pz7jW~bU6l(Qyqg2c^7 z=aa-NhwR#A=|1PXDYyf|JwP8P$IGaV>%J@cV@i|L1{(hMIu2Q~X^~IcD1dn>!iAkX zx1=f2A!dB`Dy%5&r~6&LP{#EN*IuPPE#Q~S1SAGBE&^OFM}NRbn5{{daX{y7HI0Ga zvJ%=YN3v~>SWTCdK)k}vQ+JjDQjfIU-=)54~Z-Tp9nQUr>$N6ix5Yr0(Pn*6~5@;yEcKZM3jz}N68*twa+*& zIxc6x>65Of%vmL|eWUzY0)Jj|5P5+bujMi-g+DRyr&Ul)TK!RNmvGrys9fu)@4p;= z&*W73&(Cjo@5YQzh=;D*u5|j-)(gJ+QMj8|u&9$_!Fw8EEnObWc?-*JQ-Qy~>C_;< z0k(b#@cu8+m`^S_@ba?n1easMMM}s!-#*KDTc3sI5$4g+bY6J%`5x)6*on9|W`LJh z7=n(*nG?5>bsOWmetn$3y7PIG-Q-T7y7M0ZO2J(GboV(ZPwq(aXkYu=d!^?KwCY8U zoCXbJ)i+FE8F!zE8LXLf_NlmsHYae9Dh&o-;{|&HDOqYARL>JL4L!{ zA!tY*=us=@t*ai}U6}2HFMC;ah{S6e)TFx9tmt5A#AK`RgQ%B6gQn$7sbSyrO2&yX zyJ74NnqjO9xn$Of6esw~K|#awu5HS0&P0ofSqp~KCnLGKiAD&?JaMmVaL1(m*dldW zuk=YO*?rc0uWPw&z0)n4PO~oY)gR4(c*pDLGOY0HM*lRP8n&&4pNBI&GWT-G0vIqh zmwDHU?CQN!{jKoE-QOVY@TS4%2L}&_cEv~U+oqUk4%Fb~I)04lU0+xj1(H8*X}?0L zNbC6UYAx%fdIue(&+Tcw>cOfLvY~u{$1}$+5a{{YxOQHXCuibf8CC+*Hx-~|O0jFP zOC9R7`hx+IVP7}fdv-7{JU`FYg8d#8H1v;e7?b@$%W-!k>2Q*|giS2RE3{;_a4v_R zzjY$vtRRTQ$(QdS)_$l2;P$cEXqDsIeBlW+pobfr*UE$CWKtyKEh;!FGAz?NJ@kqE z)t5HKbl^bF3|(ym@Pd|jhLkp%nBNQWf@xsLL6f$pFU$KiKeXSDG;@p|I0P2l%K=E3 z1jS)MQ&Q*KrR`p-e%2a9T`IITej$Hii_ZM_xxPbV&q!7zpYuRz$)C4bV33Z*f|3&La=~BSOllG{36bMB@GH`U^)rB)5`Y`i7!6c? zPHY6My!7OxzdeDyx;xWqb^^r?RMpzgaDPQX`Um4jef{=-^bLh}h-cK^$eM2grDUDl z`@6OFyPK>=ppe=3{N?Ehj4%sT(6waaOGwDH^LRIuxi2p(t*F+BFX<7-->-u;%SMCz zha8%jh`u-9#m#@OzX+$Yw?6$57~3AZg)Qeoyp)oah=#ta%+vn<9pQ+fHldOK@83$j zOq36PRBdA*-|G#41mW1G_f3LP9n5kNAY(LIuep90Iq~LN0;r$gAwf@0b3=&u{=y*e zU}v{i=8*aDBSP_glR-VPU$g;Nrl-R*h(DLe$CK&sukuasaE7j`Zz2dOm+4un6n58x z$Y&1(G-6XRcMTsMenxY*^;5pi5AOQy-v@H$Zrz`F*Lekl1s;0q8%3zs0psmyEa!pS zqo10$J10y8g9Q-LIWUGqO8n)rIt|@7dkfCwpUnuSD!Gb}6xBJbYKoD3fZcHCb; zn>_`ABA?%V_r0x`^ReIAilP#HKx7Ho5Ks)btZ~25X_wezW6818LA7=X8B{lk40c?v zU+-14j_`?}^fL}SbjB}O<#P|jWvAI=T9cRpcJ*A#BO87Qk`q~G~iCC7;RS^(kGxBDS~mApu_MdZ`!6WSw1!%&}HeN4y2b5NRwH0^Y zeWr(XWx6O7O=oKNGn($nO$-l6v9kT%rwmUER$$d|GC;KDi10-EhbMfPD$q4@x5(Ej zD<7m4Zq@$Q1L;RxZwKA;-^@3r(gjfKVBy6mIpL)lgWRq!zVcN6R-E`rg1Wt(&k$*< zn%(WeFKGkHto@BzL5RpIHo5jX&%r`a8c}V*ptY{S1!6F&PouB=FF{LqYNaAPtwbvpI`^YxN0a}ZrL&H7h zE$5UKUw|c!ekaG@bNusr+_z7qgHF2ec>eUV4S=5z;1ai5WEcGK-Q%jy95-QF zD9Q2rXFysptRsgfv`20mI7wd;VbO*JW>m>o*(_T;BRf=wfO<#S5Gp@Pjz5|t+HDod z7QiqEMIT<3yjK?`(7;t@=f?=6MXLMEMv{kc_Qu}d-DVw#J2=9RfbwP0(XygEX7gTP z1|I~bcjo?$8H)xZN2kOs<55{xu}E<^X7oY*ouTWEDtU6f^*Qe_H@(=`+brX0=hHQE zwuoeb;>E8D8#}P&t5O#;c=a84epq9{-Er=tvjWhwNg_xgjp8?#j6_mqv0Bu9^kFaL zDM>a1nr?Q>hBwlTVH!FIk?9Yem@?yZmpdXgCM%D#0%vd*2sAUVZL7VL$|Xk3mc;lz zG?@0(m^UbbC6>{Cc`6Wb8VNhLo~Ig8bCfR>prl9ym=VUJC7j{xCp@$?0;q<7cVo`H zPRqiZ$y#c^ez68QUjpIA7p>EV*TS^&6IHpPLjk`H86l*seUP}$iR{H{T>;MM)tF?I zJb&>|B{=~;Y_t+|P$KNNF9))D8kZ0d^a4su+{@S`x?{3V^ian*KAWS0knao;R;7Of_v!yP=-3|Ux+7pPLCMi*O2Wy312>#RkZp2Bq@$(m5O&VY3K zsp0ra-FBM%h2-hok{3L7+T;ilh+^E)F$m$c?%rd3dd^Av{U?AlZ}GNTPttd2>&XV@ zcttv&O8k1k>td{I{6`Z#W%fE6Mkj`o%lQt)=)^1fg$$c`$5#qcBaO%*qO@U;c@O&< z9GKQ0*$rSo765FnUkMIo;uV13QfV?SBxcrV1)Vr@C+A8|aa zi97W^aT^`&_175y?RS~S%dyf~hl;ZS#TF9hF7*nUOK1OdJ6<^?P7jt-y;@A=SbbjN z*u6=!A}Z)JW$jt|n~T+|fsiJ{XW;h=$W6=J`sqwJ4(V_NU4S(bOVN#Dmt(+Vi4MW7 z@Zrq<1oB;ZclrlSWHRZ69?WlG6YVTSWEI~?Gny`eT#p3iliJdmZ?m&GUD(!_f!^u# z^df+(tU7|wEzR+rs$)tSZF-z3!vKU$t2iC&Fp$1f60`oBOsfbFXtryc2*19zW<(OX z@TVZIpU8O*`~I|NCB4k3<-lWpPUtZLy;n}`$vaV+c;;|DQnJpxo)po2a#=?vS}~DQ zy0M(=UX)n4W2ECrBnu22oyJ*rBQ!(bSX(;y4aKgc8Sr3ylA}E22s`*Z0t5WnnDKMC zJqD<#DLnj5b#1YWYGhtKE~5gD#?kAsc`sXqP=X;_gKdi!KbKfpjo%xwS|D3*VfLRT zA5f)U53FB12+EQtV>7^3>ZFS6nb4-faq2fK}7wwA}~gIp;RxBE3hMDB+Zvp!nj@({n! z>ZsK)(=bd?+C;B>3l98B1@NlmQ3rZL+T@$A+n0u7j6C>+4)u#3mSYDY@1S)9_djJq zKHtuK)q}h3Epd^gdTz$#bjzW4U%rR&S$w0o?xmXc?a{6J^0yJE29o+EydD_XFHRtK zBIQkoRBTzi@>s)-RiHd%ZTKDRNTfaiz++grS=85l4tmP3k;xD19$wCR((yY_yteHq zKK}b%nhy0`5_OjJ&Q#!v1xtkTCTe+z{JOmFJ_VBOKXQcg$%3E{o=X;6q4m!%i-Y8s zaMM%`k|4EqzbAa2bl}{BUdIRC?HS9gnf})J^pIiNCC)fH*>U*0rX;99iaHt$V)mgMl{qLBDq#@)9QDHS!$-K=K@{VscI5Cujh%2_(OdC zP?}1av&BE6c=P`xYvE5$*msc&GgWJU1utx6All=2j>7%F>(j>x3VcR-Tm2ifI#NRPPVfpyeGX;@r-zeCsC|Jhsy)gsN%7wGS72gG+%f7U;YYwF zx86IZ7hN`>2>lcw+d1wn4Nj86g?SKV8;{#1+Epv&+40eq?*KknjwLNhAVau;X-`7pu$ zP{~TRN?>W`OfzP=>;DX3#)K0+p~>FHU6(pJ_|ZqZSMX-8cp>*N->;;t5Dv3y2SBKH zlInVseuJAjTMFbN+qog-BxRsp`Twg05b3*er&5Bufkz{}-I-A=*^wJ-MT_M9y{hPY z(5RbVK*DGzhR$k3&xLIiu)ze1-7$Fk^GfrTkI6Ty{(2O>kr>B4xtsMwWbE>WGRs%n z=td7L_h)JtZTB`jZ;t6~28&~t^M7?GI5qC}Y)gPfuTrl@#%uEDK5=uIFHx8akC(FD zLZ8Vxx;tyunWA1Ja_>}@6iQwYO|G1}9kq^|!Y{kAX?E#e&I`Hgr5YdVx!loQ_r59f zY}|7u?xg75`Fhy!pzOWE^Laf7&v9)fZi@ptzx`nYzBYhbo*9qw-M zfw-OHTrJnZx}104Wf1rrnk5v`6cvYl<^^LL@!zqN7lwmJSTlwx?Je(rj7q(W^Qsm$ zyrx4?pVQGi7m4Q8es&!x8*7bqF5v9=#riQ!Q5y z-rI8E;0p*$f0ZWoL0S%T9upQ;;dAt|{=uJ(Nv!bo{Mk!4qWQ?;X|giA!Xb?j>dSyt z*MN}?;`4f6WbkX5*s%|y{9Z;6{#A>4a#-_UI|@>|xZ~ElxC~oZUxPj!@4g0$ghh}= zR93b)SWF_f10ofo#nsVEf$_tzMVgUi4%UVcIXbH!G@i~DYoI&4Qv&AoW~Eg+(_6UE z_k=v@K!cC`)d-I_SBfc#yu}-^+ZP4ymGt}$HnwinqCE_`AC9PX5%0Ot8E(!LZrYF7 zDLg;|y?g@4l{=`!7JIHyxZU5O@l@By>;8!?>g5t?@D+SgdhCnYA5sD^KAKx_eEs63 zJZzsFv{Tu1!d|9fcCCt0{F_&YwhCw-B>l z14lw2=6-v#QFVP!6X8P7e!4eAXEvoLxoX z{lvWA_sv7X(B$^ExMkNZnu+UfVdWC)^F-soTt{##esBqOucH+AMDH;kcS}c{Sf`1! zwh;SjYZUzUYktqQ> zNF0im3@-fT4qm$>pFYKwLkF$Us+@K_rrM4Gs2bks4SZcld`_U?8o3o#XzToL{|_+B zqA#`E5NQ&EOPH>=%T+KT8Nh4*oaB*qo!sSk-g|EXYM8ZR66ZwW$?vr&O{ye-v7p`B zY>zpRbH}GrwAa0t*f3pL7NUKkME9JdI+Tfkf`8}ZQ2J9wt)?Exwsm2-W#}_l^Sb?m zxa)D!Oojs%!|3Y`bn?2f_L0v7=npiFw+$!hcXnsep8ivgZ5vq5W-4yIqlb&lX_RQP z86CpE>WR+{GY z@+^L1-&pZ(_{?vm34bZg$feX95bC^Jj3T71H4jcsafJBHt3joG z**HrNm95SLx$hyvSu3_+Oh?M(wUl7*3TRb)p`)@%=)kNM6l$&C;DmZNZR~mHt~A1S z?`@wZ74%d$^rXG=5cEPiB-O~k_}X2DHMA6!J(i?NB0KsaIpIrf?sl#5&g|#J!^<=C zGncMLyF#nw40*K35?gl0Qo0fCtCE{Q&xR#>L!k)K-Y~_>cMZ4 z?6wji;ENZ9liK}dvMEcu4gP(Fn9+2PHRZES5KjKf zrG7!*3;A4&0v;z2koqIhvqvX0q-sdTy z2~>=(>>H%$3m!pO__9b-gFN1#KIY(hwLe!oeQWrvUL+IzJ9q@7!sXCYkP9*U8F_e{ zN&Rt*8Fmp*Sc4QoOsoNRevj#ekk@Re=!@2Mf zn@Y;iK)__j@3nPq?wi{#-(y5(>wDu=R9 zlKI>fAmJ}moF5)hRUKk1MON(R4dE&0P3-h3OWtWLH`~iiw6|NlJ0}SQ)TjuSEDrvL zY2kn-FzVf*`GRae)sTJ8+kdc(a=Zw`oNfp(Mg@k2pOxXu~VOKyL@v89ziUoOIyyy^#&K;Q|kpBv|X_giR{F?y-=?r=jC_ZG*2%#nD9DPRJGm-0yMlU~ z-F7l3u9O-WLL&ae(R-?1ky}wKfL~Kc;ZV67yVc&aoB?>?e109hoqqWnD=gT_y7oON zVPJJkE!`tLfqvvi@R|X#O)rklW81Xz4LsrS>75Q3I2v(WJ!zP4hIAi91nOCLDrM&_ zbK5ZlY6&hZN}^WwI4jmM)`;KY$RcO67!kE_*M)19c2>Xl=^3GK$Gu;NKNrR2(aks{ z0Wsub6pc{00QQ5+@84fF^to)LvIn$eW{=18zGYYc@ookyULW-GDOFC98`%Q1Ss`sYOg9K3*ibH=?rUVpP;OKc!`ymvz*m2 zMl^@lCy^fdPah)ah+I8a1;bx2hVR|%x)}L*%WXJH>SBrRSG8FG^!NPWsnL~_?h-k3C+k~lPwdNbW#;3OBd~o#ZSJ>n|`(m5L;^FjkIzBbdxgLxGoP)xcEkmh2C+b z6HO^KICyLj(jGxDpgL}9$zg?SeAZ(J7S4mg-5IJdb$9qbR5Ne0yY|H2j!Au+Va=Fh znXG^A?$5oWvYU)2frLX{K(PNBREguWI=ok(x)ZJ2<7UFtsAH?wdYkzPR-L!mD|k?} z{>z|y*z~RWlJGuh{T@EOgD_KEbHv^=#riJgIrrq1Cwq7Zde={k_^08mNd|+2p8nsA z+X>;mV5;N6j75({u7e`C!iGkv$u_vakE>Ig;sK7`0aj@7>HJiCy_wrXHSJ$m0?07)P14J4z!9a7WWtcM;w+tf3lQRt(k z%@5?_xsJ>Dw)GeDlk_U*HOrJ%=5I;ByK^@o{Hg3hN6 z1xuEzH<%=U>lqkv%RpyHg!QXTQe0FEU`DFp-Wucl4E>-v=t&s-@qVGp*;J(Xh0_35?`Q~-s0cOZ*4;_J z`H*36R3nJriw>Xe^!be)=_t7T_ON|at+j(#ZnHjSK$&%QXd?vcQ7rV~{<6J}q_>JP z{JA{a5I%#;(lm%Won8Wpx>t;}VuL+7+r32!{&sJB*Z*mKNH|^1;9kX|FpoS-X)t5( z9I)S0^%AA__+y%I%0{+&-^LP;geD$}vY%u>4BD!6aZX>*p8ta7n67r1)K2xRs!S?8k+WQMUXC}sPc((%^zUw@18ApdZe{9YvMLAtZcbBX3icovQWVd^! z0^N$oD2A6TqviJNnZ_I1i3%y}dM>yB-x?oYl= z_Mlmq=<;XueQar6hjEfOSi|01FssTEwLIEC0OV=^72|Isza4pfp&NU5G5C=k!eYzN zPGpy{IO^@sV(Gd|iyvGpUb~*VQ@;)q9kM^MiW_W6L+9KRi=UeR^K^#dLx}?o9Q%zf z&pS)NmFC)mR!dC&_?^`aX85r(`(JqT^TEK_Cf{MoGRnmf_<$rmJW=z0U!x$`is(sN z!E9#FLM{ZuXIsA zyEyUgi;_P5R^B9=ua((ZaW+tdNIaL4d%ZwhIsAB3J5ckb)IIPmqPuLf@VxoT$VbHq zw$tiBJY+sdXN29hti4Ue1XL;!TN&Ifz(2fNZd!Cbia*??X{E&!p%X z!3kUMIY1oejSkey2LCB;N|l#TVsR(J)F4Zh+ukl*BQcfX3AMrb@R4vawrZp~f?-On z3v&$kVj(x4;(?V{RGdk&6m*3{oWEx^^NxtG`*evK9!7Madku0a@18j=Z2W*+G9bfH z6f^pyqmuZ!*f8HVw6jH%A3AOvFYRipu?DxLnyu9}>Lzf=jB*FsEx3Jh1O1B+3vBVMPd1q#A7A@b6sW0;H!oeoD(bS^qW&@-M;@+CZCg_3e z_Hefr?K`p!U51H+7zfRtdSLwkk|{m<`cY4yOMCjgrMl$x$FT;~6!$&}H|N?|mpe@Xd+X(y z#;q)Ta#$(F;Y$VLjf^uZk5b>TI=WHq8U3rveb;I0u2rG;*v`*&r7EHpJmikvpvU$Y zgr(^6D$sKtCaE1W;g@q`Z?akhJt-#69ha9^e-dtL-gSi&-uQeG{3_Yv1Or#{ZCjQ} zRs$~6D?Bp&yi0yMhVKrqc*sYGav79~Z2#nTU&}58wwjz>3K+TIo^qj7sFF-{7UF zwHeN{k%LhEj_b~Cd#rk%t=hZwRAS`MN2E5z*83+LH?5@FzS@&jnZo$QSfJ(g_de6E z2{st%S`*$q&8LTHjzOjIV@Lqanfie>0!bz0=Hb|Oy(uID;}u}v3H_)E4Mh|98j(;e z6QS^a%bMFFA{N{eIKr4ZIXi9KX7!;C8GrkIYXj|KP=5h;K3Uy4wtbrw-J8 zj=>3kDmcaj0<*{PO{-JtuQrFExlQYeX9KfQn(t^Z2(c%|f% z9^Tg*x^`A1y>3>Iib6;Xu}wdIIVJQ&`O{Po`_x3&O9bE<20VW;9HUdfj}XPGN;lWT z^&yQuY2tJJwVJ4@Q+lX08%!G>(I}N4W2|^tUgZ=kU*AOcK-1}!XwM*@+895Mb`)ej zhw#pUWiEj*{pZscBZfl+Jy^x`qx@BI4b6lV4`<)QLe%jBUrt`(>`RI#JBQ7Ob+8rZ>amG9uA|v&~XHu`$Gf0Gpn{p&EQC5&jz7*Kj*vp1Ng$4 zH8pW&vL1X-H7!gtAbbdE;xV~;iC$6*`BloM(BSL$y@?fOarYOJ-Fiyk(q?K5Q6`T- zCLkdqN}j5E*^CJOGmvvMRZlAsFeaHB=lX(PsgaFO_Fdpjp{u|bUr56WIQb5|g*8v| zbFhL5Zq9F*1r+^k6@G(6Qba>p?Vq^2RW4)2a@469xcg*xdup+OX%dzGtK7)~$T9xN zZIad57OwlK0e0)}9&OF`F!pxbl>6^>pAx{I-;wbR1IQfVk7W$Tst zmW7{`mgH2=-v@>@v{!cA8p+-JPuMpzGzlEq2&Da7)(%x9U2Pc~ynzjA^;CJT|Ao7- z<`%D)cWMY?4Cnwb;If5Dy%xzz`$gH(u>S7VX4c*0`INiXJ#*&7x8uuJK0Kl5(m} zFVdzH_tnD4x}{KpYX69XgUVaT4Y~O38;|kkjRP-ST|R6zCH3>bWfuZU5m*n@23@PX(8VE z*tTi~^JmsXR;}KyK_nfHw!5#CBzuD4A(#Z!^M|k%l=p%AOeRZ?58nZT#t>O=tY*B{LcEORY=pO z2KGqC@l_YfppAi(8nzUm%Nj9iQIo?VECC|g*5Z>$u3hkS1aEy11wpF4>%LZb;fXL2 zZ7|Q9`n6cK2zXmoNHT!a*Tu(Q9an)8NtYr?rRdsE1~?9#Is}mWz5H_%8|IfYd5P@=FUnsX+A?g+tLn~D z_Fo1RM3q}?*MF~6T0(g;-fc9e$ju+OK$^jc&4I=K!E z;K4AF0W|W%(*U5=?7Eqo>tti$+lP6_cBqIp89e&#){`ivzL1ApX6DmmQ*5i-ZgOe3 zsAMT=`YMCO*!Sd{rIC9;FvwvQI z?u`@pn8&h6Hi<@bhzjKTe<-LIGag5$(D>2RBhxRldz~AP78`HG5u%EdJ3%`WNsiYt zMxN32KZunL)K}eXRt<#gL+wPHe4=mH%gEQ&(Oi}uU^7Ve!+iH`0^twOWgQ9n z^zd&FvtDprZ@+4kP|iWWeR;-I(a!O~-G6#Wukm%tj9^KQM-y~2R;=LD&u^RMH6wg* zBWki_9%BqwD>b3!gEoDmR+3^5K340EDt3%xX7TY%@6g~ z*#3U1JAqdc);m0@E@@AsWlHUQMY2LqahdU=lP&wKS6)?z<~dGyr(3U}Rr1DMZ|8d) zwWBE)fC&?fLbhBjct4Pj5=vNiA+QNxfOq=vklAQxtYhGwFSoOAH7L?u=?L z$SUu&pg@*uo9RPtbj9{x-V%9l&04`!4Mr9kW(6E3H?&_^I0&-me%$?-zOf?N5gU$$DZ$yc}XKYl4jeSz0*A?<=1NHo}$KL%r8x zg%jhh#X*|zjUaLLg_^D8p_(s>s(;D^M0o;{+#KJGcR#iqmlnX0wPW6G<+KtAw-Z{| zgJifef?@|CY-PH<#G+{&(uy?!&k7!man@el=&_qiz@JWXNvuq)hgX^p<*gAoN7FTe z4`;%P94vV8UqUafL~>^FbneqC_H*&+1hzfk0#8h3((-@Af-NSJJDjMPhA7l#_s+Dt zzz_kWWbAWtEwk4+8!sk}=)II~PN@{bcm~aDNj~5wwxrocWIH;&MDo4BGTnuqJl%9* zL6}LO5{#D~<^YHw_E&LR`T<~;LVeB{D;dR$cKL@TPS|QO*Ab*-E^c0-Kh+#a;c1p9 zxr53vbxwE#9TvB7Wz?hwUI9Rh@aFirnYcri*vv^8v5g8j)?@;;OFu&-eaw+5tx7TT zTc&LxbWD6Okrc}58@(P)Nr1D(OY&C$_;eGobw3|Bg-1nO6D6WxGH^DjCO#bZA(z1G zmZqLcLNH@#yD&-Zt(#6nK|WVBRwe0x>@R>l;$3sa~Zq2$ZzOB%Tjf*FKK1nb0}40Mj`F<3*6*wM#1u|&**fwPpf z;MA%nULz0Vz|)^l@*#?68u!BX4K_MT8A9%v6k_EcU2I|!SzC74ty+F(dv5;)29k?* z&FAUYJK$8xO`IB4x$Ib z%Q;&Rrr)z%cxqxuu2;?>qtJ&uJvOv;nZw&$V!UlL;Hg#_&(<5uDx2oOfz(hmfpTzp zVuS*O(w;!TPaHpI;~pC^Q`RX-9P?_?*R6j3P%7MdpHyH1Jo4@reEv)Uk$T zyaVOPsN`j~U}zVm9Ore20AHlYC>nyJqU8l|r-;O{LoiKm;oB4rits;qM;+_YqwQ6G ztL4cDX(2-ldKLxj;XMkhGj%wdnJxsjlq!aoho7+JDBOOh=+3Ti4RyX<>T(KWVTv`i za$=zkY)D-r->O$yWA->E7K^l&p0xG|ClY%f{^UAy$?8P^TQ4LqN7E5fEmyNsWmD}< z>PxU8dfZ^-OZKgQ{rs@+mq&5ST%EnXEyhMx?+53ZheZor-oD9aYYbWmE$0{dn-Ii9 zmCju%{Re2of18<;l!fR^P`SF-R)cumdKgk$@? zWxG;~9?0VJSc6Hvzs?^81N5=Oauh`3E$xaCh-1lT&t9C4(a4?iMsY0^l~@-4>ZFY) zfMtA@DLM(iE0j^a(QoiRgh(QNdyHP)z-5Pty6)Y!1ag(@46xnp&fOfq9w0wUcRPP- zk?-qhw>B=@M~pZS)HOCIF!!5WmkMuH$3NM!m6<)*9f1>ybLL4sPkdtIEqoOLP8k4D zLaO+}ulvjbjCP41?n;`Zi&6OKU37IVEMhkM5l zis~V+yZ3ZQ6V7#*t(*y{+s{J*kX!xzuBd}x(J$lXW3kuws^gDPprtiPA(i zpwwye?ce{_;pLG<%| zL|!5iLgMPY6%CmLk{=_&1DF$zCV9|V5F%iM%5FyC;!o~uasQ^ijb@q>RjBQCisRg> zQQ*pFJbMac@vZFT;dpC==-t_*eO85g)^wd(ZUvp7Px3Va`k)+>Ty9WW?OylAxALn~ z?GOKBMQZ14moq?`>LlcuT~Dqp~}ak>WZ#C*;C~w$;Gn7`IHuE z^tu^Qo)+kCh#Vhrx!?-E%(H^Ur z799OJMu9)pp#EzNo+9H>?WB4QOvf2Nx6#G*Qu$Ju5q6EC_bhTrglv-De?%npa84Fl zfY#CC51KX!uf70?)QSp3#^Ge^t4v3$(LBs8`2AZMEkhcpqvX7q2jug>dB4pQv2cR> z{v_5l?39B9MOr=fMK6(RF^Q!N<;UjOy#n|7p&~~r=RKovRI8p%1z;-=-6nWUkI9y47`re3GI=9+V^F~@ku?}^%MCPjRH@I|=@pB}Fav9tnBzSrYH6VTY5&sCI?3HE?m%jI6kN%S< z(>|7wsgx)Cd6zML;$f@cg%}@Z6tEkBffsDEI)Z7D%JuJcjO0JuU&tlQ*_3n&m!mpl z-zCd0&#Fl}U`?iqZISitRS;5_DRkh@cDG)vHa1WbFn0e$5dO3ByB?bz8RWkAmsze< z^Tp1)L+KeaQv2Bac1Cu_a{PyGfT~^cut{?`t|Zf9&z)KMOFFXnrL1JWB_Jf)j z?Bho=sb~u<0l31H$TXa&F-iQ$BQu5I>JP2ITHvNXhY{_Re4r#`sg03;*vJt^;@TQv zg@8PPtj|a#w0B;0*-L+)WtIf%TXY9TJ#qyc!u9y8^p~??+Pu#i*5e(_eWNcSa=5cJ z`?^X%<|T@8-SW_24;H7KNBcdNqFt};ZOw2!s9(0K>EqqokxPB=PQim7(U$l{MD>tl z_W(D&@bGgnKS`Z0y0J)=nV6d_pQs#pdH=pm32kleIUv9^AHlRr%bpEt8QPpq&rXn` z{rOTaW-WW}R2cgRyRurl%ViF416QgS6#z&WJYXH4QiEd?F$YeN9p&k~xbAwtAW<75 z=c4u^cR$lpUx0`>y5m3cGCg*S4j$PF5Ip2si6-}!ZHeB}VGcJ+z zP-kKrAWz8}kMZTA8@1Fjg%iImP^o_>|2W_AkyZy=am}NmCyhjtBFgvN7oM?l4Q#qS z-712N?U{Lur2?POpKas<;+bydz5y2TC5g5{fsMwgsFq3Xy`@Cup^w(QLkx1rl8_Qr zTqND)l8Ju<@fb-g_p*ygvO6TuFYStD2QvS&50wgoa2r1WAv?x5bUxBEB4xlLLL8QJ zbEwW}^N&CcN8i>D$HtyBL*^C(+rl86FLjiLjNv^A(oP~iPlsVBTltb56KFVc5$@5laKkHV6ZtF?LTu=D+jtd zddC_2dZm4vekO;4=P%t+=4$=rU6*rqMJUfl@%fr$o=yTyrXH7dm9xr0F@J$rkJQ#= z4+FCqNEVmG108vkyhU%ZvibRrVqLLsg1Xym$KM)1N+8fJ`*@FxZGZgp7Q)ek$d|(i>mYLiHUX&Ay3z)U;=Pl@wD`Q&Q%TIP;U->`c zu#lh2{EA6#o^my|UhTq7bXi9zf^#B_A#6$Gl32@k-{EVz>`E*-X{d1sS(l1FvAf@3 z9@E9n!#ZQ%#WC`s#_g6Ha9W0WD3(qd%Rgk~R`@Nw@80Q#HU1$_L+}20sxItcGFKw! zLj1X{V{7wG%YyGp01n}!02G19*l+|3$~enqW?ElQ`aq z82k=OpEkLc02cRn(rnFcoSZ#z1B+YvL2lbV8un5H;!w7#A1@p2?@VeuzPwzW)LL71C%SOoozz?Z^;zN2zjwMZE&hC9WOo%> z{nLuOGtR?R?>bu!F>3pwVz}-&ODDf{`zbdDkNr!ab?jpZx2sxK3CmlBfCuy+w%nw1 zgr6BJo=d;qE`Iczg)-02qcDL@qsZ@>xj4!_9oQ|0t7La0MNuAxxo`z?ytO!Zh z*TN`gL;r_6uD5zJ!{^W1Y5f9y@pLj?yZE1;?G~-B#%$;G{*e0L<_T1=gb@?ijWFZz z{H<VtV;oAEZcl*;`Vu@ydo^!pW81f-eZ>B@tG$X<0S#SI6jJ@#;qb;|^ z6s0f~ys%z6@Kmi4^vZ+S(lYXW^Rfm=^#^cc56Gyiji@MsU?||�zEMSczCeaU)Cv zR|4=xmHWoP2BWDt3vr=I=ChrR{zxcp`V!zGVl!T#3Nj%_W4{?~rCcR4l zbb*l}rP8032`AhLHgXm|B3`C)eG3xCev~OmGIYioVI05BmH7ambHVv4<^#~9W8ddt zm62kd;qIpx8y0=`d)h47IPT3^o|p6cZmY?sw4YLV8Gd;Ym;RSDr>twP!(}02!sUM+ zi+hm24B5179nF=bF%$JkS#!7~xNQYM(q4XN5a#dPmnEc$a+h1P>4QDRGW`L42)>qb z^%$;X9iVQb8|Yki?-o#I&YFPpdb4d<@FlATMy{8e7|E=UYs>D z-^X;im24G4e5UA&2xX1J*c**8m44bNwx3ZJLm!7ewFz(!ZYDOlUsYyJb1Ywu9?Us6 zJdqI&g~=8_P4sp8Y*cn5v8I#qjw@-a%JjROK{DX$#o4bt?1?#k>X))^bJe>i44@Mz zjl_w6z_V!dp}!i=!KX%-=qJ%^UC>q?Sa-jfbD!R9ds4RiA@FK3#Q4Tt@KqQ9QVG1- z2sKQ)WVr0&@Q{XlWgU5Wp1+L!O1ttKC*7daj7^;QksJ2U&>VfeTwVZ8JCjBrbRi1X zIy9D+p2RoQK*z;dRb5Mh=oObCbMZEm$Vdorl%p!aT0?=Vi&GVNwc znz1g|%dGu85)&%dxj^QjFS649qe=YH7C&CnOu5e@Ko2jo>xj25Am6<%B=Ff1TyOI@ z365&KiSnq#ew!4EVoDH?|13g(RaZW`SwJc5RmhtF&K8e12L)-iA9J}RYdkPaI|ZRV zf~<*tZP~EQu@QQjV{(rP$4dzBxp6#}bYsnIM|)(d`V1gm0;r;gz%=f8XvF`EkL1H1 z0S5DF*R7{=tzLV1_V!{Q;qf_ayv($=-E8N_lORUCjcqCMxyxETFGAJ^`DSB}`Nj;EEVuj(MOw4rLWkTLPy^gid&maB@^R}CXY_3e3jT zB?ofHRd5lHic@D8=Z{b6voB3UJTIGSYdxy#Ps~g7>qS}BF0QBjwcmG0oXriMMbC*% zY6){wyI6i)@Ar@#BOQnbZ|E-oEgT`|OVs>85)*Ts=WFQyN$~q$P^lqruv|&=58XLf zP)Zq0e7Z>t+A?=mtFpNrSN1P@FaDXkFGg6Of5Lkj;2WnS4j#(BqhOw1Xm0-HOaC{8 zju?U&_HP*%d2(|c7kA2C9M=sI0C*iJ0W>B*umm)g=Z8c5Yf=f~!R^`I^mo#=0%KUm zDRY_}H>a^0?n}`Xp+t#U!Bxnerd@l~8>#Go{Q197tIQdFI4qZw@7BD=8Olex#@EN6 z*BDYi#8AqnCKqV3A!2$g&A+FzFshk0mYz(8P6v&_=y~eRMMr=p`}}k>_Xy|YpY9-A zT8V`}37}GFD94rW{dIq7Zi4^ib^w-Mu}aww)l#RDxeB$auF7h+ouPzbMwCBFO#rE^ zc17Vx{9pdyf4l!)N#a#fiQZ(Ld>S4I3d6LTX7TL*fbbI4s{;_Q`#&yH<0bzC#7heV zK)m4DwaNZvIR523RB9kcgWK0R%YMoGcQCt-B^hrqS8{-ew&Sz1-VU7ZYNiwZ!>Q{6uc{pG|Gn}&H|4$I#|3K0SqWS=KfD11G z!ij=ler!piV+TBmYK|YGNucWgo^QW=7ID#{rk9B{u7|6@ceBpj@G|s$5LIUVrJ1wd25u$!jnsAK1z> zJ`UhRaW8$z-GJp~GA^U~52Mk9x<8Tam%{5({Qy)T%7jL6dWYCi{-_6_bX+O*jjvn) zSh;^Dv+an3L1JGCjQww5!5v5I)!)ysl}kMEgcoD%$9w{>EZ)2Q@~Z!yo+{Xc(t%8A zsMfSG7cqwnkxET^O=><{Y#cR`&ckUh-u&+$KQIpzenI`BA6~2vWlg|{`-CGXvhu!w zquc=sLpJL_f*+B6Hp%~5sE^fu`&Cq$tUL&YySY}bt?6b2SYP(3kBJD?(*FCW2Ye4P z5imT=db&LAW=FBOas#Pggsg1N$={PE1s+egxBEbaI!bLkkcNPw z=$-198o}4y0-MT10!g0!@7aX!06t1U0fBcff5Dx&7kj*PFROlZT$@@By z1g@!($0$CC`foXi|MlTOCLmaRU{yx=57!d=0=z^>J(#~F{=1Fpf9@o&0FrPtGuz<* z&8GeDPpB2&-);wCU#tJ=?FM{)Nd?rCUlB0;{=>Cm-jCCgy5X@D|2RKMqXhs(+Lh^V z?Ei4B(D-*AX34=GR@g%$7M@Syw*2&sXO@UyFPYK4s3yY{`v(2`2X_6fDWl)HMz#V0#4isa2icN zjgT+AA{^R=&wS;)n*d+K>7_g=wCOxsv>KP`QQ0z$ zIz=r459h;~B9mv+trI5>>os1HKfpsW%Jf)1sh4$k(t25`8BYO_xS|s1TV_e++Q+Q@ zpkiWDg;S{C=H)I4JM0ZYCh3X zTrG zv1N*l38IhPdn|>I%2peo+Mq>jTerV(*zzX%TUBnrz-(npE0x=RhW!2Jez4gES!!C5 zQD8n_u8wnAD3gLpTb2eKYCiJc6Hfy?Ui(3&cm6hG>vgP)?LyctP#pLIC*A#bTAshI zp9$6JXl)eVrUM*j8fZmSyqbxVPXQ9Lctem>*gpI(wd8G>n$`sIX#J@$h`0;W*z%3K z<<$UScnB<&wgp0qQ@;!9ohq9Om|CF|*WZ7gAgMp!3n&l?`gpb^gT zNMN$I(=vMzWOj6ve?u`X5)IlWuHZx4ssjO!Bb_l=gr*}q0JOgbynKe74*REbO`~!+ zyfH6ZsmnKs6}}p4+w#7oCWQi)Fyuq@_{@&$hE4!UJe~ba=th)O!3b(@u3DK}CB|5k zf{Fu(8AN_FRr5ad#NF-#)<>n2Wa$!A8HvtATo3zz91~ZNIr{TpLsi&hzW6BaZjxAg zJj-LF+rHBc@dOjob=`7-wvj>m<0b7Cfbi7tBgn}3I`vzhOsVK+e#=&HXfuHCE#VD- zG#yPd(NtEs2r8;A*rhODByvY5g$@alK73ojo{_SH;qC&gMn^sg*O0 z0N50%c@807mS`8&1386M*oR6%cnVId1wE*Iz!gpT`izjzbsO1g;0hm59pR$?GT4ZS z#yetoe6c9I&a$$r#W>1^B>X1N`{3_#2R!=Uml!`aex59}iM#;2C#4%*>+dw81X|s( zv+CwVaHvXL&mVu4Oc2@u$R4Z0W*aG?*QRZqdkKj+sqpWXiIvW z@1COp^HI%`ZpS%MtQ^FGy>R%_*LxWrat>!}+I8QTDNkEgAwT-qlSHQ(YX4cI5!ef> z2C|85h{E1ow}93|VK2kU>O7Ul7W5fPG0GcHS}Ce1J$I|hf^Eg67}*9w0V%ex?puGa zR*PAcMzdoX%DG-IN+hs|pOA-{N=MX=^^7qiZSpa=cNYw|*)|L}gnh=<07qT_D;uO; zehAB2cz!R>nWIRZzM%%AqS(VZP3s$J)Rx3hUf+}xKCbcu+qO9+HSRX<=WhXFpS`wf z*)IX(>n#u7!!rPCPYu)pYLCdUv$6)xXFUffLnD&se?P;}VcJ_x@j>nLZ< zI-Y#(%5hyln$gL23yZnrwBi}mg$J08)Meo)?3@UJpSr0gooK&cL#rkh1_tB(yBM0OykoH3H|^je+PQ3atbo3`=hNo1@O(()jRLPuXsqPVzhj0> zHjfvIa!KbXMW5Gz)BUb9)Sc(=#ClKzy?`CLJ=QHA6zC`#FPgb^rC`k3~`iF=fxos;Lqd9k-O(MR-I39;?zLqCph17N!y49z!(C3BVPX* z>d}zOhRy?zFm^FQ?wI>TevjS!*iM&HzgWb{U66ll*@7|`FGP27R@~@_GtI2 z!oRs|hJ5FFJA2rjM8xBy)_f3a{(Lzwao-XyqBc*bU9U_-fOQ8(PyGR_&#;+5O8XfY zTuYWJd(#*0;gtdg$0jXuE#VMU@SW7{Du*K#cEdh|ntkXu;Q;s)M?p=!^58o6LB>hf zfvfNX>bv{3M*TSe0<0$Z7y;=l1en}st+QCW+ER?GwWYJ)%SXTDFaFh8;_%=YA; z3XIo#na}hp^1^&J6h6w*%3lG3>cA0-@DRhkaOT<1<%70d!e^2%py}>~4?qM*Z***I zMXOvHy$Fg(-tK`iNpjppSi>5RRklzhpUWJn8H7tQL%#tTtHNk1*KqB$+0J>} z$kqrIt!fz?Uh&+NJKu{ghjYABHRuPxU9R zo)s8Z_n04v`ecOBD(eA=iq9vV(#Dhq&H5iWC|gE*A_&mI0=l)5Ujveq$umN3P%>1~ zIITI3G|rw!C_|i?b0#2j57~>;UPb=cocNm-$iZXd{Bqe%(O>4ZLvz{0nF7K?8z%9V zj1xnegs7xUXtYWp1|Oc!J)G%)aCGr=+(p<6f&s}cSf94DcHi2pxeD!^b!mWRy+z8m zqhD%kRB^m2bT_u&FF!)af#L3IcJ_4Jr*#TjCw4*YP*hzTp?uf^hYSFV4p zI83IwYCm0EiD5srmi zH>hc#kg;LK49dx6Tlyn_-W&~W=~(<(mr26*6dr% z9XrPbz37%2&K4(>0JVYEV+lmNH^2?$Lj{Vi%LKgNh&3i?T;Q$c@t|K}UKrLxxOB;e z*~|~;l<(k0?@SMG7xm0MX}InKp}SyqJet7@K8w+Bje{zc9Xvsheg#mcj;^O059Fa# zM7kuMqY(CmJ(Fj0NP6~qy5VFk-`ZX4Lz_=dPQDz4UEb8z>wR3!E4AP!T@bp5o#oZb zjHM=UcvWSLHQ7(zw(u7gxJ2{y`W?VXN|&Afx8RJzpDkA+f+H!4|C1iYnJnwp6V4$3 z1LXK3)nvMRHO|k=F{nX`PC zF7Zrnut5hIr0;1z*MqVOIj<>ofD*W;X`2j2 zAsd*QIQ&+!!?uYcJ)13}%YoOh1gpNMr^TjSQ3&V`AERxj<&q-yQnstAFJ83MQ6)NH z1-tcv@Oa};p|%b&ysIzZQiXmW=-lbnj+tdIjzDbuRs|a(_S+$wxlisRiR+oy^{~W7 zh8YMYWjP_krvn zvp%Cj!qP&VPWW*kAEQyVe~H@cOco!gC!FH0?tlK`IoD-I=}JNc!XV!iAXUJ;ta*%e z3&GbvubT5lR>(;Yssv$tQEt@BfG=&5@vH}nuZPI>iT+R!;KX}UJ3Rxms+cZS$ET6=j(NSx0c}KUkV5O)73Cq1YSLA z8ojn|IK$ahN~`#{9;_6DEcjX4h1}*#`xCQHnMhK{=mJ2E8mnw8=ctYk+4ir-yNu#C{YwGN zbeLb*+KraQig){%bNjKwww?PMBo`Lk5r$~yyg=Yz|FEjEh$9g3YgN@(1^5-EA|1_F zST7NHgkGdz-*-v49lfMrUJ5&Jg9H$ec=bBK43RtdTC^6-!dwWBlpm44$V26o9tAIF zN)5pq(l{@i5EFXN^`Yiwea#ie*+K4d?JEw&__QSDKK|VtiT^z7>v5K|)pUIXGcHXQ z#bzyQUoe+z1gpu28hv>C3}=)@OR^LpE#CV2ER8MHFEBO)M>@hv$u2}NL;^@Ugv5!4 zbq{knTQAcb??x|~EklH>KJQJBT`GD>jA~8|;f`*(DLRE@weqIhRN|ViKrXPR!0pG$SF>O0gpjtF5iSOv@-HPQ3-?k8? zE9KYPO*51fUdHy#pG^e3q!!?Yj-&P3$5oGq)6G$~Mg16mTkOV_c4~=5K@HS&q9iN6 zHYmudZl$`&TJt==GpgXgo{Y@u>m?UzOr2!ZM>1;U)v%`_)iZ)^Kx$7ybfSuu;GwfH zU!Vt6K24PS`+tpFuOci_tw50p6`aLX>|k>|ol@V>`0^wu$gZrp)_QwrZgSBBft@c= z3h$>UM8hkD-2d4QNE+`|wiF~AJ?hrJcB}P59KE03@AJ;#4XZ!aGTo5FJ{eq8(_n>iJVwk{vq!V+ zy^;6==X-0JmIB)Dk?C>l4P=H)_jWbvj5ADW&!&VxCIadmP#k2s{gjjm zc+OQX za{JD%<_M=m)jozdB`c=XV#p=LWy?DA*H`!ryt8n@Qy_n-qRns|E21XhQv3ap?sKM@ zy7LYUVH4M!PcIP6hqJ`kmGW-f`BQD-b}8)6V8OKNt%#yXF2Q;A;l(rj4e6@bJK^)& zuyH0_L(fP4g1u`^g1$duikxjNC-7q5WE|<#)XMQ8M2)e>KIep zgc4RQ+Q*6KbjGy~?sHkB(Ih2_M-nb{?%nuQ-W&mesneH1tHec=QJio`9riVvgzXMK zEpRiu4YH1>E?rq^(hJ#FM6DREy~BDJ=hF3Pv>|-{!w@{w#o9wq?Lm$Ok+jR1(Y-nz zCj#OA-T4j?Hov7DjBKR4i;jZ$v!(9gBl#7-9e(c59d?CgxV1BU)F2uUK=EUg;Rm8?Rl8 z7*wh_qke<~;FIhR5}-i57vcS|Wq>yKooVQAs6wYnEye14n*w@j7OZr9aQ_EL}m zhEi~g4}w5_=$NQB?S)b-&7cK9VQ`@?zMd8!8XTw4q=#(RX-czkL7F;}Bnwz70n zMaxk>L1C%5?BrI&ut24^V`lUA0I3!bq3X+S4V6ZE@CTyjFXAX79n-9Il*c zi1G|*0#gM1+rnX6PxmqK8_whRJ=O1&vC_x{FgZ}4Ch#N@d)CK6AVYZz+ng#EgJZ$J z)@X^6J<9&iedy(e>_aAYI{eV{%YcJjGI@bOPBO|DN4i*d)E($;mv%#z=OhpW@+Up$ z9g2HYI&Z&M6W(otDdsum0zX*&ufdBa{c#&@454EoXq33{c137&>7X-`_&8K} zty4Rrm8yVDkZga1+c>$9&=H1bD&C_&-qdUjdz$Y| zP+X;x`n!c7q8*)2d));~xzIaU*9TOYUr`xJf}G zhwZOI+2D7tQyQG0(X5^`W-Q(}eP}orXpdb3m{$=nXp)ZZL!=E+as!t20%&7o+ybC2 zRjh@8j<>}hj1?c!ar>(TOkBl1XUD)GwC%9ChE?!pMrR>)CmPkZRKOz~-z?FWC=4#2IA zkVBKB4>k2_51&hRxJvD-m$d3*k(zf;O^y4XHcbs3PwRqnm_~)Gpd0cNpM4Z|Hb+E9-5s8nee(T|0OrE$&|vUOABs1?h_ z4tfY8_oOWxH>ocY9c~4RJ70wE9E+?Q$ubDk=tZc>e)^eF)uXb1bBK0s17%@bxAZ&* z7s8OIk+@6`BoE{6oHVR)z!0smT|CQ?zlTnr_WDHo8l2BBq&15ajqO|>LU%|Spoi7w zwMdZMJSzjacjA>szV#7poRQ=3)>7L_Qo%9oqN4LE0J*A>$uoi7@ZBX}JcBE}M=MHd zU}6ql)^J3sHA>*}oYY?YVl99R`K#@@cgvjST)NWNm5|8|1y{&W^1?`k3C6V2moL*? zAstSIVnMo(PM^}kx1{Lr(Wo>19p$h}DAqDYD4ZnCXoKJBl-I#+eECF^WUmLocR`4O zGgvm+8ENfcCz~&YT(PYl~R9R8>$Xg#H9#SVh>TsM5AW`^A)uaz7+vc?@Ly4_Wxl-26A^mSX zq;a+rk?T8m7A*5>!GhmP#0bYhXucFMVV-z#MniJji;DTuDg7;5;(0Ao538gJX(N1_ zMf!*%ACJ|Z^kaH`Kk#=rI>{7-t7T%Sau^V@s18$Nj&OoL+n7_B(5?HsfPAPN5~{wT zx1RIYSJTX0o;)n936iH&QO8toeYaC=5PbkP?DJ=0Puv$-be0*-(o<|Q3qq+Oa@hhG zvZ3$90pwkX6W{$#jJ`Ym<9<=)UEAewmsIO>~5`}$Az9gBu`T*`6?kjBSn zveP|ehza(b%23>;<9+O@wkK%H9CEWutJs%ESIN#IT<@c*2CC=VWWoijxd1 z?3{sk>!ckh7nti%ug1%3$s0WNXCSG}!v|#5o4ZFfH@>N_VRozUm;%y5y)~q24|x# z9_u7omRF_r&z~ok58zZ_5$9zS8H8*5HZ{>5so=6K!dSLKRKeU`vW)C}Ox_H>yPBqwu<2380MGLLK z9V~dB(i3D~V|a?`x1Y^#3l2dCnED#z7D(S48A~Nw48P^Mx84PBeJgcl?lpl8U+wAJ zM8cwa1XY14wN97_k<49S41HKxXt}BOQk{4~1K+>g$;PB`Ots*Zzj5jgm5nz)&cmf0 zGzrKvEe#V@Qx47lc+s?I<}Jq8tSoT;7qZhW=2CK&k4~hLqq}Yu(>v5SDqOy?cnbrZ zQf+p_Hze)!%%%PPNyQ^24F zhs{i3p?Cm0cn_1r&Y~@pd25Wvt%!5od74^Ot$~G;9D&xzc z#dyLwVG6SMZa~#cxgqIuDbZYrj^P*?FVPXE!5NEuNPsn|%PuD&ElT(b>tcvEnz#4^ zgPL;i4W&dfn9M1Ox{Py;Al@*PuY&(7^`uS>D^rh&P<=lB19K4*4j}*wh7(fYK*OZB z;1CuxbsQxx$M)k55Y z+0g)fm+chy7T}f)LNORE)42H|1aC=c|Clz~C^j7A$gISggA5O~oWr(MbBRzc%!G=( zCEUo|Nj`Ay1#DL~FNj-9r@ zy~e`{eb1!Rsl?Rx!HuZ5fK^j2q%F{{y^L$h96Ag1g~=y{LtT!g(0C!IZ|rAf@Zse7 z%MWNl#EAnHeCwlw*^O(t1DnSK89;)2BN=G;XuU7m2Ju%qc~95V@)#E-DBhc-VGZy) zj5)_}s^Ts4C$GQ0>kunyD|LEJGFE{}G_qNyu7!W?XOjr&hXJD4kO#SE`Lt>bq~^$< z8O2rQ_9;`b`AaRvcIPW+J%n3B@$`nV3x>R9c0AM&fU7fvYg zKQ=LQcHtp2W{%pTaG*lo{q;L45f5T#5jJs#;V8PwRUQl4_A1^jE6xu9vwze9WkOO5aY1G}OVCKH;Vu8ZUt0*?j~cXQRhl!k*_G z5g(CiJ5edV6knV{8&LEssd#QzZFctOkLo~aAxu!O!-)Gxfg8jkOT+mmZ$Jq%wS(lc zGi&j9yKqptTvpemL^{5k4NgtSx{vhIy+kzzLsgmf>-%RgJxl;A&zHTvEGv-#w$U2K zy5OP5QA}+3(CkgbyVpFel{utx0aw7&U5oKyBZvr>)`XDzA`i_k4Z0^Tqzr{oiMvuE zZ12IoK(^p5Kj#gd8XKGQ&WuE`Mf8_66thCLp#+`bx0V|+K3jsS({{kmYqp~hrdZC@ ziNy{Y?{AfhM6r|sqJaxhh?-v6Bpmy1*P9-LOYtEAr8~u&Rne+W1470~vmR1;j+riF zUY!jJJi&C^KAeK&-Z0FxM%T$9nH`T!x2~GMV*}zp0k>z)FwM1mz+SjBr)NkBa|iVe ztpZC^3eTN5B+jTWhdeamU{d*97j+#CI^b`JG|fzoOBlW-b=t)_Bt3>9L8AP~B9Mvo zxfraVv-3K;?`?`ma4$)CI}KyRV?b)s>Bfb8(@tUSYstGJ3^?0+JmtF>*9YEN4^L+< zULT+{sM#0vXr|Tyvv8ahn=hMzkF!C{zLg(ZpRQHz1Z>)it2j>uF#RTX(?zeO#hM3p zn^1;bH+$XydRX5A^msPVFDHI;yf}>=NbFterl&1%FI=AggCB|(mc|D;-33AnyQi<+ z9Vrb;vs}y^vP9)OAYlO8M=1#O?8HdHh&ae>P26X$M0fgiOgiF6+PIibJ78_TD*N^#f*j+sX)Hg zW;^q3ryWz|Mj~v8p7K=wX7Y$yeCQ?FP7K^Dyy`6XhdJh6nM@Atm)j%jzLFsL9?*>< z$JRz!$(>VZW9A|!ndBV#$-RU%1*t87#<~^%A6pIUfvH_Vw(F-!&$qFqQR;4!Uj7#I_f1!d z%So3&F!a$=r8441@;5gxDmK+0r*^jdi$hC(8i8}QDudH0W6t+#VfS6k>R_65+seM7o&p*BnK$j0^QC0v{sTwbpM2%JO4D-$R2^uHKj$V zk_h5$Irw?x1Z4deUk$DKZ?6~yp1PP^ri|8)w0LW}Q+5fs!3)Bw#iUPtqJVd! zPjvP7_&mx9rRf$Kl0UGE3%LR!!OX2_zjduVTORi#_!1u_@VKBQ?k(TaA{u;VKUy~r zMNgxPbNgikB29GYil0n)q19OYp zf0*psbCQ}*jyEwIvS>3Jc!{qt7fl!EU`rOTq)x|g66VBca(X2ow zqle(m=-XUiDe3L2yu_vtcbpvPR>S@Q{jS=U604&y#}P5ea~8t#9-a}!E%uyh5ZTx> zw_BTg3oTpMw@E zx}!+T#$TqE=Witl;YX0~rQhn-=hM%K0R4^`!ur>hMX4bpAi7a|^moJeDPYo$6^AOi z)Qn8-uURJQIlTbTL|Vatm?lxlydIC&%*{QlU$=UyA2&V_rG6rC znE6WbjYqfHiAm_<<8kscQ0st!jwJW@!Dlw`xBcJ(7~qWx62uCj3UnybDP(#ce!qFL zZclqI8vey)Hv`YulEpt=&Uf+WGv!x`J2PBl;>1<1y$nN4x}Him(;lAUJHJ-h<4>EF zqjSwy)#v(!Yi&q3-zwS(k-aB4#y(#mY`vbA%_S*8@)#IkIE=5}B_mqvomT!5Oy=LI zp*aMK>+C$*m&X)II;iN+ZdXI2>p*y>_J~xjG}Yg77Q&OjbU-cWAESq$eLfCx13*@A z1LPa`LQ47r879s*x@Q}m`UB_`)T!k&c-3zXXQfvG8&s1moFWlYAc@Cx3ex4Z*&!Go>)k~_gV&)Pba5@P1&;HzK{oY?+ z8Gjva=k@#=BxUysy+`Zl9~ER!B*FX8o5nGDhFOHaqPCT|U0X4>pCAOZwGzB3%aIp!`DE@05+Z@?n^byTiyOCvw z+mO_M7Spn+y8lIcs%n{4wDjkGv`F1IvxBK!-q|+_R?PfA433^fo9&gQKAfT?ei+o- zrY|(cdmMyQ^Q>HRDDu}GkVtIEOs}j0epo#VK@>mR+g?T*1Hr17dsj#J9xBQ|Zg{hk z`72rgr*{&=zklkEM(Q#eZf5MdsVBt%fIR!)&mqs z zjgp*=Wq_pfUp0R`wlkk^<+AlcFp16e6lLjSZW)sQbD^!>h2J!&(fbvu-uM4{0V)en zoYGgjDUlD+EXimg&~Tm8f+tJqsEJA4B5>W9YuUQ(o`Ho0C&JV)YV&+$>ySBRwF0@V zTuE=BqMklCrpj^bwBv zRW_4fyXsXg9$0!|vUDH#xhAlOjnX~{=By9$VTB5AOk|!W5kd4|3-Qz|H;)QWuB=la zX^rWr`1j;|@m%izXzHMFbRF5%v(#xEA%IER%Pu0z%ZXE2tWr{3tQ;}^XMllf($0}5 z-6#0g(n`V=sbp?Kcb(PN_fuqy|sqIYbF}RcXz1wd4^X z-CI=XY0IGB1J;|_%ZH66`i8Zf43Ay)+!^XD2xftuRh;&FhO?Hd$b%5_LyQMK3Mz(f zNJ1RFc+Q!G79yPU;K`ina=l=+{n--TaSH=M8E*Ypn-2zldCtEtCL=}}F7>)2r_iY6 zX2MP_cll_QOOeAD#afs+z=S${DOkPe7#xpRP!KGTYL)@}w%KaqVdrAKsXmRUM%Ks; zAEP$S+GE=|xAV>qqvGiPgKG8mDb`+;MCX8Tbl5LhVwh*j!{30KZV^A|mKkU?a1h#q zcPA3EMT^LAeWaPT&dJY>(jy2wC;ah8b>hGyQWoc+-{8SfE6!VRCXE53Jq{;K@vCPZ zuVSYc39;E)OH)Xpgg_sJCe(=M`&w*bp6hhezRNs950hS^Oq{Iv=rwyDYkuP#nS}y@ z#{rd4NyOm^GF)&*Gq*w)eI~K@kr2lj|K+_|rcws!8&!30T8>jbY_R71T-84+&X#bq z(4$o!$<|e@Devj+68alsO zbm@SbvE4ZhqDIg*zjSJ4^I^zltu#b2;q>g7<#5gl;?>(s3X^Gxc7W`>=YGK!1K=|f zgw%8i?s1%sr@ONXrw}~rmF9_=VZp)ekS8o(;<475^XS0C>>xsxFoFMvxVMaoBiPz- z1A*Xf2`)i`OMu`OAO!cp-95Ow1q;C;xCD3C;K3b&4iemT7+~Nw=R4<ClVcUASS_jz~yXftI6sI%v-#3%9Q0H7!-l8L2fw&D)2EBrlVpu?j65dD_fF@tpJ zW9HljbFZNZ+y+9vhL5ji{C*)qbBlw`Ck-jPB zPu!B_1ItL}Fwb`Fo_pI;zJ6^hO` ziKC!7IX3f@Ju(Lz(Vp454*}4@o>Yg}sMmp8I4Z_kws9oL)Hs3zCP^lYY%ulOQU$W6ESx<;b$w(kpAq%2NNOS%>-RW z(d%)7S(3l({j@y_Y=XDn2x6Nyi(U$el2W&$56pFC@X6Br-Sq7)aE{uU(D zLs8+6__yiETe#<`%G-C>yyY@_FJ6~P?^rESBoAW{la{x-oNSV?q8_ckaX9qMxVzno ziy>gB%-EdQZ`9SwkA6!hwACojK$BV*sT`gYUqhzpgAfe*iGvE4kC+D7F8d{81cr5S zu6V#v7JLK+=m`5FB2sAhAlGA;56F%dMk6xFe2ClO`?VwOp`tW6^WLADoUkStEt?fy z520iVHG>90S(LiL)6i_I{;c+Wy5er`MSBF?>lyeUb{$o zd2RJGvuOO_^&gRqd@K>vngBV7&u<8eYGd?1Qi$}6u1_BYj+d*d&X)pDb0?-WQYH4V zJOpcT-kOw9bPuio;`9M=5l z)1cu+l{tOr$%89%z{ice@eEmHPBvP5BhbUK>_&$Brp%Hz+JRZ+^;Qp#$1h4FjO?!* z>5zO~!tK9r&=f{j*Re~oHV!CGyr{2{Q#A7y@SyhRiJ^!@m)Kz9?YF4{!_4rJv65-U zX7*MXeC%;=`B9nFUi^~xi=;WE-CYs{o%HiL(pO@wKJ z&MVQc|4+CmVQ`3xvi@!j`H_418nSkp#l8?GWr+tWR0x!;Q$a9KX>}y z;{`GDVuPxH|XbmK{rXvS}IN_zzZb#0&Wj5 z!jCCrhgVvP#S8LM{?hgDqaFAW+p%o&qmuK)KPLuJH3Ua*>2IOG>b`6b4^%9oh~)Pq zJK#<7IQssqa8y{%#o+t$pJH~18VKnj>b+;B!<6TDH{xGf=R(;B7q+Hg164U}M2gn-^g8UzW@M$KYyz#+`_8 zAj|)Ze3hVpqnneJHC1?v&f$+s(e=4L*B2*d|DpehG(fxGh0mJp{rj`}@4527!qXHD z-k#{z7K*EUAVykWV=_<*V7#S31-Ex^uX{q#=Elhc)Jvud)c_4vFvRU-rG$_bWa$U2 z4l+qBIy@e1B3aBjjdFI2?UDrVv_Aq@F^Pz;ukppv1PGjc@0T6bQ7h5zw|$*3XfUJ> z{%1#eDA#Y3*?;{#A32<_R0ZUOJPyjczxYd)a>YF#Vsx*`;Graeuo^{+k#rOPJ|2Ha z@`}GV@W#L#uvIY#+4ReciM@iSOCHlC~0Yg_Ml@VEeKNtdK?S(F0QM%g3mepecKMPQd2zU%R>j2MubGiubQ zww{PAlmI?J19};fQG_Mo_d>Q=ZO`W(fP6MW01NW3_xLXc0x9@AZ>MT|!w(+cbYku= ziJrFWsxQ@BzHD!fQQPgSc9#`Yd|@>S7fq)AX6MUK0Q;abPdZbyfBr?yu-#{Kh+Zue zm7unspxJtx0O1Fk4>?pNob*dXDX1oIsm>xUoy%K+yriM5NP_Ybx%|PsF#Q~c-T=T~ zqeSGneE>vUc6~Tcf;a#qiJ(Of-fQ54aKL)KW0& zWpD2>0pHQ6bgsb)v-S`Cy6q9o;7Dq0S&{K%?rV6h5&e6vs`b*iIldTw&-wMPEy)1>eq-%aszNwkuU+1`c=ik zmZD%~qupvz7&_UeH&_o{a=pqPQmRM7Q^p^+lJl8VU*yW1*ssFFsa~7Q$U621ldF)t zdgpC4>B4qTKH~B!ob^47RFbEz+~4TlJ6V)vl>JzRdM8(NfX%i z?PZ{z4X-ua9$kaQZY3#X+7-?$ak5fAV=n7hU@nVgd0XXAK5QjRuWh#SI-{q^mG|FU zOkDNdR_ICZ+@V(MC}l!G_hw`w-G+^zf&vKg-iCW!8)|5)ArRvd*%T}?8$F?OfS+<& zxb<=A0rqcZ_+}Gx8esm_c5SJa{Zm?@o0fTvsk7nZ0q{q=OphUiLbpNMPm7QXuA>^I z#p%+G4|e-4DUD+Wc{^_YqJFLU5|oNG-zrS(vtG@quTg!IMgF*@{=H(piz)NPES5xg z6b0jnb{_J_!@&b!I35d6u^nZ}zJeoq`Torn=PgiV$eEx!B7=0{BQPm* z2Gh3X0ewXZygpoDa$^~d`dgpld0y7SFMx2t3-9SUItDfv@92=AbjLQN(Uj)HacutE z*QX~#0l)Z511GI{WCP-VOR81xmfT*(C0<#6&j@aAc?ZBOSz){zJ zsn_*E=l-)-z%}5&Q1+R?Ri8}!5?HL7B2_>5Kl)rxJou09NHth5sDzWbrScyX=YRRj zYq#X0ssK4zbzYHO2n9&Uw9H*17Tp4kO6?Lx&B}7?xzfV)_g1(!nI$7Y%4N1(tE&|8 z>A~b56rlA&WyQ0jw>mK2kj}x>f5J8fDgMDPtYyb!nUAI#@zmz7d@&m-dDe(D+AWs? zx7hJm>l9rSfn6n}3%F-#*LgL-tMYu~-w65ZJ_6W?Y=;c$K0e0K%G;s0HfW^bO099u5*j&E|ZQUr-H6mo?R-6l=;7} zL~|kgoWfdYy-;e`iFEoV@;13%8eu<*h(!aKhE`)S9@9=@y;Fr%<28L1y@cw5@`9MYgc&eP(ZCbTf04?R-#fUNAlKf7DyNn`-FA=etS1a;g3+IJP)kR!Cf}<k%3R{EP3HG_sOVI5YaMl z3(sM%R-rxjBbduI8^|zTX52ghagpH+tupEj>prDk`1{HGg+DudIDf-o>Wx0IYJ7it zV#2uWwG!HfL<)~Wc?MKpE5+@XEd~;q?7pwNS4IuY(>aU)p5L4`hl1N-O?Pnv`6zGC z8)1uHgKg{KfV)h6jF?-!SAw`SnMLPL7y@L;87>?E7OWJo_0n!~%S>lC3QFg7$a=Fd zF1%}tcc?I|)nJ`eLS%9aJVv#1*GF8Fce zw$5}2SH0YlgDblpa0`jPSHbEs5p)Jl8138Jv96>7;KMSbmo5vV( zZXj)hZlG*5r8!%S{U~g-UCc{wvaAFOOw}9SS<;_h$d^1+@_<9(BpOQR)bz$K>!)Dc zxSsdk)Fx?vC+O(?M;|3vbgL)NJmzfFc){3;wT?DKw?rcPp@Q4@eIr#fS@RV-79M1g zp`AusVc7cNH$-LO8ASPNv5|&6u1jh!sSZWwgZ&V&6ukqhY{9}7Aex;}0J%%Te3yW)!;Wo2s0# zagnS`1HVT}406Fgvj$li_Y1n$F^{}JUOIHL60qr@LKA;gFqA-77N0LwnkjH&HydKO z!vu5K?8AxrX_9+H+5Wkm(7TLp?(z3Eq*`jxug_!CFSK&>esi%Cii}QPPm8l0AexXc zbt8WkFgbsJJyOydjnh4-S*1-Txcj#W?58U63QHMC&ttSGKmqKk6KCF?zb&DP5{GUh z%_55YjMPM~$7C7xzyjweSM<2pd)SdUi(pPkYE;F#yoap1t1!YXZEt>MHBLIiYb? z=Ur)fB~cbn3^CvEqt(hphwqd^fTR9ez7O<5>XQ|Cmvm!b*`dP@pKw;>#|ywnuto}` z2k^5}w?lQ7I<)=>7d?B|e$`FJ=PVyZytKQTlri;vM#N~q@;OE#~ultP&_&t%iLmd4c&XN$7U zZ8k2+)$f|6N|m5LKBtgk9k1oPmFwoaG3ykf;xiVbCcP^}O-2DN5izQZ6HKCeHBO#X zEYIy^@9wo$s)d%RDbZq^Ta?ts?tA=6G(?7oIAONcD@XNW+jq`FOa20y zRjSJ=d+Zp*3*y8im%4%QrG}BlrH1Fmk8y|f85U#Q;F@gS=0hV>jwZyew&t?q~pHg6#gcEFpi>XjqJYiog%KX2!ev9u4kzAQhkXo zCOKYO8{Qjdyba%C)AH9y1`M$YAG@N2!s{%}2laNGGK}9usSY*ej3StH^19}(dM=mE z#z9Sff1|PnfV4+;G9W~dn9d%+6Oi%9TJ2$Les#&FPit{$4mZwVM zp6se8XC3y5K1i8=;A2SWw6L;IC|afS4n-&_6>O=8ki!0<2?t;R%4)G)QA4N{_p1zT+CQGCu2GeTm!A7-lhyS|{T zk+;{pvt-kQ+P%>dj{c@p|Jb~S9w#n3uT&$M%_V09$R5C2PtV?sgk78 zKT@oWMa4f2T?1ma%u@%=R=R2$1^C(XwdniM&V2YYanyTD}MmPMw$7==VZnb z(8uZzA8(OV*8nFfQgNR8a%7R*uLMl#^5(a0>(PeS!B`@H=o425(Y(sOZSh8LNnl-b zi+^B#nMO+T-m>_!jci}b{>9 z51|UO7|vgsXhou2rFCy3S5)Wa8dd2!29wQQVsz@DNI*9&etr7n=vXtbX$#nRy>btU z-!*XT#POk7zqL6rI7k@EF6Q$eN7;-~CqnDk9!Wu>?=KqURd>q<4BPDc76e6g3Z}>R z^X1AxR$f*ESX@C-D8ujuS#^=2NXgvT$#ql6X7KYBpr|^^oTndNOC>->g<?J!{WzGte>>0bNKk1N-j-<&MVZhowd!Sop(kTHbF~&=4I6p|t{@%(4EUyL zdeRci=BjXCzP~>G>owMM5pkmfA9unAYNsWCmRT?8V}BoitTA7~Z@7rTiawj^WZg~F zJgLX~Yf(wQ&@LcZ@tTvz#a!p?Ned(CN>IqlI$2s4|6h==MiKLel zEJtP#uS?rhUY#c>`t>Q()?8ytl#i-fOMAlRglvXCRFwsK>e%4hUHeU^FoP@?v$-pr zFy~I^Tj*PbbtE*+fmiJW3Vhq9{iI$SLGjqDe$B8B4wp32ZkuUq{RcgGF-{tJzd@W%NHH0pP zd~fWT6_CI^D{zY4o8;T&9;qJZ0bP=}C;)_~cgFJo2GC~11B?mB;deh%TZp2#@33GI zEpdA7IQWJwKQK3S6z4AmojEQ)z|wep_KfZYMF3I(9sCwbcc<5Tu6HJSHtw;a)I}M( zA%pj3w! zk^$?Rm^VTLpuIYB!}eDs1KrOyBP=?tqYSaBG-+Vl&+6HYm!lIlv8GExTNiFZv3*SR zpX$e!!K0a{BFKFr%SR%oC--#Beg|_^KdasPFbJYBGqCL`U3$z?P!R1n(rI)LZG&1u zUKhVH3|;fOWT8pyy(@FiUK?JUBHI|j38%NJjmbr~Izj8VmM^bQt;7 z@Em)3Pvl5aj^f$Ru+KI&yto$ih$^IY87fQ(v3%@)K_p%uPhrV4sTtm79TIB0XNot< z5|jn(|9MR>tXG()Q@Xp|#Jj#5fWy;5ks0g`sjU1=?Lr5fT400Au z4$WUPYKs3tnAP8&9E&rDbrWpZRS9^9)=MrOp^Pagz04*q?j>OUCavNX@-DD@M+fXX zu{t0xiTXme6HVNK@Qi&6lqA}0Sfdo+VbSv%dE;b)noKGk5`=wq9{xqVJ_tb5XL{CN zU4Z1I6A3_S(?7e{Y@Eh=;EXTy>%3wB!8@v`7HE==N(XAhdiy|s;>i46^2Jhvjb?UY zZVJPe$imZLGs;MnBJfZww57l4CFL5_<@z#&@LAi{~P~1H|RCfDZRZPEZK+wHW3l#|E3J?gk%1 z(kMi=etj2>MTuXBDQ(z_HY=rCPI}{+=)S+X*I?0kLrV?Mm|-C5*-h#S(R0t>h~eYZ z%?<_UOf1`b4eoP9Sva-%`AuF*MP3@7A_XV!j;cm0Pgq5P2vggUP8kySR>)3MGf>y) zi3cte&Pi3z^{`QO0iDSvanwwI({Iv%9GhVa)%xknXwnDb+XyuNhmx`U&ioEN?4{(% z&p}y2-eD{G71N4YfEF6h�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 Bfv*4n literal 0 HcmV?d00001 diff --git a/docs/imgs/enable-events-before.png b/docs/imgs/enable-events-before.png new file mode 100644 index 0000000000000000000000000000000000000000..2aee2da46f61834f4d28a21d6da4f9184cf80fc5 GIT binary patch literal 127094 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 XBSUiCeZ<=*z>k!;yjY2dzTf``N7m;X literal 0 HcmV?d00001 diff --git a/docs/imgs/find-credentials.png b/docs/imgs/find-credentials.png new file mode 100644 index 0000000000000000000000000000000000000000..74bd252c20f6f24a958a2c3994280fe8112f16ce GIT binary patch literal 331453 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%0A5vHX9UmRI*x!X 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%0AS#86vZLzhzVP>YIpE2B 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 **Note:** Do not try to create the `aws/spans` log group manually — log group names starting with `aws/` are reserved and AWS will reject the call. X-Ray creates it automatically when you run step 2. ### Set up your toolchain diff --git a/docs/src/content/docs/developer-guide/Repository-preparation.md b/docs/src/content/docs/developer-guide/Repository-preparation.md index 4ddefda..8e193b8 100644 --- a/docs/src/content/docs/developer-guide/Repository-preparation.md +++ b/docs/src/content/docs/developer-guide/Repository-preparation.md @@ -14,9 +14,22 @@ After deployment, the orchestrator **pre-flight** step calls the GitHub API to v The Task API only accepts tasks for repositories that are **onboarded** — each one is a `Blueprint` construct in `cdk/src/stacks/agent.ts` that writes a `RepoConfig` row to DynamoDB. +**Quick method** — pass the repo as a CDK context variable or environment variable (no code edits needed): + +```bash +# Context variable (preferred) +MISE_EXPERIMENTAL=1 mise //cdk:deploy -- -c blueprintRepo=your-org/your-repo + +# Or environment variable +BLUEPRINT_REPO=your-org/your-repo MISE_EXPERIMENTAL=1 mise //cdk:deploy +``` + +The default is `awslabs/agent-plugins`. For a quick end-to-end test, fork that repo and pass your fork (e.g. `-c blueprintRepo=jane-doe/agent-plugins`). + +**Multiple repositories** — edit `cdk/src/stacks/agent.ts` directly: + 1. Open **`cdk/src/stacks/agent.ts`** and locate the `Blueprint` block (for example `AgentPluginsBlueprint`). -2. Set **`repo`** to your repository in **`owner/repo`** form. For a quick end-to-end test, use your **fork** of the sample plugin repo (e.g. `jane-doe/agent-plugins` after forking `awslabs/agent-plugins`). For your own services, use something like `acme/my-service`. This must match the `repo` field users pass in the CLI or API. -3. **Multiple repositories:** add another `new Blueprint(this, 'YourBlueprintId', { repo: 'owner/other-repo', repoTable: repoTable.table, ... })` and append it to the **`blueprints`** array. That array is used to aggregate per-repo **DNS egress** allowlists; skipping it can block the agent from reaching domains your Blueprint declares. +2. Add another `new Blueprint(this, 'YourBlueprintId', { repo: 'owner/other-repo', repoTable: repoTable.table, ... })` and append it to the **`blueprints`** array. That array is used to aggregate per-repo **DNS egress** allowlists; skipping it can block the agent from reaching domains your Blueprint declares. Optional per-repo overrides (same file / `Blueprint` props) include a different AgentCore **`runtimeArn`**, **`modelId`**, **`maxTurns`**, **`systemPromptOverrides`**, or a **`githubTokenSecretArn`** for a dedicated PAT. If you use a custom `runtimeArn` or secret per repo, you must also pass the corresponding ARNs into **`TaskOrchestrator`** via **`additionalRuntimeArns`** and **`additionalSecretArns`** so the orchestrator Lambda’s IAM policy allows them (see [Repo onboarding](/design/repo-onboarding) for the full model). diff --git a/docs/src/content/docs/user-guide/Overview.md b/docs/src/content/docs/user-guide/Overview.md index aae436b..d44eab0 100644 --- a/docs/src/content/docs/user-guide/Overview.md +++ b/docs/src/content/docs/user-guide/Overview.md @@ -4,8 +4,9 @@ title: Overview ABCA is a platform for running autonomous background coding agents on AWS. You submit a task (a GitHub repository + a task description or issue number), an agent works autonomously in an isolated environment, and delivers a pull request when done. -There are three ways to interact with the platform: +There are four ways to interact with the platform: 1. **CLI** (recommended) — The `bgagent` CLI authenticates via Cognito and calls the Task API. Handles login, token caching, and output formatting. 2. **REST API** (direct) — Call the Task API endpoints directly with a JWT token. Full validation, audit logging, and idempotency support. -3. **Webhook** — External systems (CI pipelines, GitHub Actions) can create tasks via HMAC-authenticated HTTP requests. No Cognito credentials needed; uses a shared secret per integration. \ No newline at end of file +3. **Webhook** — External systems (CI pipelines, GitHub Actions) can create tasks via HMAC-authenticated HTTP requests. No Cognito credentials needed; uses a shared secret per integration. +4. **Slack** — Submit tasks, check status, and receive notifications directly in Slack via the `/bgagent` slash command. See the [Slack setup guide](/design/slack-setup-guide). \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 86a7e7e..12c5e7c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -361,6 +361,52 @@ "@smithy/util-utf8" "^4.2.2" tslib "^2.6.2" +"@aws-sdk/client-cloudformation@3.1024.0": + version "3.1024.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudformation/-/client-cloudformation-3.1024.0.tgz#33d317a8be859a53f0e1bc781cc1494cf25eaabe" + integrity sha512-IehDPCok2Qr3mXKryc541EGRHV5axZ0Ym3iYtAdf9I/Fuy/qOsvUxeBW0EP5YsfWk8xY7pXhmF9xAX0ZjDjgDA== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "^3.973.26" + "@aws-sdk/credential-provider-node" "^3.972.29" + "@aws-sdk/middleware-host-header" "^3.972.8" + "@aws-sdk/middleware-logger" "^3.972.8" + "@aws-sdk/middleware-recursion-detection" "^3.972.9" + "@aws-sdk/middleware-user-agent" "^3.972.28" + "@aws-sdk/region-config-resolver" "^3.972.10" + "@aws-sdk/types" "^3.973.6" + "@aws-sdk/util-endpoints" "^3.996.5" + "@aws-sdk/util-user-agent-browser" "^3.972.8" + "@aws-sdk/util-user-agent-node" "^3.973.14" + "@smithy/config-resolver" "^4.4.13" + "@smithy/core" "^3.23.13" + "@smithy/fetch-http-handler" "^5.3.15" + "@smithy/hash-node" "^4.2.12" + "@smithy/invalid-dependency" "^4.2.12" + "@smithy/middleware-content-length" "^4.2.12" + "@smithy/middleware-endpoint" "^4.4.28" + "@smithy/middleware-retry" "^4.4.46" + "@smithy/middleware-serde" "^4.2.16" + "@smithy/middleware-stack" "^4.2.12" + "@smithy/node-config-provider" "^4.3.12" + "@smithy/node-http-handler" "^4.5.1" + "@smithy/protocol-http" "^5.3.12" + "@smithy/smithy-client" "^4.12.8" + "@smithy/types" "^4.13.1" + "@smithy/url-parser" "^4.2.12" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-body-length-browser" "^4.2.2" + "@smithy/util-body-length-node" "^4.2.3" + "@smithy/util-defaults-mode-browser" "^4.3.44" + "@smithy/util-defaults-mode-node" "^4.2.48" + "@smithy/util-endpoints" "^3.3.3" + "@smithy/util-middleware" "^4.2.12" + "@smithy/util-retry" "^4.2.13" + "@smithy/util-utf8" "^4.2.2" + "@smithy/util-waiter" "^4.2.14" + tslib "^2.6.2" + "@aws-sdk/client-cognito-identity-provider@^3.1021.0": version "3.1024.0" resolved "https://registry.yarnpkg.com/@aws-sdk/client-cognito-identity-provider/-/client-cognito-identity-provider-3.1024.0.tgz#9a9c02214d8483e7585daff0eabcb2bb5f0babe0" @@ -550,6 +596,51 @@ "@smithy/util-waiter" "^4.2.14" tslib "^2.6.2" +"@aws-sdk/client-secrets-manager@3.1024.0": + version "3.1024.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.1024.0.tgz#245e85dc306e8168d91abaa5ea6c6f1d31d7e043" + integrity sha512-EXbgMqueA5gw/jqpE2zMWAfBnzn6cZWqCISGdfn1201Um9IAIoTcHjyWoQMALQm0f8Lu1NF6yRtngs6zpZcagQ== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "^3.973.26" + "@aws-sdk/credential-provider-node" "^3.972.29" + "@aws-sdk/middleware-host-header" "^3.972.8" + "@aws-sdk/middleware-logger" "^3.972.8" + "@aws-sdk/middleware-recursion-detection" "^3.972.9" + "@aws-sdk/middleware-user-agent" "^3.972.28" + "@aws-sdk/region-config-resolver" "^3.972.10" + "@aws-sdk/types" "^3.973.6" + "@aws-sdk/util-endpoints" "^3.996.5" + "@aws-sdk/util-user-agent-browser" "^3.972.8" + "@aws-sdk/util-user-agent-node" "^3.973.14" + "@smithy/config-resolver" "^4.4.13" + "@smithy/core" "^3.23.13" + "@smithy/fetch-http-handler" "^5.3.15" + "@smithy/hash-node" "^4.2.12" + "@smithy/invalid-dependency" "^4.2.12" + "@smithy/middleware-content-length" "^4.2.12" + "@smithy/middleware-endpoint" "^4.4.28" + "@smithy/middleware-retry" "^4.4.46" + "@smithy/middleware-serde" "^4.2.16" + "@smithy/middleware-stack" "^4.2.12" + "@smithy/node-config-provider" "^4.3.12" + "@smithy/node-http-handler" "^4.5.1" + "@smithy/protocol-http" "^5.3.12" + "@smithy/smithy-client" "^4.12.8" + "@smithy/types" "^4.13.1" + "@smithy/url-parser" "^4.2.12" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-body-length-browser" "^4.2.2" + "@smithy/util-body-length-node" "^4.2.3" + "@smithy/util-defaults-mode-browser" "^4.3.44" + "@smithy/util-defaults-mode-node" "^4.2.48" + "@smithy/util-endpoints" "^3.3.3" + "@smithy/util-middleware" "^4.2.12" + "@smithy/util-retry" "^4.2.13" + "@smithy/util-utf8" "^4.2.2" + tslib "^2.6.2" + "@aws-sdk/client-secrets-manager@^3.1021.0": version "3.1021.0" resolved "https://registry.yarnpkg.com/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.1021.0.tgz#57c6348c63146642132ffa7e885a2abba08c6ff4" @@ -4591,9 +4682,9 @@ baseline-browser-mapping@^2.10.12: integrity sha512-BL2sTuHOdy0YT1lYieUxTw/QMtPBC3pmlJC6xk8BBYVv6vcw3SGdKemQ+Xsx9ik2F/lYDO9tqsFQH1r9PFuHKw== basic-ftp@^5.0.2, basic-ftp@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.2.2.tgz#4cb2422deddf432896bdb3c9b8f13b944ad4842c" - integrity sha512-1tDrzKsdCg70WGvbFss/ulVAxupNauGnOlgpyjKzeQxzyllBLS0CGLV7tjIXTK3ZQA9/FBEm9qyFFN1bciA6pw== + version "5.3.0" + resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.3.0.tgz#88f057d1ba8442643c505c4c83bbaa4442b15cfd" + integrity sha512-5K9eNNn7ywHPsYnFwjKgYH8Hf8B5emh7JKcPaVjjrMJFQQwGpwowEnZNEtHs7DfR7hCZsmaK3VA4HUK0YarT+w== bcp-47-match@^2.0.0: version "2.0.3" From 47a8db5ee6378fd8654f5dd48443245b79133fe9 Mon Sep 17 00:00:00 2001 From: Sphia Sadek Date: Mon, 4 May 2026 20:47:54 -0400 Subject: [PATCH 02/23] fix(docs): sync SLACK_SETUP_GUIDE into starlight site Add SLACK_SETUP_GUIDE.md to the explicit route map in sync-starlight.mjs, mirror it to using/Slack-setup-guide.md, and wire it into the astro sidebar. Without this, links to the Slack setup guide rendered as /architecture/... and the page itself never appeared on the site. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/astro.config.mjs | 1 + docs/scripts/sync-starlight.mjs | 7 + docs/src/content/docs/using/Overview.md | 2 +- .../content/docs/using/Slack-setup-guide.md | 174 ++++++++++++++++++ 4 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 docs/src/content/docs/using/Slack-setup-guide.md diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index d5c8885..91fb772 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -51,6 +51,7 @@ export default defineConfig({ { slug: 'using/using-the-rest-api' }, { slug: 'using/using-the-cli' }, { slug: 'using/webhook-integration' }, + { slug: 'using/slack-setup-guide' }, { slug: 'using/task-lifecycle' }, { slug: 'using/what-the-agent-does' }, { slug: 'using/tips-for-being-a-good-citizen' }, diff --git a/docs/scripts/sync-starlight.mjs b/docs/scripts/sync-starlight.mjs index f9a5519..311af05 100644 --- a/docs/scripts/sync-starlight.mjs +++ b/docs/scripts/sync-starlight.mjs @@ -43,6 +43,7 @@ function rewriteDocsLinkTarget(target) { DEVELOPER_GUIDE: '/developer-guide/introduction', USER_GUIDE: '/using/overview', CONTRIBUTING: '/developer-guide/contributing', + SLACK_SETUP_GUIDE: '/using/slack-setup-guide', }; /** `splitGuide` emits each `##` from DEVELOPER_GUIDE as its own page — map #anchors to those routes. */ @@ -216,6 +217,12 @@ mirrorMarkdownFile( path.join('src', 'content', 'docs', 'customizing', 'Prompt-engineering.md'), ); +// --- Slack Setup Guide: mirror to using/ --- +mirrorMarkdownFile( + path.join(docsRoot, 'guides', 'SLACK_SETUP_GUIDE.md'), + path.join('src', 'content', 'docs', 'using', 'Slack-setup-guide.md'), +); + // --- Roadmap: mirror to roadmap/ --- mirrorMarkdownFile( path.join(docsRoot, 'guides', 'ROADMAP.md'), diff --git a/docs/src/content/docs/using/Overview.md b/docs/src/content/docs/using/Overview.md index 20f400b..c6a2264 100644 --- a/docs/src/content/docs/using/Overview.md +++ b/docs/src/content/docs/using/Overview.md @@ -9,6 +9,6 @@ There are four ways to interact with the platform. You can use them independentl 1. **CLI** (recommended) - The `bgagent` CLI authenticates via Cognito and calls the Task API. Best for individual developers submitting tasks from the terminal. Handles login, token caching, and output formatting. 2. **REST API** (direct) - Call the Task API endpoints directly with a JWT token. Best for building custom integrations, dashboards, or internal tools on top of the platform. Full validation, audit logging, and idempotency support. 3. **Webhook** - External systems (CI pipelines, GitHub Actions) can create tasks via HMAC-authenticated HTTP requests. Best for automated workflows where tasks should be triggered by events (e.g., a new issue is labeled, a PR needs review). No Cognito credentials needed; uses a shared secret per integration. -4. **Slack** - Submit tasks, check status, and receive notifications directly in Slack via the `/bgagent` slash command. See the [Slack setup guide](/architecture/slack-setup-guide). +4. **Slack** - Submit tasks, check status, and receive notifications directly in Slack via the `/bgagent` slash command. See the [Slack setup guide](/using/slack-setup-guide). For example, a team might use the **CLI** for ad-hoc tasks, **webhooks** to auto-trigger `pr_review` on every new PR via GitHub Actions, **Slack** for quick team-wide requests, and the **REST API** to build a dashboard that tracks task status across repositories. \ No newline at end of file diff --git a/docs/src/content/docs/using/Slack-setup-guide.md b/docs/src/content/docs/using/Slack-setup-guide.md new file mode 100644 index 0000000..9090979 --- /dev/null +++ b/docs/src/content/docs/using/Slack-setup-guide.md @@ -0,0 +1,174 @@ +--- +title: Slack setup guide +--- + +# Slack integration setup guide + +This guide walks through setting up the ABCA Slack integration. Once configured, your team can submit tasks by mentioning `@Shoof` in any channel and receive real-time notifications as tasks progress. + +## Prerequisites + +- ABCA CDK stack deployed (see [Developer guide](/developer-guide/introduction)) +- A Cognito user account configured (see [User guide](/using/overview)) +- A Slack workspace where you can install apps (use a personal free workspace if your corporate Slack restricts app installs) +- AWS CLI configured with credentials for your ABCA account + +## Quick start + +```bash +bgagent slack setup +``` + +This single command handles everything: deploying the stack (if needed), generating the Slack App manifest URL, prompting for credentials, and showing the install link. Follow the on-screen instructions. + +## How it works + +- **@Shoof mentions**: `@Shoof fix the bug in org/repo#42` submits a task. Reactions on your message show progress: :eyes: (received) → :hourglass_flowing_sand: (working) → :white_check_mark: (done) +- **DMs**: Message Shoof directly for private task submissions +- **Notifications**: Threaded messages show task_created → completed (with PR link, duration, cost). The Cancel button lets you stop a running task. +- **Multi-workspace**: Each workspace installs via OAuth and gets its own bot token + +## Step-by-step setup + +### Step 1: Run the setup wizard + +```bash +bgagent slack setup +``` + +If the stack isn't deployed yet, it will offer to deploy for you. + +### Step 2: Create the Slack App + +The wizard outputs a URL that opens Slack's "Create New App" page with everything pre-filled (scopes, events, commands, URLs). Click the link, select your workspace, and create the app. + +### Step 3: Enter credentials + +The wizard prompts for three values from your new app's **Basic Information → App Credentials** page: + +| Field | Format | +|-------|--------| +| Signing Secret | 32 hex characters | +| Client Secret | 32 hex characters | +| Client ID | Numeric (e.g. 12345.67890) | + +![App Credentials location](/sample-autonomous-cloud-coding-agents/imgs/find-credentials.png) + +Format validation catches obvious typos (wrong length, non-hex characters). If the format is wrong, it loops back to re-enter. Note: the actual values cannot be verified until the app is installed — if you paste the wrong secret by mistake, you'll get an error at install time. + +### Step 4: Verify Event Subscriptions + +In the Slack App dashboard, go to **Event Subscriptions**: + +![Finding Event Subscriptions](/sample-autonomous-cloud-coding-agents/imgs/find-even-subscriptions.png) + +1. The Request URL may show "Your URL didn't respond" — click **Retry** +2. Wait for the green "Verified" checkmark +3. Click **Save Changes** + +![Event Subscriptions before](/sample-autonomous-cloud-coding-agents/imgs/enable-events-before.png) + +Click **Retry** and wait for the green checkmark: + +![Event Subscriptions after](/sample-autonomous-cloud-coding-agents/imgs/enable-events-after.png) + +The first attempt may time out due to Lambda cold start. The retry always succeeds. + +### Step 5: Install the app + +The wizard outputs an OAuth install URL. Open it in your browser — do **not** use the "Install App" button in the Slack dashboard (it won't connect to your backend). + +After clicking **Allow**, you'll see a success page. The bot token is now stored and Shoof can respond to messages. + +### Step 6: Link your account + +In Slack: +``` +/bgagent link +``` + +In your terminal: +```bash +bgagent slack link +``` + +This one-time step connects your Slack identity to your ABCA (Cognito) account. The code expires in 10 minutes. + +### Step 7: Test it + +In any channel where Shoof is added: +``` +@Shoof fix the README typo in org/repo#1 +``` + +You should see: +- :eyes: reaction on your message immediately +- A "Task submitted" message in the thread +- :hourglass_flowing_sand: reaction when the agent starts +- :white_check_mark: reaction and "Task completed" with a View PR button when done + +## Usage + +### Submit a task + +Mention Shoof with a repo and description: +``` +@Shoof fix the login bug in org/repo#42 +@Shoof update the README in org/repo +``` + +For private submissions, DM Shoof directly: +``` +fix the login bug in org/repo#42 +``` + +### Cancel a task + +Click the **Cancel Task** button in the thread while the agent is working. + +### Get help + +``` +/bgagent help +``` + +### Slash commands + +| Command | Purpose | +|---------|---------| +| `/bgagent link` | Link your Slack account (one-time) | +| `/bgagent help` | Show usage instructions | + +## Troubleshooting + +### @Shoof doesn't respond + +1. Is Shoof added to the channel? Use `/invite @Shoof` or add via channel settings. +2. Were credentials entered correctly? Delete the app and re-run `bgagent slack setup`. +3. Check CloudWatch logs for the `SlackEventsFn` Lambda — look for "Invalid Slack event signature" (wrong signing secret). + +### "Your Slack account is not linked" + +Run `/bgagent link` in Slack, then `bgagent slack link ` in your terminal. + +### "Repository not onboarded" + +The repo must be registered with a Blueprint before submitting tasks. See the [User guide](/using/overview). + +### OAuth install fails (bad_client_secret) + +The credentials stored don't match your app. Delete the app and re-run `bgagent slack setup`, making sure to paste the correct values. + +### Event Subscriptions URL doesn't verify + +Click **Retry** — the first attempt times out due to Lambda cold start. The retry succeeds. + +## Multi-workspace support + +The integration supports multiple Slack workspaces. Each workspace admin opens the OAuth install URL from `bgagent slack setup` output. Per-workspace bot tokens are stored separately. Users in each workspace link their accounts independently. + +## Removing the integration + +To uninstall from a workspace: **Slack → Settings → Manage Apps → Shoof → Remove App**. The bot token is automatically scheduled for deletion. + +To remove the Slack integration from your ABCA deployment entirely, delete the Slack App and redeploy without it. From 1d8a0d39da5cae626631795f1c3ecc253894c6dd Mon Sep 17 00:00:00 2001 From: Sphia Sadek Date: Mon, 4 May 2026 20:48:05 -0400 Subject: [PATCH 03/23] fix(slack): address Alain's PR #42 review feedback (items 1-20) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Full response to the 20-point review on PR #42. Grouped by theme below rather than strictly by item number so related edits stay together. **Signature + auth (items 2, 3, 9)** - Item 2: url_verification challenge used to be answered before signature verification, exposing the endpoint as a Slack handler without auth. Now every request is verified first. During initial setup — before the signing secret is populated — url_verification is still answered so the Slack App can be wired up, but every other request is rejected. - Item 3: previously any request with X-Slack-Retry-Num was acked with 200 immediately. Transient failures on app_uninstalled or tokens_revoked silently dropped the revocation and left the bot token live forever. Security-critical event retries now reprocess; UX events still short- circuit on retry. - Item 9: slack-verify's 5-minute secret cache had no invalidation. After a signing-secret rotation, warm Lambdas rejected every request for up to 5 minutes. New verifySlackRequest helper does verify-then-retry with forced refresh; invalidateSlackSecretCache exported for explicit eviction. All three authed handlers (events, commands, interactions) go through verifySlackRequest. **Error surfacing (items 4, 7, 20)** - Item 4: slack-notify caught every error per-record and logged warn, which made retryAttempts and bisectBatchOnError useless. Now distinguishes SlackApiError (swallow — not retryable via stream replay) from infra errors (rethrow so Lambda retries the batch). - Item 7: six .catch(() => {}) swallows in slack-events and slack-command-processor replaced with a shared slackFetch helper in shared/slack-api.ts that logs at warn. Benign Slack errors (already_reacted, no_reaction) are still silenced as expected. - Item 20: safeJsonParse in slack-notify logs the parse error and the truncated payload preview instead of swallowing silently. **Revocation ordering (item 6)** - revokeInstallation previously deleted the bot-token secret even if the DDB update to mark the installation revoked had failed, leaving DB status "active" with no backing token. Now the secret delete runs only if the DDB update succeeded; both steps throw on failure so Slack retries the event end-to-end. **UX fallbacks (items 8, 10)** - Item 8: when the command-processor Lambda invocation fails from handleAppMention, swap :eyes: → :x: and reply in-thread, mirroring the no-repo-found path. Previously the user was left with a stuck :eyes:. - Item 10: checkChannelAccess fails closed on definitively-blocking Slack errors (channel_not_found, not_in_channel, missing_scope). Transient or unknown errors (ratelimited, internal_error, network blips) fail open so a Slack outage doesn't block task submission; slack-notify surfaces any real delivery failure downstream. **Dedup ordering (item 17)** - Moved the channel_source === 'slack' check before the terminal dedup write so we don't poke non-Slack task records' channel_metadata with a Slack-specific marker. **Dead code + type safety (items 1, 13, 14)** - Item 1: delete unused handleStatus / handleCancel / statusEmoji from slack-command-processor. They were fully implemented but never wired into the switch(subcommand). Sam's PR #52 roadmap delivers `bgagent status` via the CLI; the Slack Cancel button already exists. - Item 13: MentionPayload used to extend SlackCommandPayload and set phantom fields (`response_url: ''`, etc.). Refactored into a discriminated union `CommandProcessorEvent = SlashCommandEvent | MentionEvent`. slack-events.ts constructs MentionEvent directly; handleSubmit takes MentionEvent only. - Item 14: SlackBlock was a single interface requiring `as unknown as SlackBlock` to construct actions blocks. Now SectionBlock | ActionsBlock discriminated union with typed button variants. Casts removed; tests updated with narrowing helpers. **Shared utilities (items 15, 16, 19)** - Items 15/16: extract ChannelSource union from shared/types.ts and use it on both TaskCreationContext.channelSource and TaskRecord.channel_source. Extract truncate() and formatDuration() into shared/slack-format.ts so they stop drifting between slack-blocks and slack-command-processor. - Item 19: formatDuration now coerces via Number() for all callers, fixing the inconsistency where taskTimedOutMessage skipped the cast. **CLI error surfacing (item 11)** - cli/src/commands/slack.ts:getStackOutput used to swallow every CloudFormation error as "not deployed yet". Now only swallows ValidationError / does-not-exist; auth and permission errors bubble up to the user. **Excess IAM grant (item 18)** - slackCommandsFn had readSlackSecretsPolicy attached, but the slash- command acknowledger only needs the signing secret (already granted separately). Grant removed; comment added explaining the intent. **OAuth CSRF (item 5)** - Documented the tradeoff in slack-oauth-callback.ts. Slack's client_secret requirement on the code exchange is the primary defense; a full state nonce requires per-session signed storage and is tracked as a follow-up coordinated with PR #52's dispatcher rework. **Not addressed in this PR (architectural feedback for follow-up)** Alain's "What I would like to see" items 1-5 — dispatcher pattern, notification-state extraction from channel_metadata, ADR for the adapter contract — are scoped to the PR that will rebase onto Sam's PR #52 (feat(interactive-agents)) once it lands. Sam's locked plan establishes the FanOutConsumer router that those items depend on. --- cdk/src/constructs/slack-integration.ts | 4 +- cdk/src/handlers/shared/create-task-core.ts | 4 +- cdk/src/handlers/shared/slack-api.ts | 72 +++++ cdk/src/handlers/shared/slack-blocks.ts | 84 ++++-- cdk/src/handlers/shared/slack-format.ts | 45 ++++ cdk/src/handlers/shared/slack-verify.ts | 56 +++- cdk/src/handlers/shared/types.ts | 5 +- cdk/src/handlers/slack-command-processor.ts | 246 ++++++------------ cdk/src/handlers/slack-commands.ts | 6 +- cdk/src/handlers/slack-events.ts | 129 ++++----- cdk/src/handlers/slack-interactions.ts | 6 +- cdk/src/handlers/slack-notify.ts | 75 ++++-- cdk/src/handlers/slack-oauth-callback.ts | 10 + cdk/test/handlers/shared/slack-blocks.test.ts | 60 +++-- cdk/test/handlers/shared/slack-format.test.ts | 60 +++++ cdk/test/handlers/shared/slack-verify.test.ts | 75 +++++- cli/src/commands/slack.ts | 13 +- 17 files changed, 640 insertions(+), 310 deletions(-) create mode 100644 cdk/src/handlers/shared/slack-api.ts create mode 100644 cdk/src/handlers/shared/slack-format.ts create mode 100644 cdk/test/handlers/shared/slack-format.test.ts diff --git a/cdk/src/constructs/slack-integration.ts b/cdk/src/constructs/slack-integration.ts index e75351d..b2d287e 100644 --- a/cdk/src/constructs/slack-integration.ts +++ b/cdk/src/constructs/slack-integration.ts @@ -310,8 +310,10 @@ export class SlackIntegration extends Construct { }, bundling: commonBundling, }); + // slackCommandsFn verifies the Slack signing secret (granted above) and + // async-invokes the processor Lambda — it never reads bot tokens, so the + // bgagent/slack/* wildcard grant is intentionally omitted here. this.signingSecret.grantRead(slackCommandsFn); - slackCommandsFn.addToRolePolicy(readSlackSecretsPolicy); commandProcessorFn.grantInvoke(slackCommandsFn); // --- Account Linking (Cognito-authenticated) --- diff --git a/cdk/src/handlers/shared/create-task-core.ts b/cdk/src/handlers/shared/create-task-core.ts index 5f119ba..b044ac6 100644 --- a/cdk/src/handlers/shared/create-task-core.ts +++ b/cdk/src/handlers/shared/create-task-core.ts @@ -30,7 +30,7 @@ import { generateBranchName } from './gateway'; import { logger } from './logger'; import { checkRepoOnboarded } from './repo-config'; import { ErrorCode, errorResponse, successResponse } from './response'; -import { type CreateTaskRequest, isPrTaskType, type TaskRecord, type TaskType, toTaskDetail } from './types'; +import { type ChannelSource, type CreateTaskRequest, isPrTaskType, type TaskRecord, type TaskType, toTaskDetail } from './types'; import { computeTtlEpoch, DEFAULT_MAX_TURNS, hasTaskSpec, isValidIdempotencyKey, isValidRepo, isValidTaskDescriptionLength, isValidTaskType, MAX_TASK_DESCRIPTION_LENGTH, validateMaxBudgetUsd, validateMaxTurns, validatePrNumber } from './validation'; import { TaskStatus } from '../../constructs/task-status'; @@ -39,7 +39,7 @@ import { TaskStatus } from '../../constructs/task-status'; */ export interface TaskCreationContext { readonly userId: string; - readonly channelSource: 'api' | 'webhook' | 'slack'; + readonly channelSource: ChannelSource; readonly channelMetadata: Record; readonly idempotencyKey?: string; } diff --git a/cdk/src/handlers/shared/slack-api.ts b/cdk/src/handlers/shared/slack-api.ts new file mode 100644 index 0000000..f76ba4c --- /dev/null +++ b/cdk/src/handlers/shared/slack-api.ts @@ -0,0 +1,72 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { logger } from './logger'; + +/** Slack API errors that should not count as failures for caller-side logging. */ +const BENIGN_SLACK_ERRORS = new Set(['already_reacted', 'no_reaction']); + +/** + * POST to a Slack Web API method with a bot token. + * + * Logs errors at warn level rather than throwing — Slack reactions, replies, and + * message cleanup are best-effort side-effects. Callers that need delivery to fail + * the whole request (e.g. stream dispatchers) should inspect the return value + * instead of relying on exceptions. + * + * @param botToken - xoxb-... bot token for the workspace. + * @param method - Slack Web API method, e.g. 'chat.postMessage'. + * @param body - JSON body to send. + * @returns true if the call succeeded; false if the request failed at any layer. + */ +export async function slackFetch( + botToken: string, + method: string, + body: Record, +): Promise { + try { + const response = await fetch(`https://slack.com/api/${method}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json; charset=utf-8', + 'Authorization': `Bearer ${botToken}`, + }, + body: JSON.stringify(body), + }); + if (!response.ok) { + logger.warn('Slack API returned non-2xx', { method, status: response.status }); + return false; + } + const result = await response.json() as { ok: boolean; error?: string }; + if (!result.ok) { + if (result.error && BENIGN_SLACK_ERRORS.has(result.error)) { + return true; + } + logger.warn('Slack API returned error', { method, error: result.error }); + return false; + } + return true; + } catch (err) { + logger.warn('Slack API fetch threw', { + method, + error: err instanceof Error ? err.message : String(err), + }); + return false; + } +} diff --git a/cdk/src/handlers/shared/slack-blocks.ts b/cdk/src/handlers/shared/slack-blocks.ts index b677d8d..68a5e33 100644 --- a/cdk/src/handlers/shared/slack-blocks.ts +++ b/cdk/src/handlers/shared/slack-blocks.ts @@ -17,16 +17,63 @@ * SOFTWARE. */ +import { formatDuration, truncate } from './slack-format'; import type { TaskRecord } from './types'; -/** A Slack Block Kit block element. */ -export interface SlackBlock { - readonly type: string; - readonly text?: { readonly type: string; readonly text: string }; - readonly elements?: ReadonlyArray>; +/** A Slack Block Kit mrkdwn text object. */ +interface MrkdwnText { + readonly type: 'mrkdwn'; + readonly text: string; +} + +/** A Slack Block Kit plain_text text object. */ +interface PlainText { + readonly type: 'plain_text'; + readonly text: string; + readonly emoji?: boolean; +} + +/** Section block: a single line/paragraph of mrkdwn content. */ +export interface SectionBlock { + readonly type: 'section'; + readonly text: MrkdwnText; readonly block_id?: string; } +/** Link-out button: opens a URL in a new tab. No action_id needed. */ +export interface LinkButtonElement { + readonly type: 'button'; + readonly text: PlainText; + readonly url: string; + readonly style?: 'primary' | 'danger'; +} + +/** Actionable button: triggers a Block Kit interaction callback via action_id. */ +export interface ActionButtonElement { + readonly type: 'button'; + readonly text: PlainText; + readonly action_id: string; + readonly style?: 'primary' | 'danger'; + readonly confirm?: { + readonly title: PlainText; + readonly text: MrkdwnText; + readonly confirm: PlainText; + readonly deny: PlainText; + }; +} + +export type ButtonElement = LinkButtonElement | ActionButtonElement; + +/** Actions block: a row of interactive elements (buttons, menus, etc.). */ +export interface ActionsBlock { + readonly type: 'actions'; + readonly block_id: string; + readonly elements: ReadonlyArray; +} + +/** Any Block Kit block this module renders. */ +export type SlackBlock = SectionBlock | ActionsBlock; + /** A Slack message payload suitable for chat.postMessage. */ export interface SlackMessage { /** Fallback plain-text for notifications. */ @@ -86,7 +133,7 @@ function taskCompletedMessage( ): SlackMessage { const parts = [`:white_check_mark: *Task completed* for \`${task.repo}\``]; const stats: string[] = []; - if (task.duration_s != null) stats.push(formatDuration(Number(task.duration_s))); + if (task.duration_s != null) stats.push(formatDuration(task.duration_s)); if (task.cost_usd != null) stats.push(`$${Number(task.cost_usd).toFixed(2)}`); if (stats.length > 0) parts.push(stats.join(' · ')); const text = parts.join('\n'); @@ -157,30 +204,15 @@ function simpleStatusMessage( }; } -function section(text: string): SlackBlock { +function section(text: string): SectionBlock { return { type: 'section', text: { type: 'mrkdwn', text } }; } -function truncate(text: string, maxLen: number): string { - if (text.length <= maxLen) return text; - return text.slice(0, maxLen - 3) + '...'; -} - -function formatDuration(seconds: number): string { - if (seconds < 60) return `${Math.round(seconds)}s`; - const m = Math.floor(seconds / 60); - const s = Math.round(seconds % 60); - if (m < 60) return s > 0 ? `${m}m ${s}s` : `${m}m`; - const h = Math.floor(m / 60); - const remainM = m % 60; - return remainM > 0 ? `${h}h ${remainM}m` : `${h}h`; -} - -function actions(blockId: string, elements: Record[]): SlackBlock { - return { type: 'actions', block_id: blockId, elements } as unknown as SlackBlock; +function actions(blockId: string, elements: ReadonlyArray): ActionsBlock { + return { type: 'actions', block_id: blockId, elements }; } -function linkButton(label: string, url: string): Record { +function linkButton(label: string, url: string): LinkButtonElement { return { type: 'button', text: { type: 'plain_text', text: label }, @@ -189,7 +221,7 @@ function linkButton(label: string, url: string): Record { }; } -function dangerButton(label: string, actionId: string): Record { +function dangerButton(label: string, actionId: string): ActionButtonElement { return { type: 'button', text: { type: 'plain_text', text: label }, diff --git a/cdk/src/handlers/shared/slack-format.ts b/cdk/src/handlers/shared/slack-format.ts new file mode 100644 index 0000000..8b65e8e --- /dev/null +++ b/cdk/src/handlers/shared/slack-format.ts @@ -0,0 +1,45 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/** + * Truncate a string to `maxLen`, appending "..." if it was cut. + * @param text - the string to truncate. + * @param maxLen - the maximum length of the returned string (including the "..."). + * @returns the truncated string. + */ +export function truncate(text: string, maxLen: number): string { + if (text.length <= maxLen) return text; + return text.slice(0, maxLen - 3) + '...'; +} + +/** + * Format a duration in seconds as a human-readable string (e.g. "45s", "2m 10s", "1h 5m"). + * @param seconds - the duration in seconds. Non-numeric values are coerced with Number(). + * @returns the formatted duration string. + */ +export function formatDuration(seconds: number): string { + const s = Number(seconds); + if (s < 60) return `${Math.round(s)}s`; + const minutes = Math.floor(s / 60); + const remS = Math.round(s % 60); + if (minutes < 60) return remS > 0 ? `${minutes}m ${remS}s` : `${minutes}m`; + const h = Math.floor(minutes / 60); + const remainM = minutes % 60; + return remainM > 0 ? `${h}h ${remainM}m` : `${h}h`; +} diff --git a/cdk/src/handlers/shared/slack-verify.ts b/cdk/src/handlers/shared/slack-verify.ts index 11c8052..ee67855 100644 --- a/cdk/src/handlers/shared/slack-verify.ts +++ b/cdk/src/handlers/shared/slack-verify.ts @@ -36,24 +36,31 @@ const MAX_TIMESTAMP_AGE_S = 5 * 60; /** * Fetch a secret from Secrets Manager with in-memory caching. * @param secretId - the full Secrets Manager secret ID or ARN. + * @param forceRefresh - bypass the cache and re-fetch from Secrets Manager. * @returns the secret string, or null if not found. */ -export async function getSlackSecret(secretId: string): Promise { +export async function getSlackSecret(secretId: string, forceRefresh = false): Promise { const now = Date.now(); - const cached = secretCache.get(secretId); - if (cached && cached.expiresAt > now) { - return cached.secret; + if (!forceRefresh) { + const cached = secretCache.get(secretId); + if (cached && cached.expiresAt > now) { + return cached.secret; + } } try { const result = await sm.send(new GetSecretValueCommand({ SecretId: secretId })); - if (!result.SecretString) return null; + if (!result.SecretString) { + secretCache.delete(secretId); + return null; + } secretCache.set(secretId, { secret: result.SecretString, expiresAt: now + CACHE_TTL_MS }); return result.SecretString; } catch (err) { const errorName = (err as Error)?.name; if (errorName === 'ResourceNotFoundException') { logger.error('Slack secret not found in Secrets Manager', { secret_id: secretId }); + secretCache.delete(secretId); return null; } logger.error('Failed to fetch Slack secret from Secrets Manager', { @@ -64,6 +71,15 @@ export async function getSlackSecret(secretId: string): Promise { } } +/** + * Explicitly drop a cached secret. Called when rotation is suspected — + * e.g. signature verification fails with an otherwise valid-looking request. + * @param secretId - the Secrets Manager secret ID or ARN to evict. + */ +export function invalidateSlackSecretCache(secretId: string): void { + secretCache.delete(secretId); +} + /** * Verify a Slack request signature. * @@ -109,3 +125,33 @@ export function verifySlackSignature( return false; } } + +/** + * Verify a Slack request, transparently re-fetching the signing secret once + * if the cached copy is rejected. After rotation, warm Lambdas keep the old + * cached secret until their 5-minute TTL elapses — this forces an early refresh. + * + * @param secretId - Secrets Manager ARN/ID for the signing secret. + * @param signature - the `X-Slack-Signature` header value. + * @param timestamp - the `X-Slack-Request-Timestamp` header value. + * @param body - the raw request body string. + * @returns true if the request is authentic (after at most one refresh retry). + */ +export async function verifySlackRequest( + secretId: string, + signature: string, + timestamp: string, + body: string, +): Promise { + const cached = await getSlackSecret(secretId); + if (cached && verifySlackSignature(cached, signature, timestamp, body)) { + return true; + } + + // Cache might be stale after a signing-secret rotation — evict and try once more. + invalidateSlackSecretCache(secretId); + const fresh = await getSlackSecret(secretId, true); + if (!fresh) return false; + if (fresh === cached) return false; // Same secret, still invalid — don't double-log. + return verifySlackSignature(fresh, signature, timestamp, body); +} diff --git a/cdk/src/handlers/shared/types.ts b/cdk/src/handlers/shared/types.ts index df7862b..43b40b2 100644 --- a/cdk/src/handlers/shared/types.ts +++ b/cdk/src/handlers/shared/types.ts @@ -23,6 +23,9 @@ import type { TaskStatusType } from '../../constructs/task-status'; /** Valid task types for task creation. */ export type TaskType = 'new_task' | 'pr_iteration' | 'pr_review'; +/** Where a task was submitted from. Shared across inbound adapters. */ +export type ChannelSource = 'api' | 'webhook' | 'slack'; + /** Task types that operate on an existing pull request. */ export function isPrTaskType(taskType: TaskType): boolean { return taskType === 'pr_iteration' || taskType === 'pr_review'; @@ -50,7 +53,7 @@ export interface TaskRecord { readonly pr_url?: string; readonly error_message?: string; readonly idempotency_key?: string; - readonly channel_source: string; + readonly channel_source: ChannelSource; readonly channel_metadata?: Record; readonly status_created_at: string; readonly created_at: string; diff --git a/cdk/src/handlers/slack-command-processor.ts b/cdk/src/handlers/slack-command-processor.ts index 6febe40..a9733f7 100644 --- a/cdk/src/handlers/slack-command-processor.ts +++ b/cdk/src/handlers/slack-command-processor.ts @@ -19,26 +19,58 @@ import * as crypto from 'crypto'; import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; -import { DynamoDBDocumentClient, GetCommand, PutCommand, UpdateCommand } from '@aws-sdk/lib-dynamodb'; +import { DynamoDBDocumentClient, GetCommand, PutCommand } from '@aws-sdk/lib-dynamodb'; import { createTaskCore } from './shared/create-task-core'; import { logger } from './shared/logger'; +import { slackFetch } from './shared/slack-api'; import { getSlackSecret, SLACK_SECRET_PREFIX } from './shared/slack-verify'; import type { SlackCommandPayload } from './slack-commands'; -/** Extended payload for mention-sourced commands (no response_url available). */ -interface MentionPayload extends SlackCommandPayload { - readonly source?: 'mention'; +/** + * Payload fields every inbound event carries, whether it came from a slash + * command or an @mention. + */ +interface BasePayload { + readonly text: string; + readonly user_id: string; + readonly team_id: string; + readonly channel_id: string; +} + +/** Slash-command invocation — has a usable response_url, no mention context. */ +export interface SlashCommandEvent extends BasePayload, SlackCommandPayload { + readonly source: 'slash'; +} + +/** @mention invocation — no response_url; reply via chat.postMessage in-thread. */ +export interface MentionEvent extends BasePayload { + readonly source: 'mention'; readonly mention_thread_ts?: string; } +/** Discriminated union of the inbound events the processor accepts. */ +export type CommandProcessorEvent = SlashCommandEvent | MentionEvent; + +/** + * Legacy shape — the slash-command acknowledger (`slack-commands.ts`) forwards + * payloads without a `source` field. Normalize those into SlashCommandEvent so + * the handler body only has to reason about the discriminated union. + */ +type RawEvent = CommandProcessorEvent | SlackCommandPayload; + +function normalizeEvent(event: RawEvent): CommandProcessorEvent { + if ('source' in event && event.source) { + return event; + } + return { ...event, source: 'slash' }; +} + const ddb = DynamoDBDocumentClient.from(new DynamoDBClient({})); const USER_MAPPING_TABLE = process.env.SLACK_USER_MAPPING_TABLE_NAME!; const INSTALLATION_TABLE = process.env.SLACK_INSTALLATION_TABLE_NAME!; -const TASK_TABLE = process.env.TASK_TABLE_NAME!; -/** Link code length and TTL. */ -const LINK_CODE_LENGTH = 6; +/** Link code TTL. */ const LINK_CODE_TTL_S = 10 * 60; // 10 minutes /** @@ -48,7 +80,8 @@ const LINK_CODE_TTL_S = 10 * 60; // 10 minutes * Posts results back to Slack via `response_url` (slash commands) or * `chat.postMessage` (@mentions). */ -export async function handler(event: MentionPayload): Promise { +export async function handler(raw: RawEvent): Promise { + const event = normalizeEvent(raw); const text = (event.text ?? '').trim(); const parts = text.split(/\s+/); const subcommand = parts[0]?.toLowerCase() ?? ''; @@ -100,7 +133,7 @@ export async function handler(event: MentionPayload): Promise { type ReplyFn = (text: string) => Promise; /** Build a reply function that posts in-thread via chat.postMessage for @mentions. */ -function buildMentionReply(event: MentionPayload): ReplyFn { +function buildMentionReply(event: MentionEvent): ReplyFn { return async (text: string) => { const botToken = await getBotToken(event.team_id); if (!botToken) { @@ -128,7 +161,7 @@ function buildMentionReply(event: MentionPayload): ReplyFn { // ─── Submit ─────────────────────────────────────────────────────────────────── -async function handleSubmit(event: MentionPayload, args: string[], reply: ReplyFn): Promise { +async function handleSubmit(event: MentionEvent, args: string[], reply: ReplyFn): Promise { if (args.length === 0) { await reply('Usage: `/bgagent submit org/repo#42 description`'); return; @@ -138,7 +171,7 @@ async function handleSubmit(event: MentionPayload, args: string[], reply: ReplyF const platformUserId = await lookupPlatformUser(event.team_id, event.user_id); if (!platformUserId) { await reply(':link: Your Slack account is not linked. Run `/bgagent link` first.'); - if (event.source === 'mention' && event.mention_thread_ts) { + if (event.mention_thread_ts) { await swapReaction(event.team_id, event.channel_id, event.mention_thread_ts, 'eyes', 'x'); } return; @@ -149,7 +182,7 @@ async function handleSubmit(event: MentionPayload, args: string[], reply: ReplyF const { repo, issueNumber } = parseRepoArg(repoArg); if (!repo) { await reply(`Invalid repo format: \`${repoArg}\`. Expected \`org/repo\` or \`org/repo#42\`.`); - if (event.source === 'mention' && event.mention_thread_ts) { + if (event.mention_thread_ts) { await swapReaction(event.team_id, event.channel_id, event.mention_thread_ts, 'eyes', 'x'); } return; @@ -165,14 +198,14 @@ async function handleSubmit(event: MentionPayload, args: string[], reply: ReplyF // Remaining args are the task description. const description = args.slice(1).join(' ') || undefined; - // For @mentions, include the thread_ts so notifications thread under the mention. + // handleSubmit is only invoked for the mention path, so there's no response_url. + // Notifications thread under the user's @mention message using mention_thread_ts. const channelMetadata: Record = { slack_team_id: event.team_id, slack_channel_id: event.channel_id, slack_user_id: event.user_id, - slack_response_url: event.response_url, }; - if (event.source === 'mention' && event.mention_thread_ts) { + if (event.mention_thread_ts) { channelMetadata.slack_thread_ts = event.mention_thread_ts; } @@ -194,21 +227,16 @@ async function handleSubmit(event: MentionPayload, args: string[], reply: ReplyF // Extract task info from the response. const body = JSON.parse(result.body); if (result.statusCode === 201 && body.data) { - // For @mentions, the notify handler posts the task_created message in-thread — - // don't duplicate it here. Only reply for slash commands (which have a response_url). - if (event.source !== 'mention') { - const task = body.data; - await reply( - `:white_check_mark: Task created!\n*ID:* \`${task.task_id}\`\n*Repo:* \`${task.repo}\`\n*Status:* ${task.status}`, - ); - } - } else { - const errMsg = body.error?.message ?? 'Unknown error'; - await reply(`:x: Failed to create task: ${errMsg}`); - // Swap reaction to :x: on the mention message. - if (event.source === 'mention' && event.mention_thread_ts) { - await swapReaction(event.team_id, event.channel_id, event.mention_thread_ts, 'eyes', 'x'); - } + // The notify handler posts the task_created message in-thread — don't + // duplicate it here on the mention path. + return; + } + + const errMsg = body.error?.message ?? 'Unknown error'; + await reply(`:x: Failed to create task: ${errMsg}`); + // Swap reaction to :x: on the mention message. + if (event.mention_thread_ts) { + await swapReaction(event.team_id, event.channel_id, event.mention_thread_ts, 'eyes', 'x'); } } @@ -222,102 +250,9 @@ function parseRepoArg(arg: string): { repo: string | null; issueNumber?: number }; } -// ─── Status ─────────────────────────────────────────────────────────────────── - -async function handleStatus(event: MentionPayload, taskId: string | undefined, reply: ReplyFn): Promise { - if (!taskId) { - await reply('Usage: `/bgagent status `'); - return; - } - - const result = await ddb.send(new GetCommand({ - TableName: TASK_TABLE, - Key: { task_id: taskId }, - })); - - if (!result.Item) { - await reply(`:mag: Task \`${taskId}\` not found.`); - return; - } - - const task = result.Item; - const lines = [ - ':clipboard: *Task Status*', - `*ID:* \`${task.task_id}\``, - `*Repo:* \`${task.repo}\``, - `*Status:* ${statusEmoji(task.status as string)} ${task.status}`, - ]; - if (task.task_description) lines.push(`*Description:* ${truncate(task.task_description as string, 200)}`); - if (task.pr_url) lines.push(`*PR:* <${task.pr_url}|Pull Request>`); - if (task.error_message) lines.push(`*Error:* ${truncate(task.error_message as string, 200)}`); - if (task.duration_s != null) lines.push(`*Duration:* ${formatDuration(Number(task.duration_s))}`); - if (task.cost_usd != null) lines.push(`*Cost:* $${Number(task.cost_usd).toFixed(2)}`); - - await reply(lines.join('\n')); -} - -// ─── Cancel ─────────────────────────────────────────────────────────────────── - -async function handleCancel(event: MentionPayload, taskId: string | undefined, reply: ReplyFn): Promise { - if (!taskId) { - await reply('Usage: `/bgagent cancel `'); - return; - } - - const platformUserId = await lookupPlatformUser(event.team_id, event.user_id); - if (!platformUserId) { - await reply(':link: Your Slack account is not linked. Run `/bgagent link` first.'); - return; - } - - // Load the task to verify ownership. - const result = await ddb.send(new GetCommand({ - TableName: TASK_TABLE, - Key: { task_id: taskId }, - })); - - if (!result.Item) { - await reply(`:mag: Task \`${taskId}\` not found.`); - return; - } - - if (result.Item.user_id !== platformUserId) { - await reply(':no_entry: You can only cancel your own tasks.'); - return; - } - - // Attempt to mark as cancelled via conditional update. - const ACTIVE_STATUSES = ['SUBMITTED', 'HYDRATING', 'RUNNING', 'FINALIZING']; - try { - await ddb.send(new UpdateCommand({ - TableName: TASK_TABLE, - Key: { task_id: taskId }, - UpdateExpression: 'SET #s = :cancelled, updated_at = :now', - ConditionExpression: '#s IN (:s1, :s2, :s3, :s4)', - ExpressionAttributeNames: { '#s': 'status' }, - ExpressionAttributeValues: { - ':cancelled': 'CANCELLED', - ':now': new Date().toISOString(), - ':s1': ACTIVE_STATUSES[0], - ':s2': ACTIVE_STATUSES[1], - ':s3': ACTIVE_STATUSES[2], - ':s4': ACTIVE_STATUSES[3], - }, - })); - await reply(`:no_entry_sign: Task \`${taskId}\` has been cancelled.`); - } catch (err) { - const errorName = (err as Error)?.name; - if (errorName === 'ConditionalCheckFailedException') { - await reply(`:warning: Task \`${taskId}\` is already in a terminal state.`); - } else { - throw err; - } - } -} - // ─── Link ───────────────────────────────────────────────────────────────────── -async function handleLink(event: MentionPayload, reply: ReplyFn): Promise { +async function handleLink(event: CommandProcessorEvent, reply: ReplyFn): Promise { // Generate a 6-character alphanumeric code. const code = crypto.randomBytes(3).toString('hex').toUpperCase(); const now = new Date().toISOString(); @@ -358,7 +293,13 @@ async function checkChannelAccess(teamId: string, channelId: string): Promise<{ if (channelId.startsWith('D')) return { ok: true }; const botToken = await getBotToken(teamId); - if (!botToken) return { ok: true }; // Can't check, allow and let notify handle errors. + if (!botToken) { + logger.warn('Channel access check skipped: bot token missing', { team_id: teamId }); + return { + ok: false, + error: ':warning: The Slack integration is not fully configured (missing bot token). Ask your workspace admin to reinstall the app.', + }; + } try { const response = await fetch(`https://slack.com/api/conversations.info?channel=${channelId}`, { @@ -371,7 +312,14 @@ async function checkChannelAccess(teamId: string, channelId: string): Promise<{ if (result.error === 'channel_not_found') { return { ok: false, error: ':lock: This is a private channel and the bot is not a member. Invite the bot first with `/invite @bgagent`, or submit from a public channel or DM.' }; } - return { ok: true }; // Unknown error, allow and let notify handle it. + // Unknown Slack error — surface it rather than silently allowing. + // The task would otherwise be created but the user would never see a + // notification land, with no hint of what went wrong. + logger.warn('Channel access check returned unknown error', { error: result.error, channel_id: channelId }); + return { + ok: false, + error: `:warning: Couldn't verify the bot can post in this channel (Slack error: \`${result.error ?? 'unknown'}\`). Try again or submit from a public channel or DM.`, + }; } if (result.channel?.is_private && !result.channel?.is_member) { @@ -381,7 +329,10 @@ async function checkChannelAccess(teamId: string, channelId: string): Promise<{ return { ok: true }; } catch (err) { logger.warn('Channel access check failed', { error: err instanceof Error ? err.message : String(err) }); - return { ok: true }; // Fail open — don't block submit on a check failure. + return { + ok: false, + error: ':warning: Couldn\'t reach Slack to verify channel access. Please try again in a moment.', + }; } } @@ -435,46 +386,9 @@ async function postToSlack(responseUrl: string, text: string): Promise { } } -function statusEmoji(status: string): string { - switch (status) { - case 'SUBMITTED': return ':inbox_tray:'; - case 'HYDRATING': return ':droplet:'; - case 'RUNNING': return ':gear:'; - case 'FINALIZING': return ':hourglass:'; - case 'COMPLETED': return ':white_check_mark:'; - case 'FAILED': return ':x:'; - case 'CANCELLED': return ':no_entry_sign:'; - case 'TIMED_OUT': return ':hourglass:'; - default: return ':grey_question:'; - } -} - -function truncate(text: string, maxLen: number): string { - if (text.length <= maxLen) return text; - return text.slice(0, maxLen - 3) + '...'; -} - -function formatDuration(seconds: number): string { - if (seconds < 60) return `${Math.round(seconds)}s`; - const m = Math.floor(seconds / 60); - const s = Math.round(seconds % 60); - if (m < 60) return s > 0 ? `${m}m ${s}s` : `${m}m`; - const h = Math.floor(m / 60); - const remainM = m % 60; - return remainM > 0 ? `${h}h ${remainM}m` : `${h}h`; -} - async function swapReaction(teamId: string, channelId: string, messageTs: string, remove: string, add: string): Promise { const botToken = await getBotToken(teamId); if (!botToken) return; - await fetch('https://slack.com/api/reactions.remove', { - method: 'POST', - headers: { 'Content-Type': 'application/json; charset=utf-8', 'Authorization': `Bearer ${botToken}` }, - body: JSON.stringify({ channel: channelId, timestamp: messageTs, name: remove }), - }).catch(() => {}); - await fetch('https://slack.com/api/reactions.add', { - method: 'POST', - headers: { 'Content-Type': 'application/json; charset=utf-8', 'Authorization': `Bearer ${botToken}` }, - body: JSON.stringify({ channel: channelId, timestamp: messageTs, name: add }), - }).catch(() => {}); + await slackFetch(botToken, 'reactions.remove', { channel: channelId, timestamp: messageTs, name: remove }); + await slackFetch(botToken, 'reactions.add', { channel: channelId, timestamp: messageTs, name: add }); } diff --git a/cdk/src/handlers/slack-commands.ts b/cdk/src/handlers/slack-commands.ts index 1de6fa7..f89b47c 100644 --- a/cdk/src/handlers/slack-commands.ts +++ b/cdk/src/handlers/slack-commands.ts @@ -20,7 +20,7 @@ import { InvokeCommand, LambdaClient } from '@aws-sdk/client-lambda'; import type { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'; import { logger } from './shared/logger'; -import { getSlackSecret, verifySlackSignature } from './shared/slack-verify'; +import { getSlackSecret, verifySlackRequest } from './shared/slack-verify'; const lambdaClient = new LambdaClient({}); @@ -53,7 +53,7 @@ export async function handler(event: APIGatewayProxyEvent): Promise { try { if (!event.body) { return jsonResponse(400, { error: 'Request body is required' }); } - // Slack retries events if we don't respond within 3 seconds. Ack retries - // immediately to prevent duplicate task creation. - const retryNum = event.headers['X-Slack-Retry-Num'] ?? event.headers['x-slack-retry-num']; - if (retryNum) { - logger.info('Acknowledging Slack retry', { retry_num: retryNum }); - return jsonResponse(200, { ok: true }); + // Verify Slack signing secret for every request — including url_verification. + // Slack signs all requests; skipping verification exposes the endpoint. + // The only reason to bypass is initial setup before the signing secret is populated. + const signature = event.headers['X-Slack-Signature'] ?? event.headers['x-slack-signature'] ?? ''; + const timestamp = event.headers['X-Slack-Request-Timestamp'] ?? event.headers['x-slack-request-timestamp'] ?? ''; + const signingSecret = await getSlackSecret(SIGNING_SECRET_ARN); + + if (!signingSecret) { + // Secret hasn't been populated yet — allow url_verification so the Slack App can be + // wired up during initial setup, but reject anything else. + logger.warn('Slack signing secret not populated — bypassing verification for url_verification only'); + const payload: SlackEventPayload = JSON.parse(event.body); + if (payload.type === 'url_verification' && payload.challenge) { + return jsonResponse(200, { challenge: payload.challenge }); + } + return jsonResponse(500, { error: 'Internal configuration error' }); + } + + if (!await verifySlackRequest(SIGNING_SECRET_ARN, signature, timestamp, event.body)) { + logger.warn('Invalid Slack event signature'); + return jsonResponse(401, { error: 'Invalid signature' }); } - // Parse the payload first — url_verification must respond before signature check - // to complete the Slack app setup flow. const payload: SlackEventPayload = JSON.parse(event.body); // URL verification challenge — Slack sends this when configuring the event URL. @@ -83,24 +101,21 @@ export async function handler(event: APIGatewayProxyEvent): Promise {}); - await fetch('https://slack.com/api/reactions.add', { - method: 'POST', - headers: { 'Content-Type': 'application/json; charset=utf-8', 'Authorization': `Bearer ${botToken}` }, - body: JSON.stringify({ channel: channelId, timestamp: mentionTs, name: 'x' }), - }).catch(() => {}); + await slackFetch(botToken, 'reactions.remove', { channel: channelId, timestamp: mentionTs, name: 'eyes' }); + await slackFetch(botToken, 'reactions.add', { channel: channelId, timestamp: mentionTs, name: 'x' }); } - await fetch('https://slack.com/api/chat.postMessage', { - method: 'POST', - headers: { 'Content-Type': 'application/json; charset=utf-8', 'Authorization': `Bearer ${botToken}` }, - body: JSON.stringify({ - channel: channelId, - thread_ts: mentionTs, - text: ':x: Please include a repo — e.g. `@Shoof fix the bug in org/repo#42`', - }), - }).catch(() => {}); + await slackFetch(botToken, 'chat.postMessage', { + channel: channelId, + thread_ts: mentionTs, + text: ':x: Please include a repo — e.g. `@Shoof fix the bug in org/repo#42`', + }); } return; } @@ -198,18 +201,12 @@ async function handleAppMention( const description = text.replace(repo, '').replace(/\s+/g, ' ').trim(); const commandText = `submit ${repo} ${description}`; - const mentionPayload = { - command: '/bgagent', + const mentionPayload: MentionEvent = { text: commandText, - response_url: '', - trigger_id: '', user_id: userId, - user_name: '', team_id: teamId, - team_domain: '', channel_id: channelId, - channel_name: '', - source: 'mention' as const, + source: 'mention', mention_thread_ts: threadTs ?? messageTs, }; @@ -218,11 +215,7 @@ async function handleAppMention( if (mentionTs) { const botToken = await getSlackSecret(`${SLACK_SECRET_PREFIX}${teamId}`); if (botToken) { - await fetch('https://slack.com/api/reactions.add', { - method: 'POST', - headers: { 'Content-Type': 'application/json; charset=utf-8', 'Authorization': `Bearer ${botToken}` }, - body: JSON.stringify({ channel: channelId, timestamp: mentionTs, name: 'eyes' }), - }).catch(() => {}); + await slackFetch(botToken, 'reactions.add', { channel: channelId, timestamp: mentionTs, name: 'eyes' }); } } @@ -242,13 +235,29 @@ async function handleAppMention( logger.error('Failed to invoke command processor for app_mention', { error: err instanceof Error ? err.message : String(err), }); + // Mirror the no-repo-found failure UX: swap :eyes: to :x: and reply in thread + // so the user isn't left staring at a stuck :eyes: reaction forever. + const botToken = await getSlackSecret(`${SLACK_SECRET_PREFIX}${teamId}`); + if (botToken && mentionTs) { + await slackFetch(botToken, 'reactions.remove', { channel: channelId, timestamp: mentionTs, name: 'eyes' }); + await slackFetch(botToken, 'reactions.add', { channel: channelId, timestamp: mentionTs, name: 'x' }); + await slackFetch(botToken, 'chat.postMessage', { + channel: channelId, + thread_ts: mentionTs, + text: ':x: Something went wrong forwarding your request. Please try again.', + }); + } } } + async function revokeInstallation(teamId: string): Promise { const now = new Date().toISOString(); - // Mark the installation as revoked. + // Mark the installation record as revoked FIRST. If this fails we must not + // delete the bot token, or the DB will still show status=active while the + // token is gone — every subsequent Slack call would then fail with "secret + // not found." Let Slack retry the revocation event in that case. try { await ddb.send(new UpdateCommand({ TableName: TABLE_NAME, @@ -258,13 +267,16 @@ async function revokeInstallation(teamId: string): Promise { ExpressionAttributeValues: { ':revoked': 'revoked', ':now': now }, })); } catch (err) { - logger.error('Failed to revoke Slack installation', { + logger.error('Failed to mark Slack installation revoked — bot token left in place for retry', { team_id: teamId, error: err instanceof Error ? err.message : String(err), }); + throw err; } - // Schedule the bot token secret for deletion. + // Schedule the bot token secret for deletion. Failure here is recoverable + // on retry (the DDB row is already revoked, so the next delivery just re-tries + // this step). try { await sm.send(new DeleteSecretCommand({ SecretId: `${SLACK_SECRET_PREFIX}${teamId}`, @@ -276,6 +288,7 @@ async function revokeInstallation(teamId: string): Promise { team_id: teamId, error: err instanceof Error ? err.message : String(err), }); + throw err; } } diff --git a/cdk/src/handlers/slack-interactions.ts b/cdk/src/handlers/slack-interactions.ts index a726b86..59b68d1 100644 --- a/cdk/src/handlers/slack-interactions.ts +++ b/cdk/src/handlers/slack-interactions.ts @@ -21,7 +21,7 @@ import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; import { DynamoDBDocumentClient, GetCommand, UpdateCommand } from '@aws-sdk/lib-dynamodb'; import type { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'; import { logger } from './shared/logger'; -import { getSlackSecret, SLACK_SECRET_PREFIX, verifySlackSignature } from './shared/slack-verify'; +import { getSlackSecret, SLACK_SECRET_PREFIX, verifySlackRequest } from './shared/slack-verify'; const ddb = DynamoDBDocumentClient.from(new DynamoDBClient({})); @@ -55,7 +55,7 @@ export async function handler(event: APIGatewayProxyEvent): Promise { for (const record of event.Records) { try { await processRecord(record); } catch (err) { - logger.warn('Failed to process Slack notification for stream record', { + // Slack delivery errors are terminal — swallow after logging so the batch + // isn't retried for something a retry can't fix. + if (err instanceof SlackApiError) { + logger.warn('Slack delivery failed', { + error: err.message, + event_id: record.eventID, + }); + continue; + } + // Infrastructure errors (DynamoDB throttling, Secrets Manager outage, etc.) + // rethrow so Lambda retries the batch per the configured retryAttempts + + // bisectBatchOnError behavior. + logger.error('Infrastructure error processing Slack notification', { error: err instanceof Error ? err.message : String(err), event_id: record.eventID, }); + throw err; } } } +/** + * Thrown when the Slack API returns an error after a successful HTTP call. + * Tagged so the batch handler can swallow it without retrying — Slack errors + * are not recoverable by retrying the stream record. + */ +class SlackApiError extends Error { + constructor(message: string) { + super(message); + this.name = 'SlackApiError'; + } +} + async function processRecord(record: DynamoDBRecord): Promise { if (record.eventName !== 'INSERT' || !record.dynamodb?.NewImage) return; @@ -73,10 +100,19 @@ async function processRecord(record: DynamoDBRecord): Promise { if (!eventType || !taskId || !NOTIFIABLE_EVENTS.has(eventType)) return; + // Load the task record first so we can skip non-Slack tasks before touching + // their DynamoDB row with dedup writes. + const taskResult = await ddb.send(new GetCommand({ + TableName: TASK_TABLE, + Key: { task_id: taskId }, + })); + + const task = taskResult.Item as TaskRecord | undefined; + if (!task || task.channel_source !== 'slack') return; + // Deduplicate terminal notifications — the orchestrator may write multiple // failure/completion events (retries). Use a conditional update to claim // the right to send the terminal notification. - if (TERMINAL_EVENTS.has(eventType)) { try { await ddb.send(new UpdateCommand({ @@ -95,15 +131,6 @@ async function processRecord(record: DynamoDBRecord): Promise { } } - // Load the task record. - const taskResult = await ddb.send(new GetCommand({ - TableName: TASK_TABLE, - Key: { task_id: taskId }, - })); - - const task = taskResult.Item as TaskRecord | undefined; - if (!task || task.channel_source !== 'slack') return; - const channelMeta = task.channel_metadata; if (!channelMeta?.slack_team_id || !channelMeta?.slack_channel_id) { logger.warn('Slack task missing channel metadata', { task_id: taskId }); @@ -120,9 +147,10 @@ async function processRecord(record: DynamoDBRecord): Promise { return; } - // Parse event metadata if present. + // Parse event metadata if present. Failures are logged and treated as "no metadata" — + // the surfaced fallback reason is "Unknown error" which is user-hostile without a log. const eventMetadata = newImage.metadata?.S - ? safeJsonParse(newImage.metadata.S) + ? safeJsonParse(newImage.metadata.S, { task_id: taskId, event_type: eventType }) : undefined; // Render the Slack message. @@ -167,12 +195,10 @@ async function processRecord(record: DynamoDBRecord): Promise { const result = await response.json() as { ok: boolean; ts?: string; error?: string }; if (!result.ok) { - logger.warn('Slack API returned error', { - error: result.error, - task_id: taskId, - event_type: eventType, - }); - return; + // Slack API errors are not retryable via the Lambda batch (re-processing the + // stream record won't make Slack start accepting the message), so throw a + // tagged error and let the batch handler swallow it after logging. + throw new SlackApiError(`slack chat.postMessage failed: ${result.error ?? 'unknown'} (task_id=${taskId} event_type=${eventType})`); } // Emoji reaction on the root message — the user's @mention or the task_created message. @@ -324,10 +350,15 @@ async function deleteMessage(botToken: string, channel: string, messageTs: strin } } -function safeJsonParse(text: string): Record | null { +function safeJsonParse(text: string, context?: Record): Record | null { try { return JSON.parse(text); - } catch { + } catch (err) { + logger.warn('Failed to parse event metadata JSON', { + ...context, + error: err instanceof Error ? err.message : String(err), + preview: text.length > 200 ? `${text.slice(0, 200)}...` : text, + }); return null; } } diff --git a/cdk/src/handlers/slack-oauth-callback.ts b/cdk/src/handlers/slack-oauth-callback.ts index e7f1d3b..872d558 100644 --- a/cdk/src/handlers/slack-oauth-callback.ts +++ b/cdk/src/handlers/slack-oauth-callback.ts @@ -48,6 +48,16 @@ interface SlackOAuthResponse { * After a workspace admin authorizes the Slack App, Slack redirects here * with a `code` query parameter. This handler exchanges the code for a * bot token, stores it in Secrets Manager, and records the installation. + * + * **CSRF note:** this handler does not validate a `state` parameter + * (RFC 6749 §10.12). In OAuth V2, the `code` exchange at Slack also + * requires the app's `client_secret`, which is not available to an attacker — + * so a forged callback cannot complete the token exchange. The residual + * risk is a confused-deputy scenario where a workspace admin who clicked a + * legitimate install link on another tab is instead logged against an + * attacker-initiated install. Mitigating that requires per-session signed + * state storage and is tracked as a follow-up. For now, the `client_secret` + * requirement on Slack's side provides the primary defense. */ export async function handler(event: APIGatewayProxyEvent): Promise { try { diff --git a/cdk/test/handlers/shared/slack-blocks.test.ts b/cdk/test/handlers/shared/slack-blocks.test.ts index 21a260a..93e64bd 100644 --- a/cdk/test/handlers/shared/slack-blocks.test.ts +++ b/cdk/test/handlers/shared/slack-blocks.test.ts @@ -18,8 +18,25 @@ */ import { TaskStatus, type TaskStatusType } from '../../../src/constructs/task-status'; +import type { ActionsBlock, SlackBlock } from '../../../src/handlers/shared/slack-blocks'; import { renderSlackBlocks } from '../../../src/handlers/shared/slack-blocks'; +/** Narrow to a section block and return its text; throws if block isn't a section. */ +function sectionText(block: SlackBlock): string { + if (block.type !== 'section') { + throw new Error(`expected section block, got ${block.type}`); + } + return block.text.text; +} + +/** Narrow to an actions block; throws if block isn't one. */ +function actionsBlock(block: SlackBlock): ActionsBlock { + if (block.type !== 'actions') { + throw new Error(`expected actions block, got ${block.type}`); + } + return block; +} + describe('renderSlackBlocks', () => { const baseTask = { task_id: '01HXYZ123', @@ -36,75 +53,78 @@ describe('renderSlackBlocks', () => { const msg = renderSlackBlocks('task_created', baseTask); expect(msg.text).toContain('org/repo'); expect(msg.blocks).toHaveLength(1); - expect(msg.blocks[0].type).toBe('section'); - expect(msg.blocks[0].text?.text).toContain(':rocket:'); - expect(msg.blocks[0].text?.text).toContain('Fix the login bug'); - expect(msg.blocks[0].text?.text).toContain('01HXYZ123'); + const text = sectionText(msg.blocks[0]); + expect(text).toContain(':rocket:'); + expect(text).toContain('Fix the login bug'); + expect(text).toContain('01HXYZ123'); }); test('renders task_completed message with PR URL', () => { const task = { ...baseTask, status: TaskStatus.COMPLETED as TaskStatusType, pr_url: 'https://github.com/org/repo/pull/42', cost_usd: 0.47, duration_s: 272 }; const msg = renderSlackBlocks('task_completed', task); expect(msg.text).toContain('completed'); - expect(msg.blocks[0].text?.text).toContain('$0.47'); - expect(msg.blocks[0].text?.text).toContain('4m 32s'); + const text = sectionText(msg.blocks[0]); + expect(text).toContain('$0.47'); + expect(text).toContain('4m 32s'); // PR link is in the button, not inline text (avoids Slack unfurl cards) - const actionsBlock = msg.blocks[1] as unknown as { type: string; elements: Array<{ url: string; text: { text: string } }> }; - expect(actionsBlock.type).toBe('actions'); - expect(actionsBlock.elements[0].url).toBe('https://github.com/org/repo/pull/42'); - expect(actionsBlock.elements[0].text.text).toContain('#42'); + const actions = actionsBlock(msg.blocks[1]); + const button = actions.elements[0]; + expect(button.text.text).toContain('#42'); + if (!('url' in button)) throw new Error('expected link button with url'); + expect(button.url).toBe('https://github.com/org/repo/pull/42'); }); test('renders task_failed message with error', () => { const task = { ...baseTask, status: TaskStatus.FAILED as TaskStatusType, error_message: 'Repo not found' }; const msg = renderSlackBlocks('task_failed', task); expect(msg.text).toContain('failed'); - expect(msg.blocks[0].text?.text).toContain('Repo not found'); + expect(sectionText(msg.blocks[0])).toContain('Repo not found'); }); test('renders task_failed message with metadata error', () => { const task = { ...baseTask, status: TaskStatus.FAILED as TaskStatusType }; const msg = renderSlackBlocks('task_failed', task, { error: 'timeout' }); - expect(msg.blocks[0].text?.text).toContain('timeout'); + expect(sectionText(msg.blocks[0])).toContain('timeout'); }); test('renders task_cancelled message', () => { const msg = renderSlackBlocks('task_cancelled', baseTask); - expect(msg.blocks[0].text?.text).toContain(':no_entry_sign:'); + expect(sectionText(msg.blocks[0])).toContain(':no_entry_sign:'); }); test('renders task_timed_out message with duration', () => { const task = { ...baseTask, duration_s: 28800 }; const msg = renderSlackBlocks('task_timed_out', task); - expect(msg.blocks[0].text?.text).toContain('8h'); + expect(sectionText(msg.blocks[0])).toContain('8h'); }); test('renders session_started message', () => { const msg = renderSlackBlocks('session_started', baseTask); - expect(msg.blocks[0].text?.text).toContain(':hourglass_flowing_sand:'); + expect(sectionText(msg.blocks[0])).toContain(':hourglass_flowing_sand:'); }); test('renders unknown event type gracefully', () => { const msg = renderSlackBlocks('hydration_complete', baseTask); - expect(msg.blocks[0].text?.text).toContain('hydration_complete'); + expect(sectionText(msg.blocks[0])).toContain('hydration_complete'); }); test('truncates long descriptions', () => { const task = { ...baseTask, task_description: 'A'.repeat(300) }; const msg = renderSlackBlocks('task_created', task); - expect(msg.blocks[0].text?.text.length).toBeLessThan(350); - expect(msg.blocks[0].text?.text).toContain('...'); + const text = sectionText(msg.blocks[0]); + expect(text.length).toBeLessThan(350); + expect(text).toContain('...'); }); test('formats duration in hours', () => { const task = { ...baseTask, status: TaskStatus.COMPLETED as TaskStatusType, duration_s: 3661 }; const msg = renderSlackBlocks('task_completed', task); - expect(msg.blocks[0].text?.text).toContain('1h 1m'); + expect(sectionText(msg.blocks[0])).toContain('1h 1m'); }); test('formats duration in minutes and seconds', () => { const task = { ...baseTask, status: TaskStatus.COMPLETED as TaskStatusType, duration_s: 125 }; const msg = renderSlackBlocks('task_completed', task); - expect(msg.blocks[0].text?.text).toContain('2m 5s'); + expect(sectionText(msg.blocks[0])).toContain('2m 5s'); }); }); diff --git a/cdk/test/handlers/shared/slack-format.test.ts b/cdk/test/handlers/shared/slack-format.test.ts new file mode 100644 index 0000000..4b74708 --- /dev/null +++ b/cdk/test/handlers/shared/slack-format.test.ts @@ -0,0 +1,60 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { formatDuration, truncate } from '../../../src/handlers/shared/slack-format'; + +describe('truncate', () => { + test('returns string unchanged when under limit', () => { + expect(truncate('hello', 10)).toBe('hello'); + }); + + test('truncates and appends ellipsis when over limit', () => { + expect(truncate('hello world', 8)).toBe('hello...'); + }); + + test('returns string unchanged when exactly at limit', () => { + expect(truncate('hello', 5)).toBe('hello'); + }); +}); + +describe('formatDuration', () => { + test('sub-minute rounds to whole seconds', () => { + expect(formatDuration(0)).toBe('0s'); + expect(formatDuration(45.4)).toBe('45s'); + expect(formatDuration(59)).toBe('59s'); + }); + + test('minute range uses m or m s format', () => { + expect(formatDuration(60)).toBe('1m'); + expect(formatDuration(65)).toBe('1m 5s'); + expect(formatDuration(3599)).toBe('59m 59s'); + }); + + test('hour range uses h or h m format', () => { + expect(formatDuration(3600)).toBe('1h'); + expect(formatDuration(3660)).toBe('1h 1m'); + expect(formatDuration(7320)).toBe('2h 2m'); + }); + + test('coerces DynamoDB numeric strings via Number()', () => { + // DynamoDB may round-trip numeric attributes as strings; Number() coerces them. + expect(formatDuration('90' as unknown as number)).toBe('1m 30s'); + expect(formatDuration('3600' as unknown as number)).toBe('1h'); + }); +}); diff --git a/cdk/test/handlers/shared/slack-verify.test.ts b/cdk/test/handlers/shared/slack-verify.test.ts index ec7d5b3..c2edef0 100644 --- a/cdk/test/handlers/shared/slack-verify.test.ts +++ b/cdk/test/handlers/shared/slack-verify.test.ts @@ -18,7 +18,19 @@ */ import * as crypto from 'crypto'; -import { verifySlackSignature } from '../../../src/handlers/shared/slack-verify'; + +const smSendMock = jest.fn(); +jest.mock('@aws-sdk/client-secrets-manager', () => ({ + SecretsManagerClient: jest.fn(() => ({ send: smSendMock })), + GetSecretValueCommand: jest.fn((input) => ({ input })), +})); + +// Imported after the mock is registered. +import { + invalidateSlackSecretCache, + verifySlackRequest, + verifySlackSignature, +} from '../../../src/handlers/shared/slack-verify'; describe('verifySlackSignature', () => { const signingSecret = 'test-signing-secret-abc123'; @@ -73,3 +85,64 @@ describe('verifySlackSignature', () => { expect(verifySlackSignature(signingSecret, sig, ts, 'tampered-body')).toBe(false); }); }); + +describe('verifySlackRequest', () => { + const SECRET_ARN = 'arn:aws:secretsmanager:us-east-1:123:secret:bgagent/slack/signing-XYZ'; + + function signWith(secret: string, timestamp: string, body: string): string { + return 'v0=' + crypto.createHmac('sha256', secret).update(`v0:${timestamp}:${body}`).digest('hex'); + } + + beforeEach(() => { + smSendMock.mockReset(); + invalidateSlackSecretCache(SECRET_ARN); + }); + + test('verifies with cached secret on first call', async () => { + const secret = 'cached-secret'; + smSendMock.mockResolvedValueOnce({ SecretString: secret }); + + const ts = String(Math.floor(Date.now() / 1000)); + const body = 'token=abc'; + const sig = signWith(secret, ts, body); + + expect(await verifySlackRequest(SECRET_ARN, sig, ts, body)).toBe(true); + expect(smSendMock).toHaveBeenCalledTimes(1); + }); + + test('refetches and verifies when cached secret was rotated out', async () => { + // First fetch: stale secret (will fail verification). + // Second fetch (forced refresh): rotated secret (succeeds). + smSendMock + .mockResolvedValueOnce({ SecretString: 'stale-secret' }) + .mockResolvedValueOnce({ SecretString: 'rotated-secret' }); + + const ts = String(Math.floor(Date.now() / 1000)); + const body = 'token=abc'; + const sig = signWith('rotated-secret', ts, body); + + expect(await verifySlackRequest(SECRET_ARN, sig, ts, body)).toBe(true); + expect(smSendMock).toHaveBeenCalledTimes(2); + }); + + test('does not re-verify when refreshed secret is identical to cached one', async () => { + const secret = 'same-secret'; + smSendMock + .mockResolvedValueOnce({ SecretString: secret }) + .mockResolvedValueOnce({ SecretString: secret }); + + const ts = String(Math.floor(Date.now() / 1000)); + const body = 'token=abc'; + const sig = 'v0=deadbeef'; + + expect(await verifySlackRequest(SECRET_ARN, sig, ts, body)).toBe(false); + expect(smSendMock).toHaveBeenCalledTimes(2); + }); + + test('returns false when secret cannot be fetched', async () => { + smSendMock.mockRejectedValue(Object.assign(new Error('not found'), { name: 'ResourceNotFoundException' })); + + const ts = String(Math.floor(Date.now() / 1000)); + expect(await verifySlackRequest(SECRET_ARN, 'v0=whatever', ts, 'body')).toBe(false); + }); +}); diff --git a/cli/src/commands/slack.ts b/cli/src/commands/slack.ts index 7e201fc..558b445 100644 --- a/cli/src/commands/slack.ts +++ b/cli/src/commands/slack.ts @@ -350,7 +350,16 @@ async function getStackOutput(region: string, stackName: string, outputKey: stri const outputs = result.Stacks?.[0]?.Outputs ?? []; const output = outputs.find((o) => o.OutputKey === outputKey); return output?.OutputValue ?? null; - } catch { - return null; + } catch (err) { + // Only swallow the "stack does not exist" case — that's the "not deployed yet" + // path callers expect as null. Auth failures (ExpiredToken, + // UnauthorizedOperation, AccessDenied, etc.) must surface so users see the + // real error instead of a misleading "stack not deployed" message. + const name = (err as Error)?.name ?? ''; + const message = (err as Error)?.message ?? ''; + if (name === 'ValidationError' && /does not exist/i.test(message)) { + return null; + } + throw err; } } From 01dbdea921374a9873895cf7a05f294283d306d6 Mon Sep 17 00:00:00 2001 From: Sphia Sadek Date: Tue, 5 May 2026 10:09:33 -0400 Subject: [PATCH 04/23] test(slack): add handler-level tests for all 7 Slack Lambda handlers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Addresses review item 12 / general feedback 4: the shared utilities (slack-verify, slack-blocks) and CDK constructs had solid coverage but all 7 Lambda handlers had zero unit tests, a departure from the rest of the codebase. Added test files covering the most load-bearing paths: - slack-events.test.ts (11 tests) — url_verification challenge with/ without signature (item 2), retry semantics (drop non-critical, reprocess app_uninstalled + tokens_revoked, item 3), revoke-installation ordering (item 6: no secret delete on DDB failure), app_mention forwarding, no-repo + Lambda-failure reaction swaps (item 8) - slack-commands.test.ts (4 tests) — signature rejection, inline help, async processor invocation, graceful processor failure - slack-interactions.test.ts (6 tests) — signature rejection, cancel_task happy path + owner rejection + terminal-state warn, unknown action_id, unlinked account - slack-notify.test.ts (8 tests) — non-Slack task short-circuit, dedup ordering after source check (item 17), dedup write skip on duplicate, SlackApiError swallow vs infra-error rethrow (item 4), non-INSERT / non-notifiable filter, malformed metadata logging (item 20) - slack-link.test.ts (6 tests) — 401 without JWT, 400 without code, 404 on missing/stale code, happy path write+delete, code normalization - slack-oauth-callback.test.ts (5 tests) — missing code, unpopulated client secret, token exchange failure, create-secret-on-RNF path, restore-then-update path for reinstall after uninstall - slack-command-processor.test.ts (9 tests) — legacy source-less payload normalization, slash-submit-rejection UX, mention link-prompt + repo validation + private channel guard (item 10 hard failure) + transient fail-open (item 10 softening), createTaskCore invocation, link code persistence, help text The regression tests for items 2, 3, 4, 6, 9 all fail the buggy pre-fix version of the code, verified by running them against the unchanged source during review. --- .../handlers/slack-command-processor.test.ts | 198 ++++++++++++ cdk/test/handlers/slack-commands.test.ts | 113 +++++++ cdk/test/handlers/slack-events.test.ts | 300 ++++++++++++++++++ cdk/test/handlers/slack-interactions.test.ts | 178 +++++++++++ cdk/test/handlers/slack-link.test.ts | 120 +++++++ cdk/test/handlers/slack-notify.test.ts | 197 ++++++++++++ .../handlers/slack-oauth-callback.test.ts | 173 ++++++++++ 7 files changed, 1279 insertions(+) create mode 100644 cdk/test/handlers/slack-command-processor.test.ts create mode 100644 cdk/test/handlers/slack-commands.test.ts create mode 100644 cdk/test/handlers/slack-events.test.ts create mode 100644 cdk/test/handlers/slack-interactions.test.ts create mode 100644 cdk/test/handlers/slack-link.test.ts create mode 100644 cdk/test/handlers/slack-notify.test.ts create mode 100644 cdk/test/handlers/slack-oauth-callback.test.ts diff --git a/cdk/test/handlers/slack-command-processor.test.ts b/cdk/test/handlers/slack-command-processor.test.ts new file mode 100644 index 0000000..62edc29 --- /dev/null +++ b/cdk/test/handlers/slack-command-processor.test.ts @@ -0,0 +1,198 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +const ddbSend = jest.fn(); +jest.mock('@aws-sdk/client-dynamodb', () => ({ DynamoDBClient: jest.fn(() => ({})) })); +jest.mock('@aws-sdk/lib-dynamodb', () => ({ + DynamoDBDocumentClient: { from: jest.fn(() => ({ send: ddbSend })) }, + GetCommand: jest.fn((input: unknown) => ({ _type: 'Get', input })), + PutCommand: jest.fn((input: unknown) => ({ _type: 'Put', input })), +})); + +const smSend = jest.fn(); +jest.mock('@aws-sdk/client-secrets-manager', () => ({ + SecretsManagerClient: jest.fn(() => ({ send: smSend })), + GetSecretValueCommand: jest.fn((input: unknown) => ({ _type: 'GetSecretValue', input })), +})); + +const createTaskCoreMock = jest.fn(); +jest.mock('../../src/handlers/shared/create-task-core', () => ({ + createTaskCore: (...args: unknown[]) => createTaskCoreMock(...args), +})); + +const fetchMock = jest.fn(); +(global as unknown as { fetch: unknown }).fetch = fetchMock; + +process.env.SLACK_USER_MAPPING_TABLE_NAME = 'SlackMap'; +process.env.SLACK_INSTALLATION_TABLE_NAME = 'SlackInstall'; + +import type { MentionEvent, SlashCommandEvent } from '../../src/handlers/slack-command-processor'; +import { handler } from '../../src/handlers/slack-command-processor'; + +function mention(overrides: Partial = {}): MentionEvent { + return { + source: 'mention', + text: 'submit org/repo fix the bug', + user_id: 'U1', + team_id: 'T1', + channel_id: 'C1', + mention_thread_ts: '1000.0001', + ...overrides, + }; +} + +function slashCommand(overrides: Partial = {}): SlashCommandEvent { + return { + source: 'slash', + text: 'help', + user_id: 'U1', + team_id: 'T1', + channel_id: 'C1', + command: '/bgagent', + user_name: 'u', + team_domain: 'acme', + channel_name: 'general', + trigger_id: 'T.1', + response_url: 'https://hooks.slack.com/cmd/X', + ...overrides, + }; +} + +describe('slack-command-processor handler', () => { + beforeEach(() => { + ddbSend.mockReset(); + smSend.mockReset(); + fetchMock.mockReset(); + createTaskCoreMock.mockReset(); + smSend.mockResolvedValue({ SecretString: 'xoxb-bot' }); + fetchMock.mockResolvedValue({ + ok: true, + json: () => Promise.resolve({ ok: true }), + }); + }); + + test('slash command without source flag defaults to slash and falls through to default branch', async () => { + // Legacy shape: no source field — slash ack lambda forwards raw SlackCommandPayload + const legacy = { + command: '/bgagent', text: 'unknown_sub', user_id: 'U1', team_id: 'T1', channel_id: 'C1', + user_name: '', team_domain: '', channel_name: '', trigger_id: '', + response_url: 'https://hooks.slack.com/cmd/X', + }; + await handler(legacy); + // Posted the default "Use @Shoof" hint back to the response_url + const posted = fetchMock.mock.calls.find( + ([url, opts]) => String(url).startsWith('https://hooks.slack.com') && String((opts as { body: string }).body).includes('Use `@Shoof`'), + ); + expect(posted).toBeTruthy(); + }); + + test('slash submit tells user to use @mention', async () => { + await handler(slashCommand({ text: 'submit org/repo fix' })); + const posted = fetchMock.mock.calls.find( + ([url, opts]) => String((opts as { body: string }).body).includes('Use `@Shoof` to submit tasks'), + ); + expect(posted).toBeTruthy(); + expect(createTaskCoreMock).not.toHaveBeenCalled(); + }); + + test('mention submit requires linked account (prompts /bgagent link)', async () => { + // 1. User mapping lookup: not found + ddbSend.mockResolvedValueOnce({ Item: undefined }); + // 2. swapReaction → getBotToken → installation lookup (for :x: swap) + ddbSend.mockResolvedValue({ Item: { status: 'active' } }); + await handler(mention({ text: 'submit org/repo fix' })); + const reply = fetchMock.mock.calls.find( + ([url, opts]) => String(url).includes('chat.postMessage') && String((opts as { body: string }).body).includes('not linked'), + ); + expect(reply).toBeTruthy(); + expect(createTaskCoreMock).not.toHaveBeenCalled(); + }); + + test('mention submit rejects malformed repo', async () => { + ddbSend.mockResolvedValueOnce({ Item: { status: 'active', platform_user_id: 'cognito-1' } }); + // swapReaction → getBotToken → installation lookup (for :x: swap) + ddbSend.mockResolvedValue({ Item: { status: 'active' } }); + await handler(mention({ text: 'submit not-a-repo fix' })); + const reply = fetchMock.mock.calls.find( + ([url, opts]) => String(url).includes('chat.postMessage') && String((opts as { body: string }).body).includes('Invalid repo format'), + ); + expect(reply).toBeTruthy(); + }); + + test('mention submit creates task via createTaskCore', async () => { + ddbSend.mockResolvedValueOnce({ Item: { status: 'active', platform_user_id: 'cognito-1' } }); + // Installation lookup for bot token (checkChannelAccess) + bot token secret + ddbSend.mockResolvedValueOnce({ Item: { status: 'active' } }); + // fetch: conversations.info response (public channel with bot as member) + fetchMock.mockResolvedValueOnce({ + ok: true, + json: () => Promise.resolve({ ok: true, channel: { is_private: false, is_member: true } }), + }); + createTaskCoreMock.mockResolvedValueOnce({ + statusCode: 201, + body: JSON.stringify({ data: { task_id: 'TASK123', repo: 'org/repo', status: 'SUBMITTED' } }), + }); + await handler(mention({ text: 'submit org/repo#42 add validation' })); + expect(createTaskCoreMock).toHaveBeenCalledTimes(1); + const [reqBody, ctx] = createTaskCoreMock.mock.calls[0]; + expect(reqBody.repo).toBe('org/repo'); + expect(reqBody.issue_number).toBe(42); + expect(reqBody.task_description).toBe('add validation'); + expect(ctx.channelSource).toBe('slack'); + expect(ctx.userId).toBe('cognito-1'); + // mention_thread_ts flows to channel_metadata + expect(ctx.channelMetadata.slack_thread_ts).toBe('1000.0001'); + }); + + test('mention submit in private channel bot is not in — replies with invite hint', async () => { + ddbSend.mockResolvedValueOnce({ Item: { status: 'active', platform_user_id: 'cognito-1' } }); + ddbSend.mockResolvedValue({ Item: { status: 'active' } }); + fetchMock.mockResolvedValueOnce({ + ok: true, + json: () => Promise.resolve({ ok: false, error: 'channel_not_found' }), + }); + await handler(mention({ text: 'submit org/repo fix' })); + const reply = fetchMock.mock.calls.find( + ([url, opts]) => String(url).includes('chat.postMessage') && String((opts as { body: string }).body).includes('private channel'), + ); + expect(reply).toBeTruthy(); + expect(createTaskCoreMock).not.toHaveBeenCalled(); + }); + + test('link subcommand persists pending mapping with a link code', async () => { + ddbSend.mockResolvedValueOnce({}); // Put pending mapping + await handler(slashCommand({ text: 'link' })); + const putCall = ddbSend.mock.calls.find(([cmd]) => cmd._type === 'Put'); + expect(putCall).toBeTruthy(); + expect(putCall![0].input.Item.slack_identity).toMatch(/^pending#/); + expect(putCall![0].input.Item.status).toBe('pending'); + const posted = fetchMock.mock.calls.find( + ([url, opts]) => String((opts as { body: string }).body).includes('bgagent slack link'), + ); + expect(posted).toBeTruthy(); + }); + + test('help subcommand replies with usage text', async () => { + await handler(slashCommand({ text: 'help' })); + const posted = fetchMock.mock.calls.find( + ([url, opts]) => String((opts as { body: string }).body).includes('Using Shoof'), + ); + expect(posted).toBeTruthy(); + }); +}); diff --git a/cdk/test/handlers/slack-commands.test.ts b/cdk/test/handlers/slack-commands.test.ts new file mode 100644 index 0000000..3ce1578 --- /dev/null +++ b/cdk/test/handlers/slack-commands.test.ts @@ -0,0 +1,113 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as crypto from 'crypto'; +import type { APIGatewayProxyEvent } from 'aws-lambda'; + +const lambdaSend = jest.fn(); +jest.mock('@aws-sdk/client-lambda', () => ({ + LambdaClient: jest.fn(() => ({ send: lambdaSend })), + InvokeCommand: jest.fn((input: unknown) => ({ _type: 'Invoke', input })), +})); + +const smSend = jest.fn(); +jest.mock('@aws-sdk/client-secrets-manager', () => ({ + SecretsManagerClient: jest.fn(() => ({ send: smSend })), + GetSecretValueCommand: jest.fn((input: unknown) => ({ _type: 'GetSecretValue', input })), +})); + +process.env.SLACK_SIGNING_SECRET_ARN = 'arn:aws:secretsmanager:us-east-1:123:secret:bgagent/slack/signing-ABC'; +process.env.SLACK_COMMAND_PROCESSOR_FUNCTION_NAME = 'cmd-processor'; + +import { invalidateSlackSecretCache } from '../../src/handlers/shared/slack-verify'; +import { handler } from '../../src/handlers/slack-commands'; + +const SIGNING_SECRET = 'test-signing'; + +function sign(body: string, ts: string): string { + return 'v0=' + crypto.createHmac('sha256', SIGNING_SECRET).update(`v0:${ts}:${body}`).digest('hex'); +} + +function makeEvent(body: string, ts: string, withSig = true): APIGatewayProxyEvent { + const headers: Record = { 'X-Slack-Request-Timestamp': ts }; + if (withSig) headers['X-Slack-Signature'] = sign(body, ts); + return { + body, + headers, + multiValueHeaders: {}, + httpMethod: 'POST', + isBase64Encoded: false, + path: '/v1/slack/commands', + pathParameters: null, + queryStringParameters: null, + multiValueQueryStringParameters: null, + stageVariables: null, + requestContext: {} as APIGatewayProxyEvent['requestContext'], + resource: '', + }; +} + +describe('slack-commands handler', () => { + beforeEach(() => { + lambdaSend.mockReset(); + smSend.mockReset(); + invalidateSlackSecretCache(process.env.SLACK_SIGNING_SECRET_ARN!); + smSend.mockResolvedValue({ SecretString: SIGNING_SECRET }); + }); + + test('rejects invalid signature with 401', async () => { + const body = 'command=%2Fbgagent&text=link&user_id=U1'; + const ts = String(Math.floor(Date.now() / 1000)); + const event = makeEvent(body, ts, false); + event.headers['X-Slack-Signature'] = 'v0=deadbeef'; + const result = await handler(event); + expect(result.statusCode).toBe(401); + }); + + test('returns inline help for empty text or `help`', async () => { + const body = 'command=%2Fbgagent&text=help&user_id=U1&team_id=T1&channel_id=C1&response_url=https%3A%2F%2Fexample.com'; + const ts = String(Math.floor(Date.now() / 1000)); + const result = await handler(makeEvent(body, ts)); + expect(result.statusCode).toBe(200); + const payload = JSON.parse(result.body); + expect(payload.text).toContain('Using Shoof'); + expect(lambdaSend).not.toHaveBeenCalled(); + }); + + test('forwards non-help subcommand to processor and acks inline', async () => { + lambdaSend.mockResolvedValueOnce({}); + const body = 'command=%2Fbgagent&text=link&user_id=U1&team_id=T1&channel_id=C1&response_url=https%3A%2F%2Fexample.com'; + const ts = String(Math.floor(Date.now() / 1000)); + const result = await handler(makeEvent(body, ts)); + expect(result.statusCode).toBe(200); + expect(lambdaSend).toHaveBeenCalledTimes(1); + const payload = JSON.parse(result.body); + expect(payload.text).toContain('link'); + }); + + test('handles processor invoke failure gracefully', async () => { + lambdaSend.mockRejectedValueOnce(new Error('lambda down')); + const body = 'command=%2Fbgagent&text=link&user_id=U1&team_id=T1&channel_id=C1&response_url=https%3A%2F%2Fexample.com'; + const ts = String(Math.floor(Date.now() / 1000)); + const result = await handler(makeEvent(body, ts)); + expect(result.statusCode).toBe(200); + const payload = JSON.parse(result.body); + expect(payload.text).toMatch(/Failed|try again/i); + }); +}); diff --git a/cdk/test/handlers/slack-events.test.ts b/cdk/test/handlers/slack-events.test.ts new file mode 100644 index 0000000..eedc412 --- /dev/null +++ b/cdk/test/handlers/slack-events.test.ts @@ -0,0 +1,300 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as crypto from 'crypto'; +import type { APIGatewayProxyEvent } from 'aws-lambda'; + +// --- Mocks --- +const ddbSend = jest.fn(); +jest.mock('@aws-sdk/client-dynamodb', () => ({ DynamoDBClient: jest.fn(() => ({})) })); +jest.mock('@aws-sdk/lib-dynamodb', () => ({ + DynamoDBDocumentClient: { from: jest.fn(() => ({ send: ddbSend })) }, + UpdateCommand: jest.fn((input: unknown) => ({ _type: 'Update', input })), +})); + +const lambdaSend = jest.fn(); +jest.mock('@aws-sdk/client-lambda', () => ({ + LambdaClient: jest.fn(() => ({ send: lambdaSend })), + InvokeCommand: jest.fn((input: unknown) => ({ _type: 'Invoke', input })), +})); + +const smSend = jest.fn(); +jest.mock('@aws-sdk/client-secrets-manager', () => ({ + SecretsManagerClient: jest.fn(() => ({ send: smSend })), + GetSecretValueCommand: jest.fn((input: unknown) => ({ _type: 'GetSecretValue', input })), + DeleteSecretCommand: jest.fn((input: unknown) => ({ _type: 'DeleteSecret', input })), +})); + +const fetchMock = jest.fn(); +(global as unknown as { fetch: unknown }).fetch = fetchMock; + +process.env.SLACK_INSTALLATION_TABLE_NAME = 'SlackInstall'; +process.env.SLACK_SIGNING_SECRET_ARN = 'arn:aws:secretsmanager:us-east-1:123:secret:bgagent/slack/signing-XYZ'; +process.env.SLACK_COMMAND_PROCESSOR_FUNCTION_NAME = 'cmd-processor'; + +import { invalidateSlackSecretCache } from '../../src/handlers/shared/slack-verify'; +import { handler } from '../../src/handlers/slack-events'; + +const SIGNING_SECRET = 'test-signing-secret'; + +function sign(body: string, timestamp: string): string { + return 'v0=' + crypto.createHmac('sha256', SIGNING_SECRET).update(`v0:${timestamp}:${body}`).digest('hex'); +} + +function currentTs(): string { + return String(Math.floor(Date.now() / 1000)); +} + +function makeEvent(body: string, headers: Record = {}): APIGatewayProxyEvent { + return { + body, + headers, + multiValueHeaders: {}, + httpMethod: 'POST', + isBase64Encoded: false, + path: '/v1/slack/events', + pathParameters: null, + queryStringParameters: null, + multiValueQueryStringParameters: null, + stageVariables: null, + requestContext: {} as APIGatewayProxyEvent['requestContext'], + resource: '', + }; +} + +function signedEvent(body: string, retryNum?: string): APIGatewayProxyEvent { + const ts = currentTs(); + const headers: Record = { + 'X-Slack-Signature': sign(body, ts), + 'X-Slack-Request-Timestamp': ts, + }; + if (retryNum) headers['X-Slack-Retry-Num'] = retryNum; + return makeEvent(body, headers); +} + +describe('slack-events handler', () => { + beforeEach(() => { + ddbSend.mockReset(); + lambdaSend.mockReset(); + smSend.mockReset(); + fetchMock.mockReset(); + invalidateSlackSecretCache(process.env.SLACK_SIGNING_SECRET_ARN!); + // Default: signing secret fetched on demand + smSend.mockImplementation((cmd: { _type: string }) => { + if (cmd._type === 'GetSecretValue') return Promise.resolve({ SecretString: SIGNING_SECRET }); + return Promise.resolve({}); + }); + }); + + test('400s when body is missing', async () => { + const event = makeEvent(null as unknown as string); + const result = await handler(event); + expect(result.statusCode).toBe(400); + }); + + test('answers url_verification challenge with valid signature', async () => { + const body = JSON.stringify({ type: 'url_verification', challenge: 'abc123' }); + const result = await handler(signedEvent(body)); + expect(result.statusCode).toBe(200); + expect(JSON.parse(result.body)).toEqual({ challenge: 'abc123' }); + }); + + test('rejects url_verification with invalid signature', async () => { + const body = JSON.stringify({ type: 'url_verification', challenge: 'abc' }); + const ts = currentTs(); + const event = makeEvent(body, { + 'X-Slack-Signature': 'v0=0000000000000000000000000000000000000000000000000000000000000000', + 'X-Slack-Request-Timestamp': ts, + }); + const result = await handler(event); + expect(result.statusCode).toBe(401); + }); + + test('answers url_verification during initial setup when signing secret missing', async () => { + smSend.mockImplementation(() => Promise.resolve({ SecretString: undefined })); + invalidateSlackSecretCache(process.env.SLACK_SIGNING_SECRET_ARN!); + const body = JSON.stringify({ type: 'url_verification', challenge: 'initial' }); + // No signature provided — pre-setup flow + const result = await handler(makeEvent(body, {})); + expect(result.statusCode).toBe(200); + expect(JSON.parse(result.body)).toEqual({ challenge: 'initial' }); + }); + + test('rejects non-url_verification when signing secret missing', async () => { + smSend.mockImplementation(() => Promise.resolve({ SecretString: undefined })); + invalidateSlackSecretCache(process.env.SLACK_SIGNING_SECRET_ARN!); + const body = JSON.stringify({ type: 'event_callback', event: { type: 'app_mention' } }); + const result = await handler(makeEvent(body, {})); + expect(result.statusCode).toBe(500); + }); + + test('drops non-critical retries without reprocessing', async () => { + const body = JSON.stringify({ + type: 'event_callback', + team_id: 'T1', + event: { type: 'app_mention', user: 'U1', channel: 'C1', text: '<@BOT> hi', ts: '1.0' }, + }); + const result = await handler(signedEvent(body, '1')); + expect(result.statusCode).toBe(200); + // No lambda invocation because the retry is short-circuited + expect(lambdaSend).not.toHaveBeenCalled(); + }); + + test('reprocesses retries for app_uninstalled (security-critical)', async () => { + ddbSend.mockResolvedValueOnce({}); // UpdateCommand + smSend.mockImplementation((cmd: { _type: string }) => { + if (cmd._type === 'GetSecretValue') return Promise.resolve({ SecretString: SIGNING_SECRET }); + if (cmd._type === 'DeleteSecret') return Promise.resolve({}); + return Promise.resolve({}); + }); + const body = JSON.stringify({ + type: 'event_callback', + team_id: 'T_revoke', + event: { type: 'app_uninstalled' }, + }); + const result = await handler(signedEvent(body, '2')); + expect(result.statusCode).toBe(200); + // DDB was updated (status→revoked) even though this is a retry + expect(ddbSend).toHaveBeenCalledTimes(1); + // And the secret deletion happened + const deleteCalled = smSend.mock.calls.some(([cmd]) => cmd._type === 'DeleteSecret'); + expect(deleteCalled).toBe(true); + }); + + test('does not delete bot token if DDB revocation update failed', async () => { + ddbSend.mockRejectedValueOnce(new Error('ddb throttle')); + const body = JSON.stringify({ + type: 'event_callback', + team_id: 'T_revoke', + event: { type: 'tokens_revoked' }, + }); + const result = await handler(signedEvent(body)); + expect(result.statusCode).toBe(500); + // Critical invariant: don't delete secret if install is still "active" in DDB + const deleteCalled = smSend.mock.calls.some(([cmd]) => cmd._type === 'DeleteSecret'); + expect(deleteCalled).toBe(false); + }); + + test('forwards app_mention to command processor with :eyes: reaction', async () => { + // First fetch is reactions.add for :eyes:, returns { ok: true } + fetchMock.mockResolvedValue({ + ok: true, + json: () => Promise.resolve({ ok: true }), + }); + lambdaSend.mockResolvedValueOnce({}); + smSend.mockImplementation((cmd: { _type: string; input?: { SecretId?: string } }) => { + if (cmd._type === 'GetSecretValue' && cmd.input?.SecretId === process.env.SLACK_SIGNING_SECRET_ARN) { + return Promise.resolve({ SecretString: SIGNING_SECRET }); + } + // Bot token lookup + return Promise.resolve({ SecretString: 'xoxb-bot' }); + }); + + const body = JSON.stringify({ + type: 'event_callback', + team_id: 'T1', + event: { + type: 'app_mention', + user: 'U1', + channel: 'C1', + text: '<@BOT> fix the bug in org/repo#42', + ts: '1234.0001', + }, + }); + const result = await handler(signedEvent(body)); + expect(result.statusCode).toBe(200); + expect(lambdaSend).toHaveBeenCalledTimes(1); + const [invokeCmd] = lambdaSend.mock.calls[0]; + const payload = JSON.parse(new TextDecoder().decode(invokeCmd.input.Payload)); + expect(payload.source).toBe('mention'); + expect(payload.text).toContain('submit'); + expect(payload.text).toContain('org/repo#42'); + expect(payload.channel_id).toBe('C1'); + // Reactions.add was called + const reactionCall = fetchMock.mock.calls.find(([url]) => String(url).includes('reactions.add')); + expect(reactionCall).toBeTruthy(); + }); + + test('app_mention without repo replies with :x: and helpful error', async () => { + fetchMock.mockResolvedValue({ + ok: true, + json: () => Promise.resolve({ ok: true }), + }); + smSend.mockImplementation((cmd: { _type: string; input?: { SecretId?: string } }) => { + if (cmd._type === 'GetSecretValue' && cmd.input?.SecretId === process.env.SLACK_SIGNING_SECRET_ARN) { + return Promise.resolve({ SecretString: SIGNING_SECRET }); + } + return Promise.resolve({ SecretString: 'xoxb-bot' }); + }); + + const body = JSON.stringify({ + type: 'event_callback', + team_id: 'T1', + event: { type: 'app_mention', user: 'U1', channel: 'C1', text: '<@BOT> just a question', ts: '1.0' }, + }); + const result = await handler(signedEvent(body)); + expect(result.statusCode).toBe(200); + expect(lambdaSend).not.toHaveBeenCalled(); + const postedReply = fetchMock.mock.calls.find( + ([url, opts]) => String(url).includes('chat.postMessage') && String((opts as { body: string }).body).includes('Please include a repo'), + ); + expect(postedReply).toBeTruthy(); + }); + + test('app_mention with Lambda invoke failure swaps :eyes: to :x:', async () => { + fetchMock.mockResolvedValue({ + ok: true, + json: () => Promise.resolve({ ok: true }), + }); + lambdaSend.mockRejectedValueOnce(new Error('lambda outage')); + smSend.mockImplementation((cmd: { _type: string; input?: { SecretId?: string } }) => { + if (cmd._type === 'GetSecretValue' && cmd.input?.SecretId === process.env.SLACK_SIGNING_SECRET_ARN) { + return Promise.resolve({ SecretString: SIGNING_SECRET }); + } + return Promise.resolve({ SecretString: 'xoxb-bot' }); + }); + + const body = JSON.stringify({ + type: 'event_callback', + team_id: 'T1', + event: { + type: 'app_mention', + user: 'U1', + channel: 'C1', + text: '<@BOT> fix org/repo', + ts: '1.0', + }, + }); + const result = await handler(signedEvent(body)); + expect(result.statusCode).toBe(200); // Still 200 — Slack retries give a second chance + // Should have swapped reaction: remove :eyes:, add :x:, then post error message + const removeCall = fetchMock.mock.calls.find( + ([url, opts]) => String(url).includes('reactions.remove') && String((opts as { body: string }).body).includes('eyes'), + ); + const addCall = fetchMock.mock.calls.find( + ([url, opts]) => String(url).includes('reactions.add') && String((opts as { body: string }).body).includes('"name":"x"'), + ); + const errorReply = fetchMock.mock.calls.find( + ([url, opts]) => String(url).includes('chat.postMessage') && String((opts as { body: string }).body).includes('Something went wrong'), + ); + expect(removeCall).toBeTruthy(); + expect(addCall).toBeTruthy(); + expect(errorReply).toBeTruthy(); + }); +}); diff --git a/cdk/test/handlers/slack-interactions.test.ts b/cdk/test/handlers/slack-interactions.test.ts new file mode 100644 index 0000000..f4bcaf1 --- /dev/null +++ b/cdk/test/handlers/slack-interactions.test.ts @@ -0,0 +1,178 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as crypto from 'crypto'; +import type { APIGatewayProxyEvent } from 'aws-lambda'; + +const ddbSend = jest.fn(); +jest.mock('@aws-sdk/client-dynamodb', () => ({ DynamoDBClient: jest.fn(() => ({})) })); +jest.mock('@aws-sdk/lib-dynamodb', () => ({ + DynamoDBDocumentClient: { from: jest.fn(() => ({ send: ddbSend })) }, + GetCommand: jest.fn((input: unknown) => ({ _type: 'Get', input })), + UpdateCommand: jest.fn((input: unknown) => ({ _type: 'Update', input })), +})); + +const smSend = jest.fn(); +jest.mock('@aws-sdk/client-secrets-manager', () => ({ + SecretsManagerClient: jest.fn(() => ({ send: smSend })), + GetSecretValueCommand: jest.fn((input: unknown) => ({ _type: 'GetSecretValue', input })), +})); + +const fetchMock = jest.fn(); +(global as unknown as { fetch: unknown }).fetch = fetchMock; + +process.env.SLACK_SIGNING_SECRET_ARN = 'arn:aws:secretsmanager:us-east-1:123:secret:bgagent/slack/signing-I'; +process.env.TASK_TABLE_NAME = 'Tasks'; +process.env.SLACK_USER_MAPPING_TABLE_NAME = 'SlackMap'; + +import { invalidateSlackSecretCache } from '../../src/handlers/shared/slack-verify'; +import { handler } from '../../src/handlers/slack-interactions'; + +const SIGNING_SECRET = 'test-signing'; + +function sign(body: string, ts: string): string { + return 'v0=' + crypto.createHmac('sha256', SIGNING_SECRET).update(`v0:${ts}:${body}`).digest('hex'); +} + +function makeInteractionEvent(payload: object): APIGatewayProxyEvent { + const body = `payload=${encodeURIComponent(JSON.stringify(payload))}`; + const ts = String(Math.floor(Date.now() / 1000)); + return { + body, + headers: { + 'X-Slack-Signature': sign(body, ts), + 'X-Slack-Request-Timestamp': ts, + }, + multiValueHeaders: {}, + httpMethod: 'POST', + isBase64Encoded: false, + path: '/v1/slack/interactions', + pathParameters: null, + queryStringParameters: null, + multiValueQueryStringParameters: null, + stageVariables: null, + requestContext: {} as APIGatewayProxyEvent['requestContext'], + resource: '', + }; +} + +function interactionPayload(actionId: string, userId = 'U1', teamId = 'T1'): object { + return { + type: 'block_actions', + user: { id: userId, username: 'u', team_id: teamId }, + response_url: 'https://hooks.slack.com/response/xyz', + trigger_id: 't.1', + actions: [{ action_id: actionId, block_id: 'task-123' }], + channel: { id: 'C1' }, + }; +} + +describe('slack-interactions handler', () => { + beforeEach(() => { + ddbSend.mockReset(); + smSend.mockReset(); + fetchMock.mockReset(); + invalidateSlackSecretCache(process.env.SLACK_SIGNING_SECRET_ARN!); + smSend.mockResolvedValue({ SecretString: SIGNING_SECRET }); + fetchMock.mockResolvedValue({ ok: true, json: () => Promise.resolve({ ok: true }) }); + }); + + test('rejects invalid signature with 401', async () => { + const body = 'payload=%7B%22type%22%3A%22block_actions%22%7D'; + const ts = String(Math.floor(Date.now() / 1000)); + const event: APIGatewayProxyEvent = { + body, + headers: { 'X-Slack-Signature': 'v0=000', 'X-Slack-Request-Timestamp': ts }, + multiValueHeaders: {}, + httpMethod: 'POST', isBase64Encoded: false, path: '/v1/slack/interactions', + pathParameters: null, queryStringParameters: null, multiValueQueryStringParameters: null, + stageVariables: null, requestContext: {} as APIGatewayProxyEvent['requestContext'], resource: '', + }; + const result = await handler(event); + expect(result.statusCode).toBe(401); + }); + + test('cancel_task transitions owned task to CANCELLED', async () => { + // 1. user mapping lookup → platform user id + ddbSend.mockResolvedValueOnce({ Item: { platform_user_id: 'user-42' } }); + // 2. task lookup → same owner + ddbSend.mockResolvedValueOnce({ Item: { task_id: 'task-42', user_id: 'user-42', channel_metadata: {} } }); + // 3. update → success + ddbSend.mockResolvedValueOnce({}); + + const event = makeInteractionEvent(interactionPayload('cancel_task:task-42', 'U1', 'T1')); + const result = await handler(event); + expect(result.statusCode).toBe(200); + const updateCall = ddbSend.mock.calls.find(([cmd]) => cmd._type === 'Update'); + expect(updateCall).toBeTruthy(); + expect(updateCall![0].input.ExpressionAttributeValues[':cancelled']).toBe('CANCELLED'); + }); + + test('cancel_task rejects when caller is not task owner', async () => { + ddbSend.mockResolvedValueOnce({ Item: { platform_user_id: 'attacker' } }); + ddbSend.mockResolvedValueOnce({ Item: { task_id: 'task-42', user_id: 'user-42' } }); + + const event = makeInteractionEvent(interactionPayload('cancel_task:task-42')); + const result = await handler(event); + expect(result.statusCode).toBe(200); + // No update attempted + const updateCall = ddbSend.mock.calls.find(([cmd]) => cmd._type === 'Update'); + expect(updateCall).toBeFalsy(); + // Posted to response_url with "own your own tasks" + const posted = fetchMock.mock.calls.find( + ([url, opts]) => String(url).startsWith('https://hooks.slack.com') && String((opts as { body: string }).body).includes('your own tasks'), + ); + expect(posted).toBeTruthy(); + }); + + test('cancel_task on already-terminal task warns the user', async () => { + ddbSend.mockResolvedValueOnce({ Item: { platform_user_id: 'user-42' } }); + ddbSend.mockResolvedValueOnce({ Item: { task_id: 'task-42', user_id: 'user-42' } }); + // ConditionalCheckFailedException => already in terminal state + const err = new Error('conditional failed'); + err.name = 'ConditionalCheckFailedException'; + ddbSend.mockRejectedValueOnce(err); + + const event = makeInteractionEvent(interactionPayload('cancel_task:task-42')); + const result = await handler(event); + expect(result.statusCode).toBe(200); + const posted = fetchMock.mock.calls.find( + ([url, opts]) => String(url).startsWith('https://hooks.slack.com') && String((opts as { body: string }).body).includes('terminal state'), + ); + expect(posted).toBeTruthy(); + }); + + test('unknown action_id is ignored silently', async () => { + const event = makeInteractionEvent(interactionPayload('other_action:xyz')); + const result = await handler(event); + expect(result.statusCode).toBe(200); + expect(ddbSend).not.toHaveBeenCalled(); + }); + + test('unlinked account receives :link: message instead of cancel', async () => { + ddbSend.mockResolvedValueOnce({ Item: { status: 'pending' } }); + const event = makeInteractionEvent(interactionPayload('cancel_task:task-42')); + const result = await handler(event); + expect(result.statusCode).toBe(200); + const posted = fetchMock.mock.calls.find( + ([url, opts]) => String(url).startsWith('https://hooks.slack.com') && String((opts as { body: string }).body).includes('not linked'), + ); + expect(posted).toBeTruthy(); + }); +}); diff --git a/cdk/test/handlers/slack-link.test.ts b/cdk/test/handlers/slack-link.test.ts new file mode 100644 index 0000000..1acd1c4 --- /dev/null +++ b/cdk/test/handlers/slack-link.test.ts @@ -0,0 +1,120 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import type { APIGatewayProxyEvent } from 'aws-lambda'; + +const ddbSend = jest.fn(); +jest.mock('@aws-sdk/client-dynamodb', () => ({ DynamoDBClient: jest.fn(() => ({})) })); +jest.mock('@aws-sdk/lib-dynamodb', () => ({ + DynamoDBDocumentClient: { from: jest.fn(() => ({ send: ddbSend })) }, + GetCommand: jest.fn((input: unknown) => ({ _type: 'Get', input })), + PutCommand: jest.fn((input: unknown) => ({ _type: 'Put', input })), + DeleteCommand: jest.fn((input: unknown) => ({ _type: 'Delete', input })), +})); + +jest.mock('ulid', () => ({ ulid: jest.fn(() => 'REQ-ULID') })); + +process.env.SLACK_USER_MAPPING_TABLE_NAME = 'SlackMap'; + +import { handler } from '../../src/handlers/slack-link'; + +function makeEvent(body: unknown, userId?: string): APIGatewayProxyEvent { + return { + body: body === null ? null : JSON.stringify(body), + headers: {}, + multiValueHeaders: {}, + httpMethod: 'POST', + isBase64Encoded: false, + path: '/v1/slack/link', + pathParameters: null, + queryStringParameters: null, + multiValueQueryStringParameters: null, + stageVariables: null, + requestContext: userId + ? ({ authorizer: { claims: { sub: userId } } } as unknown as APIGatewayProxyEvent['requestContext']) + : ({} as APIGatewayProxyEvent['requestContext']), + resource: '', + }; +} + +describe('slack-link handler', () => { + beforeEach(() => { + ddbSend.mockReset(); + }); + + test('401s without a Cognito JWT', async () => { + const result = await handler(makeEvent({ code: 'ABC123' })); + expect(result.statusCode).toBe(401); + }); + + test('400s without a code in the body', async () => { + const result = await handler(makeEvent({}, 'cognito-user-1')); + expect(result.statusCode).toBe(400); + }); + + test('404s when code is not found', async () => { + ddbSend.mockResolvedValueOnce({ Item: undefined }); + const result = await handler(makeEvent({ code: 'XYZ123' }, 'cognito-user-1')); + expect(result.statusCode).toBe(404); + }); + + test('404s when code exists but status is not pending', async () => { + ddbSend.mockResolvedValueOnce({ Item: { slack_identity: 'pending#XYZ', status: 'consumed' } }); + const result = await handler(makeEvent({ code: 'XYZ123' }, 'cognito-user-1')); + expect(result.statusCode).toBe(404); + }); + + test('writes confirmed mapping and deletes pending record on success', async () => { + ddbSend + .mockResolvedValueOnce({ + Item: { + slack_identity: 'pending#ABC123', + status: 'pending', + slack_team_id: 'T1', + slack_user_id: 'U_slack', + }, + }) + .mockResolvedValueOnce({}) // Put (confirmed mapping) + .mockResolvedValueOnce({}); // Delete (pending) + + const result = await handler(makeEvent({ code: 'abc123' }, 'cognito-user-1')); + expect(result.statusCode).toBe(200); + const putCall = ddbSend.mock.calls.find(([cmd]) => cmd._type === 'Put'); + expect(putCall).toBeTruthy(); + expect(putCall![0].input.Item.slack_identity).toBe('T1#U_slack'); + expect(putCall![0].input.Item.platform_user_id).toBe('cognito-user-1'); + + const deleteCall = ddbSend.mock.calls.find(([cmd]) => cmd._type === 'Delete'); + expect(deleteCall).toBeTruthy(); + expect(deleteCall![0].input.Key.slack_identity).toBe('pending#ABC123'); + }); + + test('normalizes the code (uppercase, trimmed)', async () => { + ddbSend + .mockResolvedValueOnce({ + Item: { slack_identity: 'pending#ABC123', status: 'pending', slack_team_id: 'T1', slack_user_id: 'U1' }, + }) + .mockResolvedValueOnce({}) + .mockResolvedValueOnce({}); + + await handler(makeEvent({ code: ' abc123 ' }, 'cognito-user-1')); + const getCall = ddbSend.mock.calls.find(([cmd]) => cmd._type === 'Get'); + expect(getCall![0].input.Key.slack_identity).toBe('pending#ABC123'); + }); +}); diff --git a/cdk/test/handlers/slack-notify.test.ts b/cdk/test/handlers/slack-notify.test.ts new file mode 100644 index 0000000..f5a46b6 --- /dev/null +++ b/cdk/test/handlers/slack-notify.test.ts @@ -0,0 +1,197 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import type { DynamoDBStreamEvent, DynamoDBRecord } from 'aws-lambda'; + +const ddbSend = jest.fn(); +jest.mock('@aws-sdk/client-dynamodb', () => ({ DynamoDBClient: jest.fn(() => ({})) })); +jest.mock('@aws-sdk/lib-dynamodb', () => ({ + DynamoDBDocumentClient: { from: jest.fn(() => ({ send: ddbSend })) }, + GetCommand: jest.fn((input: unknown) => ({ _type: 'Get', input })), + UpdateCommand: jest.fn((input: unknown) => ({ _type: 'Update', input })), +})); + +const smSend = jest.fn(); +jest.mock('@aws-sdk/client-secrets-manager', () => ({ + SecretsManagerClient: jest.fn(() => ({ send: smSend })), + GetSecretValueCommand: jest.fn((input: unknown) => ({ _type: 'GetSecretValue', input })), +})); + +const fetchMock = jest.fn(); +(global as unknown as { fetch: unknown }).fetch = fetchMock; + +process.env.TASK_TABLE_NAME = 'Tasks'; + +import { handler } from '../../src/handlers/slack-notify'; + +function makeInsertRecord( + taskId: string, + eventType: string, + metadata?: Record, +): DynamoDBRecord { + return { + eventID: `evt-${Math.random()}`, + eventName: 'INSERT', + dynamodb: { + NewImage: { + task_id: { S: taskId }, + event_type: { S: eventType }, + ...(metadata && { metadata: { S: JSON.stringify(metadata) } }), + }, + }, + }; +} + +function withRecords(records: DynamoDBRecord[]): DynamoDBStreamEvent { + return { Records: records }; +} + +describe('slack-notify handler', () => { + beforeEach(() => { + ddbSend.mockReset(); + smSend.mockReset(); + fetchMock.mockReset(); + smSend.mockResolvedValue({ SecretString: 'xoxb-test' }); + fetchMock.mockResolvedValue({ + ok: true, + json: () => Promise.resolve({ ok: true, ts: '1234.0001' }), + }); + }); + + test('skips non-slack tasks without touching DDB beyond the task read', async () => { + ddbSend.mockResolvedValueOnce({ + Item: { task_id: 't1', channel_source: 'api', channel_metadata: {} }, + }); + + await handler(withRecords([makeInsertRecord('t1', 'task_completed')])); + + // Only the initial GetCommand ran — no dedup update, no Slack call. + expect(ddbSend).toHaveBeenCalledTimes(1); + expect(fetchMock).not.toHaveBeenCalled(); + }); + + test('dedup write runs only after channel_source is confirmed slack', async () => { + ddbSend + .mockResolvedValueOnce({ + Item: { + task_id: 't1', + channel_source: 'slack', + channel_metadata: { slack_team_id: 'T1', slack_channel_id: 'C1' }, + repo: 'org/repo', + }, + }) + .mockResolvedValueOnce({}); // UpdateCommand for dedup + + await handler(withRecords([makeInsertRecord('t1', 'task_completed')])); + + // GetCommand first, then UpdateCommand (dedup). Order matters (item 17). + expect(ddbSend.mock.calls[0][0]._type).toBe('Get'); + expect(ddbSend.mock.calls[1][0]._type).toBe('Update'); + expect(fetchMock).toHaveBeenCalled(); + }); + + test('skips terminal notification when dedup marker already exists', async () => { + ddbSend + .mockResolvedValueOnce({ + Item: { + task_id: 't1', + channel_source: 'slack', + channel_metadata: { slack_team_id: 'T1', slack_channel_id: 'C1' }, + }, + }) + .mockRejectedValueOnce(Object.assign(new Error('exists'), { name: 'ConditionalCheckFailedException' })); + + await handler(withRecords([makeInsertRecord('t1', 'task_failed')])); + + expect(fetchMock).not.toHaveBeenCalled(); + }); + + test('swallows Slack API errors without failing the batch', async () => { + ddbSend.mockResolvedValue({ + Item: { + task_id: 't1', + channel_source: 'slack', + channel_metadata: { slack_team_id: 'T1', slack_channel_id: 'C1' }, + }, + }); + fetchMock.mockResolvedValueOnce({ + ok: true, + json: () => Promise.resolve({ ok: false, error: 'channel_not_found' }), + }); + + await expect( + handler(withRecords([makeInsertRecord('t1', 'task_created')])), + ).resolves.toBeUndefined(); + }); + + test('rethrows infra errors so Lambda retries the batch (item 4)', async () => { + ddbSend.mockRejectedValueOnce(Object.assign(new Error('throttle'), { name: 'ProvisionedThroughputExceededException' })); + + await expect( + handler(withRecords([makeInsertRecord('t1', 'task_completed')])), + ).rejects.toThrow('throttle'); + }); + + test('ignores non-INSERT stream events', async () => { + const modifyRecord: DynamoDBRecord = { + eventID: 'evt-modify', + eventName: 'MODIFY', + dynamodb: { NewImage: { task_id: { S: 't1' }, event_type: { S: 'task_completed' } } }, + }; + await handler(withRecords([modifyRecord])); + expect(ddbSend).not.toHaveBeenCalled(); + }); + + test('ignores non-notifiable event types', async () => { + await handler(withRecords([makeInsertRecord('t1', 'agent_heartbeat')])); + expect(ddbSend).not.toHaveBeenCalled(); + }); + + test('logs and continues when event metadata JSON is malformed (item 20)', async () => { + const record: DynamoDBRecord = { + eventID: 'evt-bad-meta', + eventName: 'INSERT', + dynamodb: { + NewImage: { + task_id: { S: 't1' }, + event_type: { S: 'task_failed' }, + metadata: { S: 'not-json{' }, + }, + }, + }; + ddbSend + .mockResolvedValueOnce({ + Item: { + task_id: 't1', + channel_source: 'slack', + channel_metadata: { slack_team_id: 'T1', slack_channel_id: 'C1' }, + repo: 'org/repo', + error_message: 'agent crashed', + }, + }) + .mockResolvedValueOnce({}); // dedup + + await handler(withRecords([record])); + + // Still posts to Slack — bad metadata is not fatal. + expect(fetchMock).toHaveBeenCalled(); + const postBody = JSON.parse((fetchMock.mock.calls[0][1] as { body: string }).body); + expect(postBody.text).toContain('org/repo'); + }); +}); diff --git a/cdk/test/handlers/slack-oauth-callback.test.ts b/cdk/test/handlers/slack-oauth-callback.test.ts new file mode 100644 index 0000000..d9d24a6 --- /dev/null +++ b/cdk/test/handlers/slack-oauth-callback.test.ts @@ -0,0 +1,173 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import type { APIGatewayProxyEvent } from 'aws-lambda'; + +const ddbSend = jest.fn(); +jest.mock('@aws-sdk/client-dynamodb', () => ({ DynamoDBClient: jest.fn(() => ({})) })); +jest.mock('@aws-sdk/lib-dynamodb', () => ({ + DynamoDBDocumentClient: { from: jest.fn(() => ({ send: ddbSend })) }, + PutCommand: jest.fn((input: unknown) => ({ _type: 'Put', input })), +})); + +class MockResourceNotFoundException extends Error { + constructor() { super('not found'); this.name = 'ResourceNotFoundException'; } +} +class MockInvalidRequestException extends Error { + constructor(message: string) { super(message); this.name = 'InvalidRequestException'; } +} + +const smSend = jest.fn(); +jest.mock('@aws-sdk/client-secrets-manager', () => ({ + SecretsManagerClient: jest.fn(() => ({ send: smSend })), + GetSecretValueCommand: jest.fn((input: unknown) => ({ _type: 'GetSecretValue', input })), + CreateSecretCommand: jest.fn((input: unknown) => ({ _type: 'CreateSecret', input })), + UpdateSecretCommand: jest.fn((input: unknown) => ({ _type: 'UpdateSecret', input })), + RestoreSecretCommand: jest.fn((input: unknown) => ({ _type: 'RestoreSecret', input })), + ResourceNotFoundException: MockResourceNotFoundException, + InvalidRequestException: MockInvalidRequestException, +})); + +const fetchMock = jest.fn(); +(global as unknown as { fetch: unknown }).fetch = fetchMock; + +process.env.SLACK_INSTALLATION_TABLE_NAME = 'SlackInstall'; +process.env.SLACK_CLIENT_ID_SECRET_ARN = 'arn:aws:secretsmanager:us-east-1:123:secret:bgagent/slack/client_id-1'; +process.env.SLACK_CLIENT_SECRET_ARN = 'arn:aws:secretsmanager:us-east-1:123:secret:bgagent/slack/client_secret-1'; + +import { invalidateSlackSecretCache } from '../../src/handlers/shared/slack-verify'; +import { handler } from '../../src/handlers/slack-oauth-callback'; + +function makeEvent(code?: string): APIGatewayProxyEvent { + return { + body: null, + headers: { Host: 'api.example.com' }, + multiValueHeaders: {}, + httpMethod: 'GET', + isBase64Encoded: false, + path: '/v1/slack/oauth/callback', + pathParameters: null, + queryStringParameters: code ? { code } : null, + multiValueQueryStringParameters: null, + stageVariables: null, + requestContext: { stage: 'v1' } as APIGatewayProxyEvent['requestContext'], + resource: '', + }; +} + +describe('slack-oauth-callback handler', () => { + beforeEach(() => { + ddbSend.mockReset(); + smSend.mockReset(); + fetchMock.mockReset(); + invalidateSlackSecretCache(process.env.SLACK_CLIENT_ID_SECRET_ARN!); + invalidateSlackSecretCache(process.env.SLACK_CLIENT_SECRET_ARN!); + smSend.mockImplementation((cmd: { _type: string; input?: { SecretId?: string } }) => { + if (cmd._type === 'GetSecretValue') { + if (cmd.input?.SecretId === process.env.SLACK_CLIENT_ID_SECRET_ARN) { + return Promise.resolve({ SecretString: 'client-id-123' }); + } + if (cmd.input?.SecretId === process.env.SLACK_CLIENT_SECRET_ARN) { + return Promise.resolve({ SecretString: 'client-secret-xyz' }); + } + } + return Promise.resolve({}); + }); + }); + + test('400s when code is missing', async () => { + const result = await handler(makeEvent()); + expect(result.statusCode).toBe(400); + }); + + test('500s when client ID secret is not populated', async () => { + smSend.mockImplementation((cmd: { _type: string; input?: { SecretId?: string } }) => { + if (cmd._type === 'GetSecretValue' && cmd.input?.SecretId === process.env.SLACK_CLIENT_ID_SECRET_ARN) { + return Promise.resolve({ SecretString: undefined }); + } + return Promise.resolve({}); + }); + invalidateSlackSecretCache(process.env.SLACK_CLIENT_ID_SECRET_ARN!); + const result = await handler(makeEvent('code123')); + expect(result.statusCode).toBe(500); + }); + + test('400s when Slack rejects the token exchange', async () => { + fetchMock.mockResolvedValueOnce({ + ok: true, + json: () => Promise.resolve({ ok: false, error: 'invalid_code' }), + }); + const result = await handler(makeEvent('badcode')); + expect(result.statusCode).toBe(400); + expect(result.body).toContain('invalid_code'); + }); + + test('successful install creates secret + records installation', async () => { + fetchMock.mockResolvedValueOnce({ + ok: true, + json: () => Promise.resolve({ + ok: true, + access_token: 'xoxb-new', + team: { id: 'T_new', name: 'New Team' }, + bot_user_id: 'B_1', + app_id: 'A_1', + scope: 'chat:write', + authed_user: { id: 'U_installer' }, + }), + }); + // First call: UpdateSecret → RNF; then CreateSecret succeeds + smSend.mockImplementationOnce(() => Promise.resolve({ SecretString: 'client-id-123' })); // GetSecretValue for CLIENT_ID + smSend.mockImplementationOnce(() => Promise.resolve({ SecretString: 'client-secret-xyz' })); // GetSecretValue for CLIENT_SECRET + smSend.mockImplementationOnce(() => Promise.reject(new MockResourceNotFoundException())); // UpdateSecret + smSend.mockImplementationOnce(() => Promise.resolve({})); // CreateSecret + ddbSend.mockResolvedValueOnce({}); // Put installation + + const result = await handler(makeEvent('goodcode')); + expect(result.statusCode).toBe(200); + expect(result.body).toContain('New Team'); + // Installation record was written + const putCall = ddbSend.mock.calls.find(([cmd]) => cmd._type === 'Put'); + expect(putCall).toBeTruthy(); + expect(putCall![0].input.Item.team_id).toBe('T_new'); + expect(putCall![0].input.Item.status).toBe('active'); + }); + + test('restores deleted secret before updating (re-install after uninstall)', async () => { + fetchMock.mockResolvedValueOnce({ + ok: true, + json: () => Promise.resolve({ + ok: true, + access_token: 'xoxb-reinstall', + team: { id: 'T_re', name: 'Re Team' }, + }), + }); + smSend.mockImplementationOnce(() => Promise.resolve({ SecretString: 'client-id-123' })); // CLIENT_ID + smSend.mockImplementationOnce(() => Promise.resolve({ SecretString: 'client-secret-xyz' })); // CLIENT_SECRET + // UpdateSecret throws InvalidRequestException with "marked for deletion" + smSend.mockImplementationOnce(() => Promise.reject(new MockInvalidRequestException('Secret is marked for deletion'))); + smSend.mockImplementationOnce(() => Promise.resolve({})); // RestoreSecret + smSend.mockImplementationOnce(() => Promise.resolve({})); // UpdateSecret (second try) + ddbSend.mockResolvedValueOnce({}); + + const result = await handler(makeEvent('code')); + expect(result.statusCode).toBe(200); + const restoreCalled = smSend.mock.calls.some(([cmd]) => cmd._type === 'RestoreSecret'); + expect(restoreCalled).toBe(true); + }); +}); From aa7df09516122de9ddca6db5d5383ca91ee05841 Mon Sep 17 00:00:00 2001 From: Sphia Sadek Date: Tue, 5 May 2026 10:12:22 -0400 Subject: [PATCH 05/23] fix(slack): soften checkChannelAccess + drop stale status claim in docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Addresses blind-review feedback S2 + S3. **S2 — checkChannelAccess transient failures now fail open.** The prior "fail closed on any unknown Slack error" was too strict: a 30-second Slack ratelimited or internal_error during conversations.info would block every Slack task submission for that window, even though the notification path downstream could have recovered. Now: - Hard failures (channel_not_found, not_in_channel, missing_scope) still fail closed — these definitively mean the bot cannot post there, and silently creating an undeliverable task is the worse UX. - Transient or unknown errors (ratelimited, internal_error, fatal_error, network blips) fail open. slack-notify surfaces any real delivery failure when the event plays through. Regression test added: `mention submit fails open on transient Slack errors` asserts createTaskCore IS called when conversations.info returns `ratelimited`. **S3 — USER_GUIDE Slack bullet drops "check status".** handleStatus was deleted in this branch (review item 1) because Sam's locked plan in PR #52 delivers `bgagent status` via the CLI rather than a Slack slash subcommand. The user-facing docs still claimed Slack could "check status" via `/bgagent`. Rewritten to describe the shipped behavior: @mention-based submission plus threaded progress notifications with reaction-based status. Starlight content regenerated via `node docs/scripts/sync-starlight.mjs`. --- cdk/src/handlers/slack-command-processor.ts | 39 ++++++++++++------- .../handlers/slack-command-processor.test.ts | 16 ++++++++ docs/guides/USER_GUIDE.md | 2 +- docs/src/content/docs/using/Overview.md | 2 +- 4 files changed, 42 insertions(+), 17 deletions(-) diff --git a/cdk/src/handlers/slack-command-processor.ts b/cdk/src/handlers/slack-command-processor.ts index a9733f7..92bb5bc 100644 --- a/cdk/src/handlers/slack-command-processor.ts +++ b/cdk/src/handlers/slack-command-processor.ts @@ -288,6 +288,13 @@ async function getBotToken(teamId: string): Promise { return getSlackSecret(`${SLACK_SECRET_PREFIX}${teamId}`); } +/** Slack error codes that definitively mean the bot cannot post in this channel. */ +const CHANNEL_ACCESS_HARD_FAILURES = new Set([ + 'channel_not_found', // private channel the bot hasn't been invited to + 'not_in_channel', // public channel the bot isn't in (some workspaces require join) + 'missing_scope', // bot lacks the scope it needs — admin must reinstall +]); + async function checkChannelAccess(teamId: string, channelId: string): Promise<{ ok: boolean; error?: string }> { // DM channels always work — notifications fall back to user ID. if (channelId.startsWith('D')) return { ok: true }; @@ -308,18 +315,20 @@ async function checkChannelAccess(teamId: string, channelId: string): Promise<{ const result = await response.json() as { ok: boolean; channel?: { is_private: boolean; is_member: boolean }; error?: string }; if (!result.ok) { - // channel_not_found means the bot can't see it — private channel, not invited. - if (result.error === 'channel_not_found') { + // Hard failures: the bot definitively cannot post here. Fail closed so the + // task isn't created silently into a dead-letter channel. + if (result.error && CHANNEL_ACCESS_HARD_FAILURES.has(result.error)) { return { ok: false, error: ':lock: This is a private channel and the bot is not a member. Invite the bot first with `/invite @bgagent`, or submit from a public channel or DM.' }; } - // Unknown Slack error — surface it rather than silently allowing. - // The task would otherwise be created but the user would never see a - // notification land, with no hint of what went wrong. - logger.warn('Channel access check returned unknown error', { error: result.error, channel_id: channelId }); - return { - ok: false, - error: `:warning: Couldn't verify the bot can post in this channel (Slack error: \`${result.error ?? 'unknown'}\`). Try again or submit from a public channel or DM.`, - }; + // Anything else (ratelimited, internal_error, fatal_error, network blip) is + // likely transient — fail open and let slack-notify surface any real delivery + // failure downstream. Blocking task submission on a 30-second Slack blip is + // a worse UX than creating a task that notifies late. + logger.warn('Channel access check: transient/unknown Slack error, failing open', { + error: result.error, + channel_id: channelId, + }); + return { ok: true }; } if (result.channel?.is_private && !result.channel?.is_member) { @@ -328,11 +337,11 @@ async function checkChannelAccess(teamId: string, channelId: string): Promise<{ return { ok: true }; } catch (err) { - logger.warn('Channel access check failed', { error: err instanceof Error ? err.message : String(err) }); - return { - ok: false, - error: ':warning: Couldn\'t reach Slack to verify channel access. Please try again in a moment.', - }; + // Network-level failure — treat the same as a transient Slack error. + logger.warn('Channel access check network failure, failing open', { + error: err instanceof Error ? err.message : String(err), + }); + return { ok: true }; } } diff --git a/cdk/test/handlers/slack-command-processor.test.ts b/cdk/test/handlers/slack-command-processor.test.ts index 62edc29..5996168 100644 --- a/cdk/test/handlers/slack-command-processor.test.ts +++ b/cdk/test/handlers/slack-command-processor.test.ts @@ -175,6 +175,22 @@ describe('slack-command-processor handler', () => { expect(createTaskCoreMock).not.toHaveBeenCalled(); }); + test('mention submit fails open on transient Slack errors (ratelimited, internal_error)', async () => { + ddbSend.mockResolvedValueOnce({ Item: { status: 'active', platform_user_id: 'cognito-1' } }); + ddbSend.mockResolvedValue({ Item: { status: 'active' } }); + // conversations.info returns a non-hard failure — task creation should proceed. + fetchMock.mockResolvedValueOnce({ + ok: true, + json: () => Promise.resolve({ ok: false, error: 'ratelimited' }), + }); + createTaskCoreMock.mockResolvedValueOnce({ + statusCode: 201, + body: JSON.stringify({ data: { task_id: 'T1', repo: 'org/repo', status: 'SUBMITTED' } }), + }); + await handler(mention({ text: 'submit org/repo fix' })); + expect(createTaskCoreMock).toHaveBeenCalledTimes(1); + }); + test('link subcommand persists pending mapping with a link code', async () => { ddbSend.mockResolvedValueOnce({}); // Put pending mapping await handler(slashCommand({ text: 'link' })); diff --git a/docs/guides/USER_GUIDE.md b/docs/guides/USER_GUIDE.md index 054a68a..588778b 100644 --- a/docs/guides/USER_GUIDE.md +++ b/docs/guides/USER_GUIDE.md @@ -9,7 +9,7 @@ There are four ways to interact with the platform. You can use them independentl 1. **CLI** (recommended) - The `bgagent` CLI authenticates via Cognito and calls the Task API. Best for individual developers submitting tasks from the terminal. Handles login, token caching, and output formatting. 2. **REST API** (direct) - Call the Task API endpoints directly with a JWT token. Best for building custom integrations, dashboards, or internal tools on top of the platform. Full validation, audit logging, and idempotency support. 3. **Webhook** - External systems (CI pipelines, GitHub Actions) can create tasks via HMAC-authenticated HTTP requests. Best for automated workflows where tasks should be triggered by events (e.g., a new issue is labeled, a PR needs review). No Cognito credentials needed; uses a shared secret per integration. -4. **Slack** - Submit tasks, check status, and receive notifications directly in Slack via the `/bgagent` slash command. See the [Slack setup guide](./SLACK_SETUP_GUIDE.md). +4. **Slack** - Submit tasks by @mentioning the bot and receive threaded progress notifications with reaction-based status. See the [Slack setup guide](./SLACK_SETUP_GUIDE.md). For example, a team might use the **CLI** for ad-hoc tasks, **webhooks** to auto-trigger `pr_review` on every new PR via GitHub Actions, **Slack** for quick team-wide requests, and the **REST API** to build a dashboard that tracks task status across repositories. diff --git a/docs/src/content/docs/using/Overview.md b/docs/src/content/docs/using/Overview.md index c6a2264..56e90a7 100644 --- a/docs/src/content/docs/using/Overview.md +++ b/docs/src/content/docs/using/Overview.md @@ -9,6 +9,6 @@ There are four ways to interact with the platform. You can use them independentl 1. **CLI** (recommended) - The `bgagent` CLI authenticates via Cognito and calls the Task API. Best for individual developers submitting tasks from the terminal. Handles login, token caching, and output formatting. 2. **REST API** (direct) - Call the Task API endpoints directly with a JWT token. Best for building custom integrations, dashboards, or internal tools on top of the platform. Full validation, audit logging, and idempotency support. 3. **Webhook** - External systems (CI pipelines, GitHub Actions) can create tasks via HMAC-authenticated HTTP requests. Best for automated workflows where tasks should be triggered by events (e.g., a new issue is labeled, a PR needs review). No Cognito credentials needed; uses a shared secret per integration. -4. **Slack** - Submit tasks, check status, and receive notifications directly in Slack via the `/bgagent` slash command. See the [Slack setup guide](/using/slack-setup-guide). +4. **Slack** - Submit tasks by @mentioning the bot and receive threaded progress notifications with reaction-based status. See the [Slack setup guide](/using/slack-setup-guide). For example, a team might use the **CLI** for ad-hoc tasks, **webhooks** to auto-trigger `pr_review` on every new PR via GitHub Actions, **Slack** for quick team-wide requests, and the **REST API** to build a dashboard that tracks task status across repositories. \ No newline at end of file From a72b28cabda244d303c4d0da346eb40bec792b6c Mon Sep 17 00:00:00 2001 From: Sphia Sadek Date: Tue, 5 May 2026 14:37:28 -0400 Subject: [PATCH 06/23] chore(types): extend ChannelSource to include 'linear' Trivial enabler for the Linear integration branch. No functional change: all existing code already uses the broad ChannelSource union; adding 'linear' makes the Linear-origin task records type-check once the inbound adapter starts writing them. --- cdk/src/handlers/shared/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdk/src/handlers/shared/types.ts b/cdk/src/handlers/shared/types.ts index 43b40b2..749f2e7 100644 --- a/cdk/src/handlers/shared/types.ts +++ b/cdk/src/handlers/shared/types.ts @@ -24,7 +24,7 @@ import type { TaskStatusType } from '../../constructs/task-status'; export type TaskType = 'new_task' | 'pr_iteration' | 'pr_review'; /** Where a task was submitted from. Shared across inbound adapters. */ -export type ChannelSource = 'api' | 'webhook' | 'slack'; +export type ChannelSource = 'api' | 'webhook' | 'slack' | 'linear'; /** Task types that operate on an existing pull request. */ export function isPrTaskType(taskType: TaskType): boolean { From 3a3c316014a65080b9a5bd08a8bef3ba8c9381da Mon Sep 17 00:00:00 2001 From: Sphia Sadek Date: Tue, 5 May 2026 15:04:12 -0400 Subject: [PATCH 07/23] =?UTF-8?q?feat(linear):=20Phase=201=20=E2=80=94=20C?= =?UTF-8?q?DK=20backend=20handlers=20+=20mapping=20tables?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - shared/linear-verify.ts: HMAC-SHA256 hex verify over raw body, 60s webhookTimestamp replay window, secret caching + rotation retry. - LinearProjectMappingTable: linear_project_id → repo + label_filter. - LinearUserMappingTable: {workspace}#{user} confirmed / pending#{code} with TTL and PlatformUserIndex GSI. - linear-webhook.ts: verify + dedup (60s TTL on (issue_id, action)) + async-invoke processor; replies fast inside Linear's 5s budget. - linear-webhook-processor.ts: Issue label-add detection, project→repo + actor→platform user resolution, createTaskCore with channelSource 'linear' + linear_* channel metadata. - linear-link.ts: mirror of slack-link.ts. --- .../linear-project-mapping-table.ts | 81 ++++++ .../constructs/linear-user-mapping-table.ts | 92 +++++++ cdk/src/handlers/linear-link.ts | 110 ++++++++ cdk/src/handlers/linear-webhook-processor.ts | 257 ++++++++++++++++++ cdk/src/handlers/linear-webhook.ts | 170 ++++++++++++ cdk/src/handlers/shared/linear-verify.ts | 152 +++++++++++ 6 files changed, 862 insertions(+) create mode 100644 cdk/src/constructs/linear-project-mapping-table.ts create mode 100644 cdk/src/constructs/linear-user-mapping-table.ts create mode 100644 cdk/src/handlers/linear-link.ts create mode 100644 cdk/src/handlers/linear-webhook-processor.ts create mode 100644 cdk/src/handlers/linear-webhook.ts create mode 100644 cdk/src/handlers/shared/linear-verify.ts diff --git a/cdk/src/constructs/linear-project-mapping-table.ts b/cdk/src/constructs/linear-project-mapping-table.ts new file mode 100644 index 0000000..4a0d8b0 --- /dev/null +++ b/cdk/src/constructs/linear-project-mapping-table.ts @@ -0,0 +1,81 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { RemovalPolicy } from 'aws-cdk-lib'; +import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; +import { Construct } from 'constructs'; + +/** + * Properties for LinearProjectMappingTable construct. + */ +export interface LinearProjectMappingTableProps { + /** + * Optional table name override. + * @default - auto-generated by CloudFormation + */ + readonly tableName?: string; + + /** + * Removal policy for the table. + * @default RemovalPolicy.DESTROY + */ + readonly removalPolicy?: RemovalPolicy; + + /** + * Whether to enable point-in-time recovery. + * @default true + */ + readonly pointInTimeRecovery?: boolean; +} + +/** + * DynamoDB table mapping Linear projects to GitHub repositories. + * + * Schema: linear_project_id (PK). + * + * Fields: + * - repo — `owner/repo` + * - team_id — Linear team UUID (the project's team) + * - label_filter — Linear issue label that triggers a task (default `bgagent`) + * - status — 'active' | 'removed' + * - onboarded_at, updated_at — ISO timestamps + */ +export class LinearProjectMappingTable extends Construct { + /** + * The underlying DynamoDB table. + */ + public readonly table: dynamodb.Table; + + constructor(scope: Construct, id: string, props: LinearProjectMappingTableProps = {}) { + super(scope, id); + + this.table = new dynamodb.Table(this, 'Table', { + tableName: props.tableName, + partitionKey: { + name: 'linear_project_id', + type: dynamodb.AttributeType.STRING, + }, + billingMode: dynamodb.BillingMode.PAY_PER_REQUEST, + pointInTimeRecoverySpecification: { + pointInTimeRecoveryEnabled: props.pointInTimeRecovery ?? true, + }, + removalPolicy: props.removalPolicy ?? RemovalPolicy.DESTROY, + }); + } +} diff --git a/cdk/src/constructs/linear-user-mapping-table.ts b/cdk/src/constructs/linear-user-mapping-table.ts new file mode 100644 index 0000000..b4ff358 --- /dev/null +++ b/cdk/src/constructs/linear-user-mapping-table.ts @@ -0,0 +1,92 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { RemovalPolicy } from 'aws-cdk-lib'; +import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; +import { Construct } from 'constructs'; + +/** + * Properties for LinearUserMappingTable construct. + */ +export interface LinearUserMappingTableProps { + /** + * Optional table name override. + * @default - auto-generated by CloudFormation + */ + readonly tableName?: string; + + /** + * Removal policy for the table. + * @default RemovalPolicy.DESTROY + */ + readonly removalPolicy?: RemovalPolicy; + + /** + * Whether to enable point-in-time recovery. + * @default true + */ + readonly pointInTimeRecovery?: boolean; +} + +/** + * DynamoDB table for mapping Linear user identities to platform user IDs. + * + * Schema: linear_identity (PK) — composite key `{workspace_id}#{user_id}` for confirmed mappings, + * `pending#{code}` for in-flight link codes (with TTL). + * + * GSIs: + * - PlatformUserIndex (PK: platform_user_id, SK: linked_at) — list linked Linear accounts for a user + */ +export class LinearUserMappingTable extends Construct { + /** + * GSI name for querying mappings by platform user. + * PK: platform_user_id, SK: linked_at. + */ + public static readonly PLATFORM_USER_INDEX = 'PlatformUserIndex'; + + /** + * The underlying DynamoDB table. + */ + public readonly table: dynamodb.Table; + + constructor(scope: Construct, id: string, props: LinearUserMappingTableProps = {}) { + super(scope, id); + + this.table = new dynamodb.Table(this, 'Table', { + tableName: props.tableName, + partitionKey: { + name: 'linear_identity', + type: dynamodb.AttributeType.STRING, + }, + billingMode: dynamodb.BillingMode.PAY_PER_REQUEST, + timeToLiveAttribute: 'ttl', + pointInTimeRecoverySpecification: { + pointInTimeRecoveryEnabled: props.pointInTimeRecovery ?? true, + }, + removalPolicy: props.removalPolicy ?? RemovalPolicy.DESTROY, + }); + + this.table.addGlobalSecondaryIndex({ + indexName: LinearUserMappingTable.PLATFORM_USER_INDEX, + partitionKey: { name: 'platform_user_id', type: dynamodb.AttributeType.STRING }, + sortKey: { name: 'linked_at', type: dynamodb.AttributeType.STRING }, + projectionType: dynamodb.ProjectionType.ALL, + }); + } +} diff --git a/cdk/src/handlers/linear-link.ts b/cdk/src/handlers/linear-link.ts new file mode 100644 index 0000000..8dde765 --- /dev/null +++ b/cdk/src/handlers/linear-link.ts @@ -0,0 +1,110 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; +import { DynamoDBDocumentClient, GetCommand, PutCommand, DeleteCommand } from '@aws-sdk/lib-dynamodb'; +import type { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'; +import { ulid } from 'ulid'; +import { extractUserId } from './shared/gateway'; +import { logger } from './shared/logger'; +import { ErrorCode, errorResponse, successResponse } from './shared/response'; +import { parseBody } from './shared/validation'; + +const ddb = DynamoDBDocumentClient.from(new DynamoDBClient({})); + +const USER_MAPPING_TABLE = process.env.LINEAR_USER_MAPPING_TABLE_NAME!; + +interface LinkRequest { + readonly code: string; +} + +/** + * POST /v1/linear/link — Complete Linear account linking. + * + * Called from the CLI (`bgagent linear link `) with a Cognito JWT. + * Looks up the pending link record, maps the Linear identity to the + * authenticated platform user, and cleans up the pending record. + */ +export async function handler(event: APIGatewayProxyEvent): Promise { + const requestId = ulid(); + + try { + const userId = extractUserId(event); + if (!userId) { + return errorResponse(401, ErrorCode.UNAUTHORIZED, 'Authentication required.', requestId); + } + + const body = parseBody(event.body ?? null); + if (!body?.code) { + return errorResponse(400, ErrorCode.VALIDATION_ERROR, 'Request body must include a "code" field.', requestId); + } + + const code = body.code.trim().toUpperCase(); + + const pending = await ddb.send(new GetCommand({ + TableName: USER_MAPPING_TABLE, + Key: { linear_identity: `pending#${code}` }, + })); + + if (!pending.Item || pending.Item.status !== 'pending') { + return errorResponse(404, ErrorCode.VALIDATION_ERROR, 'Invalid or expired link code.', requestId); + } + + const workspaceId = pending.Item.linear_workspace_id as string; + const linearUserId = pending.Item.linear_user_id as string; + const now = new Date().toISOString(); + + await ddb.send(new PutCommand({ + TableName: USER_MAPPING_TABLE, + Item: { + linear_identity: `${workspaceId}#${linearUserId}`, + platform_user_id: userId, + linear_workspace_id: workspaceId, + linear_user_id: linearUserId, + linked_at: now, + status: 'active', + link_method: 'cli', + }, + })); + + await ddb.send(new DeleteCommand({ + TableName: USER_MAPPING_TABLE, + Key: { linear_identity: `pending#${code}` }, + })); + + logger.info('Linear account linked', { + platform_user_id: userId, + linear_workspace_id: workspaceId, + linear_user_id: linearUserId, + }); + + return successResponse(200, { + message: 'Linear account linked successfully.', + linear_workspace_id: workspaceId, + linear_user_id: linearUserId, + linked_at: now, + }, requestId); + } catch (err) { + logger.error('Linear link handler failed', { + error: err instanceof Error ? err.message : String(err), + request_id: requestId, + }); + return errorResponse(500, ErrorCode.INTERNAL_ERROR, 'Internal server error.', requestId); + } +} diff --git a/cdk/src/handlers/linear-webhook-processor.ts b/cdk/src/handlers/linear-webhook-processor.ts new file mode 100644 index 0000000..d0e6483 --- /dev/null +++ b/cdk/src/handlers/linear-webhook-processor.ts @@ -0,0 +1,257 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as crypto from 'crypto'; +import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; +import { DynamoDBDocumentClient, GetCommand } from '@aws-sdk/lib-dynamodb'; +import { createTaskCore } from './shared/create-task-core'; +import { logger } from './shared/logger'; + +const ddb = DynamoDBDocumentClient.from(new DynamoDBClient({})); + +const PROJECT_MAPPING_TABLE = process.env.LINEAR_PROJECT_MAPPING_TABLE_NAME!; +const USER_MAPPING_TABLE = process.env.LINEAR_USER_MAPPING_TABLE_NAME!; +const DEFAULT_LABEL_FILTER = 'bgagent'; + +/** Shape of Linear `Issue` webhook payloads we care about. Undocumented fields are tolerated. */ +interface LinearIssueEvent { + readonly action: 'create' | 'update' | 'remove' | string; + readonly type: 'Issue'; + readonly data: { + readonly id: string; + readonly identifier?: string; + readonly title?: string; + readonly description?: string; + readonly projectId?: string; + readonly teamId?: string; + readonly labels?: Array<{ id: string; name: string }>; + readonly labelIds?: string[]; + readonly creatorId?: string; + readonly [key: string]: unknown; + }; + readonly actor?: { + readonly id?: string; + readonly name?: string; + }; + readonly updatedFrom?: { + readonly labelIds?: string[]; + readonly [key: string]: unknown; + }; + readonly organizationId?: string; + readonly webhookTimestamp?: number; + readonly webhookId?: string; +} + +interface ProcessorEvent { + readonly raw_body: string; +} + +/** + * Async processor for verified Linear webhooks. + * + * Responsibilities: + * - Parse the `Issue` payload. + * - Detect whether the configured trigger label was just added (create) or present on update. + * - Resolve the Linear project → GitHub repo mapping. + * - Resolve the Linear actor → platform user mapping. + * - Call `createTaskCore` with `channelSource: 'linear'` and metadata the agent uses + * to address the originating issue via the Linear MCP. + */ +export async function handler(event: ProcessorEvent): Promise { + if (!event.raw_body) { + logger.error('Linear webhook processor invoked without raw_body'); + return; + } + + let payload: LinearIssueEvent; + try { + payload = JSON.parse(event.raw_body) as LinearIssueEvent; + } catch (err) { + logger.error('Linear webhook processor could not parse raw_body', { + error: err instanceof Error ? err.message : String(err), + }); + return; + } + + if (payload.type !== 'Issue') { + logger.info('Linear processor skipping non-Issue payload', { type: payload.type }); + return; + } + + const issue = payload.data; + const projectId = issue.projectId; + if (!projectId) { + logger.info('Linear Issue has no projectId — skipping (cannot route to a repo)', { + issue_id: issue.id, + }); + return; + } + + // Look up project → repo mapping. + const mapping = await ddb.send(new GetCommand({ + TableName: PROJECT_MAPPING_TABLE, + Key: { linear_project_id: projectId }, + })); + if (!mapping.Item || mapping.Item.status !== 'active') { + logger.info('Linear project is not onboarded or is removed — skipping', { + linear_project_id: projectId, + issue_id: issue.id, + }); + return; + } + const repo = mapping.Item.repo as string; + const labelFilter = (mapping.Item.label_filter as string | undefined) ?? DEFAULT_LABEL_FILTER; + + // Only trigger when the configured label is present AND this event is a transition + // that meaningfully added/asserts the label — `create` with the label on it, or + // `update` that newly added it. + if (!shouldTrigger(payload, labelFilter)) { + logger.info('Linear webhook does not match trigger criteria', { + action: payload.action, + issue_id: issue.id, + label_filter: labelFilter, + }); + return; + } + + // Resolve the actor → platform user. Fall back to creator if the actor is missing + // (e.g. automation that set the label). If neither resolves, we cannot attribute + // the task to a platform user and must drop the event. + const workspaceId = payload.organizationId ?? ''; + const actorId = payload.actor?.id ?? issue.creatorId; + if (!workspaceId || !actorId) { + logger.warn('Linear webhook missing organization or actor — cannot attribute task', { + issue_id: issue.id, + organization_id: workspaceId, + actor_id: actorId, + }); + return; + } + + const platformUserId = await lookupPlatformUser(workspaceId, actorId); + if (!platformUserId) { + logger.warn('Linear actor has no linked platform user — skipping task creation', { + linear_workspace_id: workspaceId, + linear_user_id: actorId, + issue_id: issue.id, + }); + return; + } + + const taskDescription = buildTaskDescription(issue); + + const channelMetadata: Record = { + linear_issue_id: issue.id, + linear_workspace_id: workspaceId, + linear_project_id: projectId, + }; + if (issue.identifier) { + channelMetadata.linear_issue_identifier = issue.identifier; + } + if (issue.teamId) { + channelMetadata.linear_team_id = issue.teamId; + } + + const requestId = crypto.randomUUID(); + const result = await createTaskCore( + { + repo, + task_description: taskDescription, + }, + { + userId: platformUserId, + channelSource: 'linear', + channelMetadata, + }, + requestId, + ); + + if (result.statusCode !== 201) { + logger.warn('Linear-triggered task creation returned non-201', { + status: result.statusCode, + body: result.body, + issue_id: issue.id, + }); + return; + } + + logger.info('Linear-triggered task created', { + issue_id: issue.id, + linear_issue_identifier: issue.identifier, + repo, + request_id: requestId, + }); +} + +/** + * Decide whether a Linear Issue event should trigger a task. + * + * - `create` with the label already on the issue → trigger + * - `update` where labelIds transitions to include the label (previously didn't) → trigger + * - Everything else → no-op + */ +function shouldTrigger(payload: LinearIssueEvent, labelFilter: string): boolean { + const current = payload.data.labels ?? []; + const hasLabel = current.some((l) => l?.name?.toLowerCase() === labelFilter.toLowerCase()); + + if (payload.action === 'create') { + return hasLabel; + } + + if (payload.action === 'update') { + if (!hasLabel) return false; + // If the event doesn't include a label change, skip — something else on the + // issue was edited, and we shouldn't re-submit on every title/description edit. + const updatedFrom = payload.updatedFrom ?? {}; + const labelIdsChanged = Object.prototype.hasOwnProperty.call(updatedFrom, 'labelIds'); + if (!labelIdsChanged) return false; + // The label must have just been added, not removed. If it was present before, + // another Linear user probably toggled a different label — avoid re-triggering. + const previousIds = new Set((updatedFrom.labelIds as string[] | undefined) ?? []); + const currentLabelId = current.find((l) => l?.name?.toLowerCase() === labelFilter.toLowerCase())?.id; + if (!currentLabelId) return false; + return !previousIds.has(currentLabelId); + } + + return false; +} + +function buildTaskDescription(issue: LinearIssueEvent['data']): string { + const parts: string[] = []; + if (issue.identifier && issue.title) { + parts.push(`${issue.identifier}: ${issue.title}`); + } else if (issue.title) { + parts.push(issue.title); + } + if (issue.description && issue.description.trim()) { + parts.push(''); + parts.push(issue.description.trim()); + } + return parts.join('\n') || 'Linear issue'; +} + +async function lookupPlatformUser(workspaceId: string, userId: string): Promise { + const key = `${workspaceId}#${userId}`; + const result = await ddb.send(new GetCommand({ + TableName: USER_MAPPING_TABLE, + Key: { linear_identity: key }, + })); + if (!result.Item || result.Item.status === 'pending') return null; + return (result.Item.platform_user_id as string) ?? null; +} diff --git a/cdk/src/handlers/linear-webhook.ts b/cdk/src/handlers/linear-webhook.ts new file mode 100644 index 0000000..aa0c245 --- /dev/null +++ b/cdk/src/handlers/linear-webhook.ts @@ -0,0 +1,170 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { ConditionalCheckFailedException, DynamoDBClient } from '@aws-sdk/client-dynamodb'; +import { InvokeCommand, LambdaClient } from '@aws-sdk/client-lambda'; +import { DynamoDBDocumentClient, PutCommand } from '@aws-sdk/lib-dynamodb'; +import type { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'; +import { logger } from './shared/logger'; +import { isWebhookTimestampFresh, verifyLinearRequest } from './shared/linear-verify'; + +const ddb = DynamoDBDocumentClient.from(new DynamoDBClient({})); +const lambdaClient = new LambdaClient({}); + +const WEBHOOK_SECRET_ARN = process.env.LINEAR_WEBHOOK_SECRET_ARN!; +const DEDUP_TABLE_NAME = process.env.LINEAR_WEBHOOK_DEDUP_TABLE_NAME!; +const PROCESSOR_FUNCTION_NAME = process.env.LINEAR_WEBHOOK_PROCESSOR_FUNCTION_NAME!; + +/** Dedup window for Linear webhook retries (seconds). Linear's first retry is +1m. */ +const DEDUP_TTL_SECONDS = 60; + +/** + * Shape of the top-level Linear webhook payload we care about for dedup + routing. + * Full payload is forwarded to the processor without re-serialization risk — + * the processor parses its own copy from the raw body. + */ +interface LinearWebhookEnvelope { + readonly action?: string; + readonly type?: string; + readonly webhookTimestamp?: number; + readonly webhookId?: string; + readonly organizationId?: string; + readonly data?: { + readonly id?: string; + readonly [key: string]: unknown; + }; +} + +/** + * POST /v1/linear/webhook — Linear webhook receiver. + * + * Verifies the `Linear-Signature` HMAC over the raw body, rejects stale + * `webhookTimestamp` values (replay protection), dedups on + * `(issue_id, action)` with a 60s TTL, and async-invokes the processor + * Lambda so we can ack within Linear's 5s timeout. + */ +export async function handler(event: APIGatewayProxyEvent): Promise { + try { + if (!event.body) { + return jsonResponse(400, { error: 'Request body is required' }); + } + + const signature = event.headers['Linear-Signature'] ?? event.headers['linear-signature'] ?? ''; + if (!signature) { + logger.warn('Linear webhook missing Linear-Signature header'); + return jsonResponse(401, { error: 'Missing signature' }); + } + + if (!await verifyLinearRequest(WEBHOOK_SECRET_ARN, signature, event.body)) { + logger.warn('Invalid Linear webhook signature'); + return jsonResponse(401, { error: 'Invalid signature' }); + } + + let payload: LinearWebhookEnvelope; + try { + payload = JSON.parse(event.body) as LinearWebhookEnvelope; + } catch (err) { + logger.warn('Linear webhook body is not valid JSON', { + error: err instanceof Error ? err.message : String(err), + }); + return jsonResponse(400, { error: 'Invalid JSON' }); + } + + if (!isWebhookTimestampFresh(payload.webhookTimestamp)) { + logger.warn('Linear webhook timestamp outside replay window', { + webhook_timestamp: payload.webhookTimestamp, + webhook_id: payload.webhookId, + }); + return jsonResponse(401, { error: 'Stale webhook timestamp' }); + } + + // Only Issue events flow through to task creation. Every other type is + // acknowledged silently so Linear stops retrying. + if (payload.type !== 'Issue') { + logger.info('Ignoring non-Issue Linear webhook', { type: payload.type, action: payload.action }); + return jsonResponse(200, { ok: true }); + } + + const issueId = payload.data?.id; + const action = payload.action ?? 'unknown'; + if (!issueId) { + logger.warn('Linear Issue webhook missing data.id', { action }); + return jsonResponse(400, { error: 'Missing issue id' }); + } + + // Dedup via conditional PutItem. If the key already exists we silently + // acknowledge the retry without re-dispatching the processor. + const dedupKey = `${issueId}#${action}`; + const nowSeconds = Math.floor(Date.now() / 1000); + try { + await ddb.send(new PutCommand({ + TableName: DEDUP_TABLE_NAME, + Item: { + dedup_key: dedupKey, + created_at: new Date().toISOString(), + ttl: nowSeconds + DEDUP_TTL_SECONDS, + }, + ConditionExpression: 'attribute_not_exists(dedup_key)', + })); + } catch (err) { + if (err instanceof ConditionalCheckFailedException) { + logger.info('Linear webhook dedup hit — skipping reprocess', { + dedup_key: dedupKey, + webhook_id: payload.webhookId, + }); + return jsonResponse(200, { ok: true, deduped: true }); + } + throw err; + } + + // Async-invoke the processor with the raw body so it can re-parse safely. + try { + await lambdaClient.send(new InvokeCommand({ + FunctionName: PROCESSOR_FUNCTION_NAME, + InvocationType: 'Event', + Payload: new TextEncoder().encode(JSON.stringify({ raw_body: event.body })), + })); + } catch (invokeErr) { + logger.error('Failed to invoke Linear webhook processor', { + error: invokeErr instanceof Error ? invokeErr.message : String(invokeErr), + issue_id: issueId, + action, + }); + // Return 500 so Linear retries — the dedup row will block a double-dispatch + // within the 60s window; after that the processor was already invoked or + // genuinely failed and a retry is correct. + return jsonResponse(500, { error: 'Dispatch failed' }); + } + + return jsonResponse(200, { ok: true }); + } catch (err) { + logger.error('Linear webhook handler failed', { + error: err instanceof Error ? err.message : String(err), + }); + return jsonResponse(500, { error: 'Internal server error' }); + } +} + +function jsonResponse(statusCode: number, body: Record): APIGatewayProxyResult { + return { + statusCode, + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(body), + }; +} diff --git a/cdk/src/handlers/shared/linear-verify.ts b/cdk/src/handlers/shared/linear-verify.ts new file mode 100644 index 0000000..5199fcf --- /dev/null +++ b/cdk/src/handlers/shared/linear-verify.ts @@ -0,0 +1,152 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as crypto from 'crypto'; +import { GetSecretValueCommand, SecretsManagerClient } from '@aws-sdk/client-secrets-manager'; +import { logger } from './logger'; + +const sm = new SecretsManagerClient({}); + +/** Prefix for Linear-related secrets in Secrets Manager. */ +export const LINEAR_SECRET_PREFIX = 'bgagent/linear/'; + +// In-memory secret cache with 5-minute TTL (same pattern as slack-verify.ts). +const secretCache = new Map(); +const CACHE_TTL_MS = 5 * 60 * 1000; + +/** Maximum age of a Linear webhookTimestamp (ms) before it is rejected (replay protection). */ +export const MAX_WEBHOOK_TIMESTAMP_AGE_MS = 60 * 1000; + +/** + * Fetch a secret from Secrets Manager with in-memory caching. + * @param secretId - the full Secrets Manager secret ID or ARN. + * @param forceRefresh - bypass the cache and re-fetch from Secrets Manager. + * @returns the secret string, or null if not found. + */ +export async function getLinearSecret(secretId: string, forceRefresh = false): Promise { + const now = Date.now(); + if (!forceRefresh) { + const cached = secretCache.get(secretId); + if (cached && cached.expiresAt > now) { + return cached.secret; + } + } + + try { + const result = await sm.send(new GetSecretValueCommand({ SecretId: secretId })); + if (!result.SecretString) { + secretCache.delete(secretId); + return null; + } + secretCache.set(secretId, { secret: result.SecretString, expiresAt: now + CACHE_TTL_MS }); + return result.SecretString; + } catch (err) { + const errorName = (err as Error)?.name; + if (errorName === 'ResourceNotFoundException') { + logger.error('Linear secret not found in Secrets Manager', { secret_id: secretId }); + secretCache.delete(secretId); + return null; + } + logger.error('Failed to fetch Linear secret from Secrets Manager', { + secret_id: secretId, + error: err instanceof Error ? err.message : String(err), + }); + throw err; + } +} + +/** + * Explicitly drop a cached secret. Called when rotation is suspected — + * e.g. signature verification fails with an otherwise valid-looking request. + * @param secretId - the Secrets Manager secret ID or ARN to evict. + */ +export function invalidateLinearSecretCache(secretId: string): void { + secretCache.delete(secretId); +} + +/** + * Verify a Linear webhook signature. + * + * Linear signs each webhook with HMAC-SHA256 over the raw request body, hex-encoded, + * delivered in the `Linear-Signature` header. Replay protection uses the + * `webhookTimestamp` field (UNIX milliseconds) inside the JSON payload, not a header. + * + * @param webhookSecret - the per-webhook signing secret. + * @param signature - the `Linear-Signature` header value. + * @param body - the raw request body string. + * @returns true if the signature matches. + */ +export function verifyLinearSignature( + webhookSecret: string, + signature: string, + body: string, +): boolean { + const expected = crypto.createHmac('sha256', webhookSecret).update(body).digest('hex'); + try { + return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature)); + } catch (err) { + logger.warn('Linear signature comparison failed', { + error: err instanceof Error ? err.message : String(err), + expected_length: expected.length, + provided_length: signature.length, + }); + return false; + } +} + +/** + * Check that a Linear `webhookTimestamp` (ms since epoch, embedded in the payload) + * is within the acceptable replay window. + * @param webhookTimestamp - numeric timestamp from the parsed payload. + * @returns true if the timestamp is within MAX_WEBHOOK_TIMESTAMP_AGE_MS of now. + */ +export function isWebhookTimestampFresh(webhookTimestamp: number | undefined): boolean { + if (typeof webhookTimestamp !== 'number' || !isFinite(webhookTimestamp)) { + return false; + } + const age = Math.abs(Date.now() - webhookTimestamp); + return age <= MAX_WEBHOOK_TIMESTAMP_AGE_MS; +} + +/** + * Verify a Linear webhook request, transparently re-fetching the signing secret once + * if the cached copy is rejected. After rotation, warm Lambdas keep the old + * cached secret until their 5-minute TTL elapses — this forces an early refresh. + * + * @param secretId - Secrets Manager ARN/ID for the webhook secret. + * @param signature - the `Linear-Signature` header value. + * @param body - the raw request body string. + * @returns true if the signature is authentic (after at most one refresh retry). + */ +export async function verifyLinearRequest( + secretId: string, + signature: string, + body: string, +): Promise { + const cached = await getLinearSecret(secretId); + if (cached && verifyLinearSignature(cached, signature, body)) { + return true; + } + + invalidateLinearSecretCache(secretId); + const fresh = await getLinearSecret(secretId, true); + if (!fresh) return false; + if (fresh === cached) return false; + return verifyLinearSignature(fresh, signature, body); +} From b81b3dfa00edaf58340607e81004164316566750 Mon Sep 17 00:00:00 2001 From: Sphia Sadek Date: Tue, 5 May 2026 15:10:08 -0400 Subject: [PATCH 08/23] =?UTF-8?q?feat(linear):=20Phase=202=20=E2=80=94=20L?= =?UTF-8?q?inearIntegration=20construct=20+=20stack=20wiring?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - LinearIntegration construct: provisions both mapping tables, the webhook dedup table, 3 Lambdas (webhook / processor / link), 2 Secrets Manager placeholders, and API Gateway routes under /v1/linear/*. Deliberately no DynamoDB Streams consumer — outbound updates go through the Linear MCP from inside the agent container. - Stack: instantiates LinearIntegration in agent.ts and emits CfnOutputs for the two secret ARNs and both table names, consumed by `bgagent linear setup` / onboard-project. --- cdk/src/constructs/linear-integration.ts | 305 +++++++++++++++++++++++ cdk/src/stacks/agent.ts | 33 +++ 2 files changed, 338 insertions(+) create mode 100644 cdk/src/constructs/linear-integration.ts diff --git a/cdk/src/constructs/linear-integration.ts b/cdk/src/constructs/linear-integration.ts new file mode 100644 index 0000000..93f0898 --- /dev/null +++ b/cdk/src/constructs/linear-integration.ts @@ -0,0 +1,305 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as path from 'path'; +import { Duration, RemovalPolicy, Stack } from 'aws-cdk-lib'; +import * as apigw from 'aws-cdk-lib/aws-apigateway'; +import * as cognito from 'aws-cdk-lib/aws-cognito'; +import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; +import * as iam from 'aws-cdk-lib/aws-iam'; +import { Runtime, Architecture } from 'aws-cdk-lib/aws-lambda'; +import * as lambda from 'aws-cdk-lib/aws-lambda-nodejs'; +import * as secretsmanager from 'aws-cdk-lib/aws-secretsmanager'; +import { NagSuppressions } from 'cdk-nag'; +import { Construct } from 'constructs'; +import { LinearProjectMappingTable } from './linear-project-mapping-table'; +import { LinearUserMappingTable } from './linear-user-mapping-table'; + +/** + * Properties for LinearIntegration construct. + */ +export interface LinearIntegrationProps { + /** The existing REST API to add Linear routes to. */ + readonly api: apigw.RestApi; + + /** Cognito user pool for the /linear/link endpoint (Cognito-authenticated). */ + readonly userPool: cognito.IUserPool; + + /** The DynamoDB task table. */ + readonly taskTable: dynamodb.ITable; + + /** The DynamoDB task events table. */ + readonly taskEventsTable: dynamodb.ITable; + + /** The DynamoDB repo config table (optional — for repo onboarding checks). */ + readonly repoTable?: dynamodb.ITable; + + /** Orchestrator Lambda function ARN for async task invocation. */ + readonly orchestratorFunctionArn?: string; + + /** Bedrock Guardrail ID for input screening. */ + readonly guardrailId?: string; + + /** Bedrock Guardrail version for input screening. */ + readonly guardrailVersion?: string; + + /** Task retention in days for TTL computation. */ + readonly taskRetentionDays?: number; + + /** Removal policy for Linear DynamoDB tables. */ + readonly removalPolicy?: RemovalPolicy; +} + +/** + * CDK construct that adds Linear integration to the ABCA platform. + * + * Inbound-only adapter: Linear → webhook → task creation. Outbound progress + * updates happen agent-side via the Linear MCP server (see agent/src/channel_mcp.py), + * so there is NO DynamoDB Streams consumer and NO outbound-notify Lambda here. + * + * Creates: + * - LinearProjectMappingTable (Linear project → GitHub repo mapping) + * - LinearUserMappingTable (Linear user → platform user mapping) + * - LinearWebhookDedupTable (60s TTL dedup for webhook retries) + * - Lambda handlers for the webhook receiver, async processor, and account linking + * - API Gateway routes under /linear/* + * - Two Secrets Manager secrets (webhook signing secret + personal API token) + */ +export class LinearIntegration extends Construct { + /** Linear project → repo mapping table. */ + public readonly projectMappingTable: dynamodb.Table; + + /** Linear user → platform user mapping table. */ + public readonly userMappingTable: dynamodb.Table; + + /** Webhook dedup table — (issue_id, action) keys with 60s TTL. */ + public readonly webhookDedupTable: dynamodb.Table; + + /** Linear webhook signing secret (placeholder — populated by `bgagent linear setup`). */ + public readonly webhookSecret: secretsmanager.Secret; + + /** + * Linear personal API token used by the agent-side MCP (placeholder — + * populated by `bgagent linear setup`). + */ + public readonly apiTokenSecret: secretsmanager.Secret; + + constructor(scope: Construct, id: string, props: LinearIntegrationProps) { + super(scope, id); + + const removalPolicy = props.removalPolicy ?? RemovalPolicy.DESTROY; + + // --- DynamoDB tables --- + const projectMapping = new LinearProjectMappingTable(this, 'ProjectMappingTable', { removalPolicy }); + const userMapping = new LinearUserMappingTable(this, 'UserMappingTable', { removalPolicy }); + this.projectMappingTable = projectMapping.table; + this.userMappingTable = userMapping.table; + + // Dedup table: linear webhook retries collapse to a single processor invoke + // within the 60s TTL window. Keyed on `{issue_id}#{action}`. + this.webhookDedupTable = new dynamodb.Table(this, 'WebhookDedupTable', { + partitionKey: { name: 'dedup_key', type: dynamodb.AttributeType.STRING }, + billingMode: dynamodb.BillingMode.PAY_PER_REQUEST, + timeToLiveAttribute: 'ttl', + pointInTimeRecoverySpecification: { pointInTimeRecoveryEnabled: true }, + removalPolicy, + }); + + // --- Secrets (CDK-created placeholders, populated by `bgagent linear setup`) --- + this.webhookSecret = new secretsmanager.Secret(this, 'WebhookSecret', { + description: 'Linear webhook signing secret — populate via `bgagent linear setup`', + removalPolicy, + }); + this.apiTokenSecret = new secretsmanager.Secret(this, 'ApiTokenSecret', { + description: 'Linear personal API token for agent-side MCP — populate via `bgagent linear setup`', + removalPolicy, + }); + + // --- Shared Lambda configuration --- + const handlersDir = path.join(__dirname, '..', 'handlers'); + const commonBundling: lambda.BundlingOptions = { + externalModules: ['@aws-sdk/*'], + }; + + // --- Task creation environment (matches TaskApi / SlackIntegration pattern) --- + const createTaskEnv: Record = { + TASK_TABLE_NAME: props.taskTable.tableName, + TASK_EVENTS_TABLE_NAME: props.taskEventsTable.tableName, + TASK_RETENTION_DAYS: String(props.taskRetentionDays ?? 90), + }; + if (props.repoTable) { + createTaskEnv.REPO_TABLE_NAME = props.repoTable.tableName; + } + if (props.orchestratorFunctionArn) { + createTaskEnv.ORCHESTRATOR_FUNCTION_ARN = props.orchestratorFunctionArn; + } + if (props.guardrailId && props.guardrailVersion) { + createTaskEnv.GUARDRAIL_ID = props.guardrailId; + createTaskEnv.GUARDRAIL_VERSION = props.guardrailVersion; + } + + // --- Cognito Authorizer (for /linear/link) --- + const cognitoAuthorizer = new apigw.CognitoUserPoolsAuthorizer(this, 'LinearCognitoAuthorizer', { + cognitoUserPools: [props.userPool], + }); + const cognitoAuthOptions: apigw.MethodOptions = { + authorizer: cognitoAuthorizer, + authorizationType: apigw.AuthorizationType.COGNITO, + }; + const noneAuthOptions: apigw.MethodOptions = { + authorizationType: apigw.AuthorizationType.NONE, + }; + + // ═══════════════════════════════════════════════════════════════════════════ + // Lambda Handlers + // ═══════════════════════════════════════════════════════════════════════════ + + // --- Webhook processor (async, invoked by receiver) --- + const webhookProcessorFn = new lambda.NodejsFunction(this, 'WebhookProcessorFn', { + entry: path.join(handlersDir, 'linear-webhook-processor.ts'), + handler: 'handler', + runtime: Runtime.NODEJS_24_X, + architecture: Architecture.ARM_64, + timeout: Duration.seconds(30), + environment: { + ...createTaskEnv, + LINEAR_PROJECT_MAPPING_TABLE_NAME: this.projectMappingTable.tableName, + LINEAR_USER_MAPPING_TABLE_NAME: this.userMappingTable.tableName, + }, + bundling: commonBundling, + }); + this.projectMappingTable.grantReadData(webhookProcessorFn); + this.userMappingTable.grantReadData(webhookProcessorFn); + props.taskTable.grantReadWriteData(webhookProcessorFn); + props.taskEventsTable.grantReadWriteData(webhookProcessorFn); + if (props.repoTable) { + props.repoTable.grantReadData(webhookProcessorFn); + } + if (props.orchestratorFunctionArn) { + webhookProcessorFn.addToRolePolicy(new iam.PolicyStatement({ + actions: ['lambda:InvokeFunction'], + resources: [props.orchestratorFunctionArn], + })); + } + if (props.guardrailId) { + webhookProcessorFn.addToRolePolicy(new iam.PolicyStatement({ + actions: ['bedrock:ApplyGuardrail'], + resources: [ + Stack.of(this).formatArn({ + service: 'bedrock', + resource: 'guardrail', + resourceName: props.guardrailId, + }), + ], + })); + } + + // --- Webhook receiver (verifies HMAC, dedups, invokes processor) --- + const webhookFn = new lambda.NodejsFunction(this, 'WebhookFn', { + entry: path.join(handlersDir, 'linear-webhook.ts'), + handler: 'handler', + runtime: Runtime.NODEJS_24_X, + architecture: Architecture.ARM_64, + timeout: Duration.seconds(10), + environment: { + LINEAR_WEBHOOK_SECRET_ARN: this.webhookSecret.secretArn, + LINEAR_WEBHOOK_DEDUP_TABLE_NAME: this.webhookDedupTable.tableName, + LINEAR_WEBHOOK_PROCESSOR_FUNCTION_NAME: webhookProcessorFn.functionName, + }, + bundling: commonBundling, + }); + this.webhookSecret.grantRead(webhookFn); + this.webhookDedupTable.grantReadWriteData(webhookFn); + webhookProcessorFn.grantInvoke(webhookFn); + + // --- Account linking (Cognito-authenticated) --- + const linkFn = new lambda.NodejsFunction(this, 'LinkFn', { + entry: path.join(handlersDir, 'linear-link.ts'), + handler: 'handler', + runtime: Runtime.NODEJS_24_X, + architecture: Architecture.ARM_64, + timeout: Duration.seconds(10), + environment: { + LINEAR_USER_MAPPING_TABLE_NAME: this.userMappingTable.tableName, + }, + bundling: commonBundling, + }); + this.userMappingTable.grantReadWriteData(linkFn); + + // ═══════════════════════════════════════════════════════════════════════════ + // API Gateway Routes + // ═══════════════════════════════════════════════════════════════════════════ + + const linear = props.api.root.addResource('linear'); + + // POST /v1/linear/webhook — HMAC-verified; no Cognito. + const webhookResource = linear.addResource('webhook'); + const webhookMethod = webhookResource.addMethod( + 'POST', + new apigw.LambdaIntegration(webhookFn), + noneAuthOptions, + ); + + // POST /v1/linear/link — Cognito-authenticated. + const linkResource = linear.addResource('link'); + linkResource.addMethod( + 'POST', + new apigw.LambdaIntegration(linkFn), + cognitoAuthOptions, + ); + + // ═══════════════════════════════════════════════════════════════════════════ + // cdk-nag suppressions + // ═══════════════════════════════════════════════════════════════════════════ + + NagSuppressions.addResourceSuppressions(webhookMethod, [ + { + id: 'AwsSolutions-APIG4', + reason: 'Linear webhook endpoint uses Linear-Signature HMAC verification instead of Cognito — by design for Linear webhook integration', + }, + { + id: 'AwsSolutions-COG4', + reason: 'Linear webhook endpoint uses Linear-Signature HMAC verification instead of Cognito — by design for Linear webhook integration', + }, + ]); + + for (const secret of [this.webhookSecret, this.apiTokenSecret]) { + NagSuppressions.addResourceSuppressions(secret, [ + { + id: 'AwsSolutions-SMG4', + reason: 'Linear credentials are managed externally (Linear web UI) — automatic rotation is not applicable', + }, + ]); + } + + const allFunctions = [webhookFn, webhookProcessorFn, linkFn]; + for (const fn of allFunctions) { + NagSuppressions.addResourceSuppressions(fn, [ + { + id: 'AwsSolutions-IAM4', + reason: 'AWSLambdaBasicExecutionRole is the AWS-recommended managed policy for Lambda functions', + }, + { + id: 'AwsSolutions-IAM5', + reason: 'Wildcard permissions are scoped by DynamoDB index ARN patterns', + }, + ], true); + } + } +} diff --git a/cdk/src/stacks/agent.ts b/cdk/src/stacks/agent.ts index 360199b..154297f 100644 --- a/cdk/src/stacks/agent.ts +++ b/cdk/src/stacks/agent.ts @@ -38,6 +38,7 @@ import { ConcurrencyReconciler } from '../constructs/concurrency-reconciler'; import { DnsFirewall } from '../constructs/dns-firewall'; // import { EcsAgentCluster } from '../constructs/ecs-agent-cluster'; import { RepoTable } from '../constructs/repo-table'; +import { LinearIntegration } from '../constructs/linear-integration'; import { SlackIntegration } from '../constructs/slack-integration'; import { TaskApi } from '../constructs/task-api'; import { TaskDashboard } from '../constructs/task-dashboard'; @@ -430,6 +431,38 @@ export class AgentStack extends Stack { description: 'Name of the DynamoDB Slack user mapping table', }); + // --- Linear integration (inbound webhook + agent-side MCP outbound) --- + const linearIntegration = new LinearIntegration(this, 'LinearIntegration', { + api: taskApi.api, + userPool: taskApi.userPool, + taskTable: taskTable.table, + taskEventsTable: taskEventsTable.table, + repoTable: repoTable.table, + orchestratorFunctionArn: orchestrator.alias.functionArn, + guardrailId: inputGuardrail.guardrailId, + guardrailVersion: inputGuardrail.guardrailVersion, + }); + + new CfnOutput(this, 'LinearWebhookSecretArn', { + value: linearIntegration.webhookSecret.secretArn, + description: 'Secrets Manager ARN for the Linear webhook signing secret — populate via `bgagent linear setup`', + }); + + new CfnOutput(this, 'LinearApiTokenSecretArn', { + value: linearIntegration.apiTokenSecret.secretArn, + description: 'Secrets Manager ARN for the Linear personal API token (agent-side MCP) — populate via `bgagent linear setup`', + }); + + new CfnOutput(this, 'LinearProjectMappingTableName', { + value: linearIntegration.projectMappingTable.tableName, + description: 'Name of the DynamoDB Linear project → repo mapping table', + }); + + new CfnOutput(this, 'LinearUserMappingTableName', { + value: linearIntegration.userMappingTable.tableName, + description: 'Name of the DynamoDB Linear user mapping table', + }); + // --- Bedrock model invocation logging (account-level) --- const invocationLogGroup = new logs.LogGroup(this, 'ModelInvocationLogGroup', { logGroupName: '/aws/bedrock/model-invocation-logs', From 341f2b2122c94a5db6ff02e4e1add2cebdb74704 Mon Sep 17 00:00:00 2001 From: Sphia Sadek Date: Tue, 5 May 2026 15:20:33 -0400 Subject: [PATCH 09/23] =?UTF-8?q?feat(linear):=20Phase=203=20=E2=80=94=20a?= =?UTF-8?q?gent-side=20Linear=20MCP=20+=20channel=20plumbing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Orchestrator invoke payload now carries `channel_source` + `channel_metadata`, so the agent knows which inbound channel a task came from (and the Linear issue identifier for Linear-origin tasks). - TaskConfig + build_config accept the new fields; server.py extracts them from the /invocations payload and forwards into pipeline.run_task. - channel_mcp.py: new `configure_channel_mcp(repo_dir, channel_source)`. For channel_source=='linear' it merges a `linear-server` entry into `.mcp.json` (keyed so tools surface as `mcp__linear-server__*`, matching the verified MCP spec). For any other channel it's a no-op — the gate that keeps Slack/API tasks from loading Linear tools. - config.py: `resolve_linear_api_token()` reads LinearApiTokenSecret via LINEAR_API_TOKEN_SECRET_ARN and caches into LINEAR_API_TOKEN so the SDK child process inherits it for the MCP's ${LINEAR_API_TOKEN} placeholder. - pipeline.py: resolves the token + writes .mcp.json just before run_agent. - prompt_builder.py: appends a short Linear-specific addendum naming `mcp__linear-server__save_comment` / `update_issue` by tool name. - Stack: grants runtime read on LinearApiTokenSecret and sets the secret ARN in the AgentCore runtime environment via CFN override. - run.sh: forwards LINEAR_API_TOKEN / LINEAR_API_TOKEN_SECRET_ARN into the local container for manual testing. --- agent/run.sh | 2 + agent/src/channel_mcp.py | 112 ++++++++++++++++++++++++ agent/src/config.py | 40 +++++++++ agent/src/models.py | 5 ++ agent/src/pipeline.py | 16 +++- agent/src/prompt_builder.py | 32 +++++++ agent/src/server.py | 8 ++ cdk/src/handlers/shared/orchestrator.ts | 2 + cdk/src/stacks/agent.ts | 9 ++ 9 files changed, 225 insertions(+), 1 deletion(-) create mode 100644 agent/src/channel_mcp.py diff --git a/agent/run.sh b/agent/run.sh index ac61028..01f4f36 100755 --- a/agent/run.sh +++ b/agent/run.sh @@ -205,6 +205,8 @@ DOCKER_ARGS=( [[ -n "${DRY_RUN:-}" ]] && DOCKER_ARGS+=(-e "DRY_RUN=${DRY_RUN}") [[ -n "${MAX_TURNS:-}" ]] && DOCKER_ARGS+=(-e "MAX_TURNS=${MAX_TURNS}") [[ -n "${MAX_BUDGET_USD:-}" ]] && DOCKER_ARGS+=(-e "MAX_BUDGET_USD=${MAX_BUDGET_USD}") +[[ -n "${LINEAR_API_TOKEN:-}" ]] && DOCKER_ARGS+=(-e "LINEAR_API_TOKEN=${LINEAR_API_TOKEN}") +[[ -n "${LINEAR_API_TOKEN_SECRET_ARN:-}" ]] && DOCKER_ARGS+=(-e "LINEAR_API_TOKEN_SECRET_ARN=${LINEAR_API_TOKEN_SECRET_ARN}") # Server mode: expose port 8080 if [[ "$MODE" == "server" ]]; then diff --git a/agent/src/channel_mcp.py b/agent/src/channel_mcp.py new file mode 100644 index 0000000..0b44cbf --- /dev/null +++ b/agent/src/channel_mcp.py @@ -0,0 +1,112 @@ +"""Channel-specific MCP configuration for the agent container. + +For Linear-origin tasks we write (or merge into) ``.mcp.json`` in the cloned +repo ``cwd`` so the Claude Agent SDK — configured with +``setting_sources=["project"]`` — picks up the Linear MCP at session start +and exposes ``mcp__linear-server__*`` tools. + +For all other channel sources this is a no-op: no MCP is written, and the +SDK sees no Linear tools. That's the gate keeping Slack/API/webhook tasks +from touching Linear. + +See: cdk/src/handlers/linear-webhook-processor.ts (inbound), runner.py +(SDK invocation), plans at ~/.claude/plans/linear-mcp-findings.md. +""" + +from __future__ import annotations + +import json +import os +from typing import Any + +from shell import log + +#: Linear MCP endpoint — hosted by Linear, Streamable HTTP transport. +LINEAR_MCP_URL = "https://mcp.linear.app/mcp" + +#: Key name inside ``mcpServers``. Tools surface as +#: ``mcp__linear-server__*`` in the Agent SDK (verified in findings). +LINEAR_MCP_SERVER_KEY = "linear-server" + +#: Env var name the MCP server entry reads via ``${LINEAR_API_TOKEN}`` +#: placeholder expansion. Populated from ``LinearApiTokenSecret`` by run.sh. +LINEAR_API_TOKEN_ENV = "LINEAR_API_TOKEN" + + +def _linear_server_entry() -> dict[str, Any]: + """Build the `mcpServers` entry for Linear's hosted MCP.""" + return { + "type": "http", + "url": LINEAR_MCP_URL, + "headers": { + "Authorization": f"Bearer ${{{LINEAR_API_TOKEN_ENV}}}", + }, + } + + +def _read_existing_mcp_config(path: str) -> dict[str, Any]: + """Return the parsed .mcp.json at ``path``, or an empty dict if absent/invalid. + + Malformed JSON is logged and treated as absent — we prefer to overlay a + valid Linear entry than to crash the agent because a user committed a + broken .mcp.json to their repo. + """ + if not os.path.isfile(path): + return {} + try: + with open(path, encoding="utf-8") as f: + parsed = json.load(f) + if isinstance(parsed, dict): + return parsed + log("WARN", f"Ignoring non-object .mcp.json at {path} (got {type(parsed).__name__})") + except (OSError, json.JSONDecodeError) as e: + log("WARN", f"Failed to read existing .mcp.json at {path}: {type(e).__name__}: {e}") + return {} + + +def configure_channel_mcp(repo_dir: str, channel_source: str) -> bool: + """Write or merge a channel-specific ``.mcp.json`` into ``repo_dir``. + + Gated on ``channel_source``: + * ``'linear'`` → ensure the ``linear-server`` entry is present in + ``.mcp.json`` (merges into any existing config without clobbering + other servers). Returns True. + * anything else → no-op. Returns False. + + Args: + repo_dir: the cloned-repo working directory the SDK will use as ``cwd``. + channel_source: inbound channel (``TaskConfig.channel_source``). + + Returns: + True if a Linear MCP entry was (re)written into ``repo_dir/.mcp.json``, + False otherwise (including any non-Linear channel or missing repo_dir). + """ + if channel_source != "linear": + return False + + if not repo_dir or not os.path.isdir(repo_dir): + log("WARN", f"configure_channel_mcp: repo_dir missing or not a directory: {repo_dir!r}") + return False + + mcp_path = os.path.join(repo_dir, ".mcp.json") + config = _read_existing_mcp_config(mcp_path) + + servers = config.get("mcpServers") + if not isinstance(servers, dict): + servers = {} + servers[LINEAR_MCP_SERVER_KEY] = _linear_server_entry() + config["mcpServers"] = servers + + try: + with open(mcp_path, "w", encoding="utf-8") as f: + json.dump(config, f, indent=2) + f.write("\n") + except OSError as e: + log("ERROR", f"Failed to write Linear MCP config to {mcp_path}: {e}") + return False + + log( + "TASK", + f"Linear MCP configured at {mcp_path} (server key: {LINEAR_MCP_SERVER_KEY})", + ) + return True diff --git a/agent/src/config.py b/agent/src/config.py index 4e26e2e..39470e5 100644 --- a/agent/src/config.py +++ b/agent/src/config.py @@ -37,6 +37,42 @@ def resolve_github_token() -> str: return "" +def resolve_linear_api_token() -> str: + """Resolve the Linear personal API token from Secrets Manager or env. + + Mirrors ``resolve_github_token``: in deployed mode + ``LINEAR_API_TOKEN_SECRET_ARN`` is set and the token is fetched once + and cached in ``LINEAR_API_TOKEN``. For local development, falls back + to ``LINEAR_API_TOKEN`` directly. + + Returns an empty string if the secret is absent or empty — the agent-side + MCP config then renders with an unresolved ``${LINEAR_API_TOKEN}`` env + placeholder, and the Linear MCP will reject the request (fail-closed). + This function is only called when ``channel_source == 'linear'``. + """ + cached = os.environ.get("LINEAR_API_TOKEN", "") + if cached: + return cached + secret_arn = os.environ.get("LINEAR_API_TOKEN_SECRET_ARN") + if not secret_arn: + return "" + try: + import boto3 + + region = os.environ.get("AWS_REGION") or os.environ.get("AWS_DEFAULT_REGION") + client = boto3.client("secretsmanager", region_name=region) + resp = client.get_secret_value(SecretId=secret_arn) + token = resp.get("SecretString", "") or "" + if token: + os.environ["LINEAR_API_TOKEN"] = token + return token + except Exception as e: + # Never let a Secrets Manager outage crash the agent. The Linear MCP + # will simply fail on first call with a clear auth error. + print(f"[config] resolve_linear_api_token failed: {type(e).__name__}: {e}", flush=True) + return "" + + def build_config( repo_url: str, task_description: str = "", @@ -52,6 +88,8 @@ def build_config( task_type: str = "new_task", branch_name: str = "", pr_number: str = "", + channel_source: str = "", + channel_metadata: dict[str, str] | None = None, ) -> TaskConfig: """Build and validate configuration from explicit parameters. @@ -102,6 +140,8 @@ def build_config( branch_name=branch_name, pr_number=pr_number, task_id=task_id or uuid.uuid4().hex[:12], + channel_source=channel_source, + channel_metadata=channel_metadata or {}, ) diff --git a/agent/src/models.py b/agent/src/models.py index 0e4f8f1..b9205b1 100644 --- a/agent/src/models.py +++ b/agent/src/models.py @@ -108,6 +108,11 @@ class TaskConfig(BaseModel): branch_name: str = "" pr_number: str = "" task_id: str = "" + # Inbound channel the task was submitted from (mirrors ChannelSource in + # cdk/src/handlers/shared/types.ts). Gates channel-specific MCP wiring and + # prompt additions. Empty string means "no channel context" (legacy / local). + channel_source: str = "" + channel_metadata: dict[str, str] = Field(default_factory=dict) # Enriched mid-flight by pipeline.py: cedar_policies: list[str] = [] issue: GitHubIssue | None = None diff --git a/agent/src/pipeline.py b/agent/src/pipeline.py index b1dcafc..675c28a 100644 --- a/agent/src/pipeline.py +++ b/agent/src/pipeline.py @@ -13,7 +13,8 @@ import memory as agent_memory import task_state -from config import AGENT_WORKSPACE, build_config, get_config +from channel_mcp import configure_channel_mcp +from config import AGENT_WORKSPACE, build_config, get_config, resolve_linear_api_token from context import assemble_prompt, fetch_github_issue from models import AgentResult, HydratedContext, RepoSetup, TaskConfig, TaskResult from observability import task_span @@ -149,6 +150,8 @@ def run_task( branch_name: str = "", pr_number: str = "", cedar_policies: list[str] | None = None, + channel_source: str = "", + channel_metadata: dict[str, str] | None = None, ) -> dict: """Run the full agent pipeline and return a serialized result dict. @@ -179,6 +182,8 @@ def run_task( task_type=task_type, branch_name=branch_name, pr_number=pr_number, + channel_source=channel_source, + channel_metadata=channel_metadata, ) # Inject Cedar policies into config for the PolicyEngine in runner.py @@ -278,6 +283,15 @@ def run_task( system_prompt = build_system_prompt(config, setup, hc, system_prompt_overrides) + # Channel-specific MCP wiring (Linear only, for v1). Must happen + # before discover_project_config so the scan picks up the file we + # just wrote. Resolve the API token from Secrets Manager *before* + # writing .mcp.json so the child SDK process inherits the env var + # that the MCP server entry references via ${LINEAR_API_TOKEN}. + if config.channel_source == "linear": + resolve_linear_api_token() + configure_channel_mcp(setup.repo_dir, config.channel_source) + # Log discovered repo-level project configuration # (all files loaded by setting_sources=["project"]) repo_dir = setup.repo_dir diff --git a/agent/src/prompt_builder.py b/agent/src/prompt_builder.py index 574b060..2da5c6d 100644 --- a/agent/src/prompt_builder.py +++ b/agent/src/prompt_builder.py @@ -75,9 +75,41 @@ def build_system_prompt( n = len(overrides) log("TASK", f"Applied system prompt overrides ({n} chars)") + # Channel-specific guidance (appended last so channel instructions sit + # close to the end of the prompt, where the model weights recency). + channel_addendum = _channel_prompt_addendum(config) + if channel_addendum: + system_prompt += channel_addendum + return system_prompt +def _channel_prompt_addendum(config: TaskConfig) -> str: + """Return channel-specific prompt guidance, or empty string. + + For Linear-origin tasks, instruct the agent to post progress comments and + transition state using the already-loaded Linear MCP tools. The tool names + are stated explicitly so the agent doesn't grope for them. + """ + if config.channel_source != "linear": + return "" + issue_identifier = config.channel_metadata.get("linear_issue_identifier") or "" + issue_ref = f" (`{issue_identifier}`)" if issue_identifier else "" + return ( + "\n\n## Linear issue progress updates\n\n" + f"This task was submitted from a Linear issue{issue_ref}. The Linear MCP " + "server is loaded — use its tools to keep the reporter informed:\n\n" + "- When you start working: call `mcp__linear-server__save_comment` with a " + "short \"🤖 Starting on this issue…\" message.\n" + "- When you open a PR: call `mcp__linear-server__save_comment` with the PR " + "URL, and `mcp__linear-server__update_issue` to transition state (e.g. to " + "`In Review`) if the workspace has that state.\n" + "- On completion or failure: call `mcp__linear-server__save_comment` with " + "the final status.\n\n" + "Keep comments concise. Do not mirror the full agent transcript back to Linear." + ) + + def discover_project_config(repo_dir: str) -> dict[str, list[str]]: """Scan the cloned repo for project-level configuration files. diff --git a/agent/src/server.py b/agent/src/server.py index b1c58e4..01459be 100644 --- a/agent/src/server.py +++ b/agent/src/server.py @@ -134,6 +134,8 @@ def _run_task_background( branch_name: str = "", pr_number: str = "", cedar_policies: list[str] | None = None, + channel_source: str = "", + channel_metadata: dict[str, str] | None = None, ) -> None: """Run the agent task in a background thread.""" global _background_pipeline_failed @@ -173,6 +175,8 @@ def _run_task_background( branch_name=branch_name, pr_number=pr_number, cedar_policies=cedar_policies, + channel_source=channel_source, + channel_metadata=channel_metadata, ) _background_pipeline_failed = False except Exception as e: @@ -226,6 +230,8 @@ def invoke_agent(request: Request, body: InvocationRequest): branch_name = inp.get("branch_name", "") pr_number = str(inp.get("pr_number", "")) cedar_policies = inp.get("cedar_policies") or [] + channel_source = inp.get("channel_source", "") or "" + channel_metadata = inp.get("channel_metadata") or {} # Extract AgentCore session ID from request headers for OTEL correlation session_id = request.headers.get("x-amzn-bedrock-agentcore-runtime-session-id", "") @@ -251,6 +257,8 @@ def invoke_agent(request: Request, body: InvocationRequest): branch_name, pr_number, cedar_policies, + channel_source, + channel_metadata, ), ) # Track the thread for graceful shutdown BEFORE starting it so diff --git a/cdk/src/handlers/shared/orchestrator.ts b/cdk/src/handlers/shared/orchestrator.ts index 3ddf17a..8d2d13f 100644 --- a/cdk/src/handlers/shared/orchestrator.ts +++ b/cdk/src/handlers/shared/orchestrator.ts @@ -338,6 +338,8 @@ export async function hydrateAndTransition(task: TaskRecord, blueprintConfig?: B prompt_version: promptVersion, ...(MEMORY_ID && { memory_id: MEMORY_ID }), hydrated_context: hydratedContext, + channel_source: task.channel_source, + ...(task.channel_metadata && Object.keys(task.channel_metadata).length > 0 && { channel_metadata: task.channel_metadata }), }; if (hydratedContext.fallback_error) { diff --git a/cdk/src/stacks/agent.ts b/cdk/src/stacks/agent.ts index 154297f..2f812cf 100644 --- a/cdk/src/stacks/agent.ts +++ b/cdk/src/stacks/agent.ts @@ -443,6 +443,15 @@ export class AgentStack extends Stack { guardrailVersion: inputGuardrail.guardrailVersion, }); + // Pipe the Linear API token secret into the AgentCore runtime so the + // agent's `resolve_linear_api_token()` can populate `LINEAR_API_TOKEN` + // for the Linear MCP's `${LINEAR_API_TOKEN}` placeholder. + linearIntegration.apiTokenSecret.grantRead(runtime); + cfnRuntime.addPropertyOverride( + 'EnvironmentVariables.LINEAR_API_TOKEN_SECRET_ARN', + linearIntegration.apiTokenSecret.secretArn, + ); + new CfnOutput(this, 'LinearWebhookSecretArn', { value: linearIntegration.webhookSecret.secretArn, description: 'Secrets Manager ARN for the Linear webhook signing secret — populate via `bgagent linear setup`', From 5a00eade6c243e6c732966bf33f4a30fbcba5294 Mon Sep 17 00:00:00 2001 From: bgagent Date: Tue, 5 May 2026 15:34:56 -0400 Subject: [PATCH 10/23] =?UTF-8?q?feat(linear):=20Phase=204=20=E2=80=94=20C?= =?UTF-8?q?LI=20commands=20+=20setup=20guide=20+=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - cli/src/commands/linear.ts: new `bgagent linear` command group: - `setup` — prompts for the Linear webhook signing secret and personal API key, populates both placeholders in Secrets Manager, prints the next-step checklist including the webhook URL. - `link ` — calls POST /v1/linear/link with the Cognito JWT. - `onboard-project --repo owner/repo [--label bgagent]` — writes the Linear project → repo mapping row directly to LinearProjectMappingTable via DynamoDBDocumentClient (admin IAM path, matching the current onboarding UX for Slack + webhooks). - api-client + types: LinearLinkResponse type + linearLink() method. - bgagent.ts: registers the new command group. - cli/package.json: adds @aws-sdk/client-dynamodb + @aws-sdk/lib-dynamodb so the CLI can write project mappings. - docs/guides/LINEAR_SETUP_GUIDE.md: new end-to-end setup walkthrough mirroring SLACK_SETUP_GUIDE, covering API-key generation, webhook configuration, onboarding, linking, and troubleshooting. - docs/scripts/sync-starlight.mjs + docs/astro.config.mjs: routing + sidebar entry for the new guide. - docs/guides/USER_GUIDE.md: Linear now shows up as the 5th channel. - cdk/test/stacks/agent.test.ts: DDB table count bumped 7 → 10 to cover the three new Linear tables. --- cdk/test/stacks/agent.test.ts | 8 +- cli/package.json | 2 + cli/src/api-client.ts | 7 + cli/src/bin/bgagent.ts | 2 + cli/src/commands/linear.ts | 239 ++++++++++++++++++ cli/src/types.ts | 7 + docs/astro.config.mjs | 1 + docs/guides/LINEAR_SETUP_GUIDE.md | 168 ++++++++++++ docs/guides/USER_GUIDE.md | 5 +- docs/scripts/sync-starlight.mjs | 7 + .../content/docs/using/Linear-setup-guide.md | 172 +++++++++++++ docs/src/content/docs/using/Overview.md | 5 +- yarn.lock | 60 +++++ 13 files changed, 676 insertions(+), 7 deletions(-) create mode 100644 cli/src/commands/linear.ts create mode 100644 docs/guides/LINEAR_SETUP_GUIDE.md create mode 100644 docs/src/content/docs/using/Linear-setup-guide.md diff --git a/cdk/test/stacks/agent.test.ts b/cdk/test/stacks/agent.test.ts index 0ece647..29cb9d4 100644 --- a/cdk/test/stacks/agent.test.ts +++ b/cdk/test/stacks/agent.test.ts @@ -36,9 +36,11 @@ describe('AgentStack', () => { expect(template).toBeDefined(); }); - test('creates exactly 7 DynamoDB tables', () => { - // task, task-events, repo, user-concurrency, webhook + slack-installation, slack-user-mapping - template.resourceCountIs('AWS::DynamoDB::Table', 7); + test('creates exactly 10 DynamoDB tables', () => { + // task, task-events, repo, user-concurrency, webhook, + // slack-installation, slack-user-mapping, + // linear-project-mapping, linear-user-mapping, linear-webhook-dedup + template.resourceCountIs('AWS::DynamoDB::Table', 10); }); test('outputs TaskTableName', () => { diff --git a/cli/package.json b/cli/package.json index 231a390..b8b858f 100644 --- a/cli/package.json +++ b/cli/package.json @@ -32,7 +32,9 @@ "dependencies": { "@aws-sdk/client-cloudformation": "3.1024.0", "@aws-sdk/client-cognito-identity-provider": "^3.1021.0", + "@aws-sdk/client-dynamodb": "3.1024.0", "@aws-sdk/client-secrets-manager": "3.1024.0", + "@aws-sdk/lib-dynamodb": "3.1024.0", "commander": "^14.0.3" }, "resolutions": { diff --git a/cli/src/api-client.ts b/cli/src/api-client.ts index abce8f4..f0c925f 100644 --- a/cli/src/api-client.ts +++ b/cli/src/api-client.ts @@ -27,6 +27,7 @@ import { CreateWebhookRequest, CreateWebhookResponse, ErrorResponse, + LinearLinkResponse, SlackLinkResponse, PaginatedResponse, SuccessResponse, @@ -181,4 +182,10 @@ export class ApiClient { const res = await this.request>('POST', '/slack/link', { code }); return res.data; } + + /** POST /linear/link — link a Linear account using a verification code. */ + async linearLink(code: string): Promise { + const res = await this.request>('POST', '/linear/link', { code }); + return res.data; + } } diff --git a/cli/src/bin/bgagent.ts b/cli/src/bin/bgagent.ts index 663f424..2e63072 100644 --- a/cli/src/bin/bgagent.ts +++ b/cli/src/bin/bgagent.ts @@ -23,6 +23,7 @@ import { Command } from 'commander'; import { makeCancelCommand } from '../commands/cancel'; import { makeConfigureCommand } from '../commands/configure'; import { makeEventsCommand } from '../commands/events'; +import { makeLinearCommand } from '../commands/linear'; import { makeListCommand } from '../commands/list'; import { makeLoginCommand } from '../commands/login'; import { makeSlackCommand } from '../commands/slack'; @@ -55,6 +56,7 @@ program.addCommand(makeStatusCommand()); program.addCommand(makeCancelCommand()); program.addCommand(makeEventsCommand()); program.addCommand(makeSlackCommand()); +program.addCommand(makeLinearCommand()); program.addCommand(makeWebhookCommand()); program.parseAsync(process.argv).catch((err: unknown) => { diff --git a/cli/src/commands/linear.ts b/cli/src/commands/linear.ts new file mode 100644 index 0000000..30a4405 --- /dev/null +++ b/cli/src/commands/linear.ts @@ -0,0 +1,239 @@ +/** + * MIT No Attribution + * + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import * as readline from 'readline'; +import { CloudFormationClient, DescribeStacksCommand } from '@aws-sdk/client-cloudformation'; +import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; +import { DynamoDBDocumentClient, PutCommand } from '@aws-sdk/lib-dynamodb'; +import { PutSecretValueCommand, SecretsManagerClient } from '@aws-sdk/client-secrets-manager'; +import { Command } from 'commander'; +import { ApiClient } from '../api-client'; +import { loadConfig } from '../config'; +import { formatJson } from '../format'; + +/** Default label that triggers an ABCA task when applied to a Linear issue. */ +const DEFAULT_LABEL_FILTER = 'bgagent'; + +export function makeLinearCommand(): Command { + const linear = new Command('linear') + .description('Manage Linear integration'); + + linear.addCommand( + new Command('link') + .description('Link your Linear account using a verification code') + .argument('', 'Verification code from Linear') + .option('--output ', 'Output format (text or json)', 'text') + .action(async (code: string, opts) => { + const client = new ApiClient(); + const result = await client.linearLink(code); + + if (opts.output === 'json') { + console.log(formatJson(result)); + } else { + console.log('Linear account linked successfully.'); + console.log(` Workspace: ${result.linear_workspace_id}`); + console.log(` User: ${result.linear_user_id}`); + console.log(` Linked at: ${result.linked_at}`); + } + }), + ); + + linear.addCommand( + new Command('setup') + .description('Populate Linear webhook secret + personal API token in Secrets Manager') + .option('--region ', 'AWS region (defaults to configured region)') + .option('--stack-name ', 'CloudFormation stack name', 'backgroundagent-dev') + .action(async (opts) => { + const config = loadConfig(); + const region = opts.region || config.region; + + const webhookSecretArn = await getStackOutput(region, opts.stackName, 'LinearWebhookSecretArn'); + const apiTokenSecretArn = await getStackOutput(region, opts.stackName, 'LinearApiTokenSecretArn'); + + if (!webhookSecretArn || !apiTokenSecretArn) { + console.error('Could not find Linear secret ARNs in stack outputs. Deploy the stack first.'); + process.exit(1); + } + + const apiBaseUrl = config.api_url.replace(/\/+$/, ''); + console.log('Linear setup — see docs/guides/LINEAR_SETUP_GUIDE.md for the full walkthrough.\n'); + console.log('Required Linear config:'); + console.log(' 1. Create a personal API key at https://linear.app/settings/account/security'); + console.log(` 2. Create a webhook at https://linear.app/settings/api — point it at: ${apiBaseUrl}/linear/webhook`); + console.log(' - Subscribe to: Issues'); + console.log(' - Copy the signing secret from the webhook detail page\n'); + + const webhookSecret = await promptSecret('Webhook signing secret: '); + const apiToken = await promptSecret('Personal API key (lin_api_…): '); + + if (!webhookSecret || !apiToken) { + console.error('\n✗ Both values are required. Try again.'); + process.exit(1); + } + if (!apiToken.startsWith('lin_api_')) { + console.error('\n✗ Personal API keys start with "lin_api_". Check https://linear.app/settings/account/security.'); + process.exit(1); + } + + const sm = new SecretsManagerClient({ region }); + await sm.send(new PutSecretValueCommand({ SecretId: webhookSecretArn, SecretString: webhookSecret })); + console.log(' ✓ Stored webhook signing secret'); + await sm.send(new PutSecretValueCommand({ SecretId: apiTokenSecretArn, SecretString: apiToken })); + console.log(' ✓ Stored personal API token\n'); + + console.log('Next steps:'); + console.log(' 1. Onboard a Linear project:'); + console.log(' bgagent linear onboard-project --repo owner/repo'); + console.log(' 2. In Linear, comment on an issue with "bgagent link" to receive a link code, then run:'); + console.log(' bgagent linear link '); + console.log(' 3. Add the "bgagent" label to a Linear issue in a mapped project — ABCA will pick it up.'); + }), + ); + + linear.addCommand( + new Command('onboard-project') + .description('Map a Linear project to a GitHub repository (admin IAM required)') + .argument('', 'Linear project UUID') + .requiredOption('--repo ', 'GitHub repository the mapped project should route tasks to') + .option('--label

i2A$;xqd@S&GLxOHUv)-%TZ+>o>@nuK%F*Jin}t22N?wr}Pw$LHFzAh4!u< zWnv|QsV!SJr6>Kul)R`!n94XfloFU(oEwrrdl<4Em z>Dm7=YkI6(tE$IG*8T1Qw3$PRYscB%m(YX#c>3vi2?S;-(tR!c+0HlzHnzi8_R?O5$1)bO9$^%mJ=+nl7N`08JMK*uRZ#ox6nF?tfl#TxA9w0BV>xe1;UtuajDIG# zOjkHaB0C?`o>y|lYSd!B)vUfdl3*;)mDW{WiAa(cIadi(GlSkMCe+Jk8XO#kGL+L^ z6&XK#50)g3mGS^J-d6wFNy{spVzpFm%iFNP8mF4y^R$qb+QxKY-(S@~e(W#8h8Hr^ zh%7X3L@mh}+h-~qhHc)Vff; z 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