{"_id":"@anura-gate/watcher-slack","_rev":"3-d21931274eb00928be6b2670e7574f8f","name":"@anura-gate/watcher-slack","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"@anura-gate/watcher-slack","version":"0.1.0","keywords":["gate","watcher","slack","bot","self-hosted"],"license":"MIT","_id":"@anura-gate/watcher-slack@0.1.0","maintainers":[{"name":"anuragate","email":"ahmadajmal1514@gmail.com"}],"bin":{"gate-watcher-slack":"cli.js"},"dist":{"shasum":"8a487325bd8753d5aeed9e0db16f5375c25da719","tarball":"https://registry.npmjs.org/@anura-gate/watcher-slack/-/watcher-slack-0.1.0.tgz","fileCount":7,"integrity":"sha512-4r2Ggl1vVU8+ohhEts78Es6wQWGKTBeJ41VOWzvnz8b6WZJeXCw9eunIalljerP3ypTIJBBbzDVCmkeoz1IB7A==","signatures":[{"sig":"MEQCIFnS8sGL8w8rHrhVj2Gj1hTwzOONL7gS+ovczxdLFcd4AiAgpXEk40ya76SOXh2BXUdk+ks3eOWo0AROUj9tFTXG7w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":53821},"main":"index.js","engines":{"node":">=18"},"gitHead":"d1eea3e528c3d89d1efd22430fffb0329f82a118","scripts":{"start":"node cli.js"},"_npmUser":{"name":"anuragate","email":"ahmadajmal1514@gmail.com"},"_npmVersion":"10.9.2","description":"GATE Watcher — Self-hosted Slack Bot. Tokens never leave your machine.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"dotenv":"^17.3.1","qrcode":"^1.5.4","@slack/web-api":"^7.8.0","@slack/socket-mode":"^2.0.3"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/watcher-slack_0.1.0_1771499627970_0.5669739184570433","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@anura-gate/watcher-slack","version":"0.2.0","keywords":["gate","watcher","slack","bot","self-hosted"],"license":"MIT","_id":"@anura-gate/watcher-slack@0.2.0","maintainers":[{"name":"anuragate","email":"ahmadajmal1514@gmail.com"}],"bin":{"gate-watcher-slack":"cli.js"},"dist":{"shasum":"a7b740809fe59371743bb2515a45cd233edee080","tarball":"https://registry.npmjs.org/@anura-gate/watcher-slack/-/watcher-slack-0.2.0.tgz","fileCount":7,"integrity":"sha512-z12qrr5pCQ7hKEvacpAj/x4OVVcUxPuTuHSRm7459QiKj7CsWAH3upelEI8kA8eP6hrzW69sLD3u12Rvxt3VQA==","signatures":[{"sig":"MEUCIGwD96pOzKzqTr6Cdq/gcDW435GFXAUL3/CRwPwGsdW9AiEA9GQiI/fwh4i6N/ynuUYiiEE4DIX2T2SHX0usF7DVIBc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54767},"main":"index.js","engines":{"node":">=18"},"gitHead":"9de498efc9037d0f60a6b830ab7df915d5e8dbfc","scripts":{"start":"node cli.js"},"_npmUser":{"name":"anuragate","email":"ahmadajmal1514@gmail.com"},"_npmVersion":"10.9.2","description":"GATE Watcher — Self-hosted Slack Bot. Tokens never leave your machine.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"dotenv":"^17.3.1","qrcode":"^1.5.4","@slack/web-api":"^7.8.0","@slack/socket-mode":"^2.0.3"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/watcher-slack_0.2.0_1772343249909_0.3463030078038638","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@anura-gate/watcher-slack","version":"0.3.0","description":"GATE Watcher — Self-hosted Slack Bot. Tokens never leave your machine.","main":"index.js","bin":{"gate-watcher-slack":"cli.js"},"scripts":{"start":"node cli.js"},"keywords":["gate","watcher","slack","bot","self-hosted"],"license":"MIT","homepage":"https://anuragate.com","repository":{"type":"git","url":"git+https://github.com/ahmad-ajmal/AnuraGate_Sample.git"},"dependencies":{"@slack/socket-mode":"^2.0.3","@slack/web-api":"^7.8.0","dotenv":"^17.3.1","qrcode":"^1.5.4"},"engines":{"node":">=18"},"_id":"@anura-gate/watcher-slack@0.3.0","gitHead":"0ebb362ebdf75c602ccbaa15cb7db91b80f2901d","bugs":{"url":"https://github.com/ahmad-ajmal/AnuraGate_Sample/issues"},"_nodeVersion":"22.14.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-tLQZtir8CiM/qJT5x+vbAo2tTYeAVLg2QlI9cqNvd3npe4DMQ4nHVzH9EGAttZEQ9ZT1P+3b9Xk/JnlNYuIZrg==","shasum":"d3fca1bf72ccb6b3a98ac53023f4ca2f1236daec","tarball":"https://registry.npmjs.org/@anura-gate/watcher-slack/-/watcher-slack-0.3.0.tgz","fileCount":8,"unpackedSize":59869,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBdXSvcyUQxNx1YRIl70CiBQdpshL3kyN8v/TrHHmcWsAiEA72j+vRcffstYviybRZRI5YUmrjAM7E2+u3DuVmp1sL0="}]},"_npmUser":{"name":"anuragate","email":"ahmadajmal1514@gmail.com"},"directories":{},"maintainers":[{"name":"anuragate","email":"ahmadajmal1514@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/watcher-slack_0.3.0_1772353012210_0.9126833662029592"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-19T11:13:47.877Z","modified":"2026-03-01T08:16:52.567Z","0.1.0":"2026-02-19T11:13:48.155Z","0.2.0":"2026-03-01T05:34:10.048Z","0.3.0":"2026-03-01T08:16:52.422Z"},"license":"MIT","keywords":["gate","watcher","slack","bot","self-hosted"],"description":"GATE Watcher — Self-hosted Slack Bot. Tokens never leave your machine.","maintainers":[{"name":"anuragate","email":"ahmadajmal1514@gmail.com"}],"readme":"# GATE Watcher — Slack\n\nSelf-hosted daemon that connects your Slack Bot to GATE cloud for security processing via Socket Mode. **Your bot tokens never leave your machine.**\n\n## How it works\n\n```\nYour Machine (Watcher)              GATE Cloud\n┌─────────────────────┐        ┌──────────────────┐\n│ Slack Socket Mode   │───────>│ Security pipeline │\n│ (tokens stay HERE)  │<───────│ (redact, policy,  │\n│                     │ poll   │  audit, forward)  │\n└─────────────────────┘        └──────────────────┘\n```\n\n## Quick Start (CLI)\n\n```bash\ncd gate-watcher-slack\nnpm install\n\n# Create .env (or pass env vars directly)\ncp .env.example .env\n# Fill in GATE_KEY, GATE_INTEGRATION_ID, SLACK_BOT_TOKEN, SLACK_APP_TOKEN\n\nnpm start\n```\n\n## Embed in Your App (SDK)\n\n```bash\nnpm install @anura-gate/watcher-slack\n```\n\n```js\nconst { GateSlackWatcher } = require(\"@anura-gate/watcher-slack\");\n\nconst watcher = new GateSlackWatcher({\n  gateKey: \"gk-xxx\",\n  integrationId: \"int_xxx\",\n  botToken: \"xoxb-xxx\",\n  appToken: \"xapp-xxx\",\n});\n\nwatcher.on(\"ready\", (botUserId, botName, teamName) => {\n  console.log(`Slack connected: ${botName} in ${teamName}`);\n});\n\n// Every message after GATE security processing\nwatcher.on(\"message\", (event, result) => {\n  console.log(`From: ${event.user}, Text: ${event.text}`);\n  console.log(`Security actions: ${result.securityActions}`);\n  console.log(`Blocked: ${result.blocked}`);\n});\n\nwatcher.on(\"reaction\", (event, result) => {\n  console.log(`Reaction: ${event.reaction} by ${event.user}`);\n});\n\nwatcher.on(\"action_result\", ({ action, success, error }) => {\n  console.log(`${action}: ${success ? \"done\" : error}`);\n});\n\nawait watcher.start();\n\n// Later...\nawait watcher.stop();\n```\n\n## SDK Events\n\n| Event | Args | Description |\n|---|---|---|\n| `ready` | `(botUserId, botName, teamName, teamId)` | Connected to Slack |\n| `message` | `(event, result)` | Message received and processed by GATE |\n| `reaction` | `(event, result)` | Reaction added, processed by GATE |\n| `member_joined` | `(event, result)` | Member joined a channel |\n| `mention` | `(event, result)` | Bot mentioned in a channel |\n| `action` | `(action)` | Outbound action received from GATE queue |\n| `action_result` | `({ actionId, action, success, result, error })` | Outbound action completed |\n| `gate_error` | `({ path, status, error })` | GATE API call failed |\n| `limit_reached` | `(type)` | Plan limit hit |\n| `disconnected` | `(reason)` | Disconnected from Slack |\n| `stopped` | — | Watcher fully shut down |\n\n## SDK Options\n\n| Option | Required | Default | Description |\n|---|---|---|---|\n| `gateKey` | Yes | — | Virtual key (`gk-xxx`) |\n| `integrationId` | Yes | — | Integration ID (`int_xxx`) |\n| `botToken` | Yes | — | Slack Bot User OAuth Token (`xoxb-...`) |\n| `appToken` | Yes | — | Slack App-Level Token for Socket Mode (`xapp-...`) |\n| `gateUrl` | No | `\"https://anuragate.com\"` | GATE cloud URL |\n| `heartbeatInterval` | No | `30000` | ms between heartbeats |\n| `pollInterval` | No | `3000` | ms between outbound polls |\n| `sessionId` | No | — | Session ID for multi-tenant use |\n| `sessionLabel` | No | — | Human-readable session label |\n| `sessionMetadata` | No | `{}` | Arbitrary metadata for the session |\n\n## Setup\n\n1. Go to [api.slack.com/apps](https://api.slack.com/apps) and create a new app\n2. Under **Socket Mode**, enable Socket Mode and generate an **App-Level Token** with `connections:write` scope — this is your `SLACK_APP_TOKEN` (`xapp-...`)\n3. Under **OAuth & Permissions**, add Bot Token Scopes: `chat:write`, `reactions:write`, `channels:history`, `groups:history`, `im:history`\n4. Install the app to your workspace and copy the **Bot User OAuth Token** — this is your `SLACK_BOT_TOKEN` (`xoxb-...`)\n5. Under **Event Subscriptions**, enable events and subscribe to: `message.channels`, `message.groups`, `message.im`, `reaction_added`, `member_joined_channel`, `app_mention`\n6. Go to **GATE Dashboard → Integrations → Add Integration**, select **Slack**, copy the **Integration ID**\n7. Copy your **Virtual Key** from the **Keys** page\n\n## Environment Variables\n\n| Variable | Required | Description |\n|---|---|---|\n| `GATE_KEY` | Yes | Your GATE virtual key |\n| `GATE_INTEGRATION_ID` | Yes | Integration ID from the dashboard |\n| `SLACK_BOT_TOKEN` | Yes | Bot User OAuth Token (`xoxb-...`) |\n| `SLACK_APP_TOKEN` | Yes | App-Level Token (`xapp-...`) |\n| `GATE_URL` | No | Custom GATE cloud URL |\n| `WEB_PORT` | No | Port for the dev dashboard (CLI only) |\n\n## Security model\n\n- Slack tokens stored in `.env` on YOUR machine\n- GATE cloud never sees or stores your credentials\n- All message content passes through GATE's security pipeline\n- Billing, limits, and security enforced server-side\n","readmeFilename":"README.md","homepage":"https://anuragate.com","repository":{"type":"git","url":"git+https://github.com/ahmad-ajmal/AnuraGate_Sample.git"},"bugs":{"url":"https://github.com/ahmad-ajmal/AnuraGate_Sample/issues"}}