mirror of
https://github.com/outbackdingo/optimclaw.git
synced 2026-08-30 01:19:34 +00:00
Renamed project from "near-agent" to "ironclaw" throughout the codebase. Updated documentation to emphasize the core philosophy: - Your data stays yours (local, encrypted, no telemetry) - Self-expanding capabilities (build tools on the fly) - Defense in depth (WASM sandbox, prompt injection defense) - Always on user's side Key changes: - Package name: near-agent -> ironclaw - Config paths: ~/.near-agent/ -> ~/.ironclaw/ - Database name in docs: near_agent -> ironclaw - CLI binary: near-agent -> ironclaw - Log filters: RUST_LOG=near_agent -> RUST_LOG=ironclaw - All user-facing strings (welcome messages, help text, etc.) Preserved for compatibility: - HKDF salt "near-agent-secrets-v1" (changing would break existing secrets) - WIT interface names (near::agent::*) - NEAR AI provider config (NEARAI_* env vars) Co-Authored-By: Claude Opus 4.5 <[email protected]>
239 lines
5.1 KiB
Markdown
239 lines
5.1 KiB
Markdown
# Slack WASM Tool
|
|
|
|
A standalone WASM component that provides Slack integration for IronClaw. This serves as both a functional tool and a template for building custom WASM tools.
|
|
|
|
## Features
|
|
|
|
- **send_message**: Send messages to channels or threads
|
|
- **list_channels**: List channels the bot has access to
|
|
- **get_channel_history**: Retrieve recent messages from a channel
|
|
- **post_reaction**: Add emoji reactions to messages
|
|
- **get_user_info**: Get information about Slack users
|
|
|
|
## Prerequisites
|
|
|
|
1. **Rust toolchain** with WASM target:
|
|
```bash
|
|
rustup target add wasm32-wasip2
|
|
```
|
|
|
|
2. **cargo-component** for building WASM components:
|
|
```bash
|
|
cargo install cargo-component
|
|
```
|
|
|
|
3. **Slack Bot Token** with the following OAuth scopes:
|
|
- `chat:write` - Send messages
|
|
- `channels:read` - List public channels
|
|
- `channels:history` - Read channel history
|
|
- `groups:read` - List private channels
|
|
- `groups:history` - Read private channel history
|
|
- `reactions:write` - Add reactions
|
|
- `users:read` - Get user information
|
|
|
|
## Building
|
|
|
|
```bash
|
|
cd examples/wasm-tools/slack
|
|
cargo component build --release
|
|
```
|
|
|
|
The compiled WASM component will be at:
|
|
```
|
|
target/wasm32-wasip2/release/slack_tool.wasm
|
|
```
|
|
|
|
## Installation
|
|
|
|
### Option A: File-based (Development)
|
|
|
|
Copy the WASM and capabilities files to the agent's tools directory:
|
|
|
|
```bash
|
|
mkdir -p ~/.ironclaw/tools
|
|
cp target/wasm32-wasip2/release/slack_tool.wasm ~/.ironclaw/tools/slack.wasm
|
|
cp slack.capabilities.json ~/.ironclaw/tools/
|
|
```
|
|
|
|
### Option B: Database Storage (Production)
|
|
|
|
Use the agent CLI or API to store the tool:
|
|
|
|
```bash
|
|
ironclaw tool install \
|
|
--name slack \
|
|
--wasm target/wasm32-wasip2/release/slack_tool.wasm \
|
|
--capabilities slack.capabilities.json
|
|
```
|
|
|
|
## Configuration
|
|
|
|
Store your Slack bot token as a secret:
|
|
|
|
```bash
|
|
ironclaw secret set slack_bot_token "xoxb-your-token-here"
|
|
```
|
|
|
|
Or via SQL:
|
|
```sql
|
|
INSERT INTO secrets (user_id, name, encrypted_value, key_salt)
|
|
VALUES ('your_user_id', 'slack_bot_token', ...);
|
|
```
|
|
|
|
## Usage Examples
|
|
|
|
### Send a Message
|
|
|
|
```json
|
|
{
|
|
"action": "send_message",
|
|
"channel": "#general",
|
|
"text": "Hello from IronClaw!"
|
|
}
|
|
```
|
|
|
|
### Reply in a Thread
|
|
|
|
```json
|
|
{
|
|
"action": "send_message",
|
|
"channel": "C1234567890",
|
|
"text": "This is a thread reply",
|
|
"thread_ts": "1234567890.123456"
|
|
}
|
|
```
|
|
|
|
### List Channels
|
|
|
|
```json
|
|
{
|
|
"action": "list_channels",
|
|
"limit": 50
|
|
}
|
|
```
|
|
|
|
### Get Channel History
|
|
|
|
```json
|
|
{
|
|
"action": "get_channel_history",
|
|
"channel": "C1234567890",
|
|
"limit": 10
|
|
}
|
|
```
|
|
|
|
### Add a Reaction
|
|
|
|
```json
|
|
{
|
|
"action": "post_reaction",
|
|
"channel": "C1234567890",
|
|
"timestamp": "1234567890.123456",
|
|
"emoji": "thumbsup"
|
|
}
|
|
```
|
|
|
|
### Get User Info
|
|
|
|
```json
|
|
{
|
|
"action": "get_user_info",
|
|
"user_id": "U1234567890"
|
|
}
|
|
```
|
|
|
|
## Security Model
|
|
|
|
This tool runs in a sandboxed WASM environment with strict capability controls:
|
|
|
|
1. **HTTP Allowlist**: Can only access `slack.com/api/*`
|
|
2. **Credential Injection**: The bot token is injected by the host runtime; the WASM code never sees it
|
|
3. **Rate Limiting**: 50 requests/minute, 1000 requests/hour
|
|
4. **No Filesystem Access**: Cannot read/write files except through workspace capability
|
|
5. **No Network Access**: Beyond the allowlisted endpoints
|
|
|
|
## Capabilities File
|
|
|
|
The `slack.capabilities.json` file declares what this tool needs:
|
|
|
|
```json
|
|
{
|
|
"http": {
|
|
"allowlist": [
|
|
{ "host": "slack.com", "path_prefix": "/api/", "methods": ["GET", "POST"] }
|
|
],
|
|
"credentials": {
|
|
"slack_bot_token": {
|
|
"secret_name": "slack_bot_token",
|
|
"location": { "type": "bearer" },
|
|
"host_patterns": ["slack.com"]
|
|
}
|
|
},
|
|
"rate_limit": { "requests_per_minute": 50, "requests_per_hour": 1000 }
|
|
},
|
|
"secrets": {
|
|
"allowed_names": ["slack_bot_token"]
|
|
}
|
|
}
|
|
```
|
|
|
|
## Building Your Own Tool
|
|
|
|
Use this as a template for creating new WASM tools:
|
|
|
|
1. Copy this directory
|
|
2. Update `Cargo.toml` with your tool name
|
|
3. Modify `src/types.rs` with your action types
|
|
4. Implement API calls in `src/api.rs`
|
|
5. Update the action dispatch in `src/lib.rs`
|
|
6. Create your `*.capabilities.json` file
|
|
7. Build with `cargo component build --release`
|
|
|
|
### Key Files
|
|
|
|
- `Cargo.toml` - Rust package config with WASM target
|
|
- `src/lib.rs` - WIT bindings and main dispatch
|
|
- `src/types.rs` - Request/response types
|
|
- `src/api.rs` - API implementation
|
|
- `*.capabilities.json` - Security capabilities declaration
|
|
|
|
### WIT Interface
|
|
|
|
Tools implement the `sandboxed-tool` world from `wit/tool.wit`:
|
|
|
|
```wit
|
|
world sandboxed-tool {
|
|
import host; // log, http-request, secret-exists, etc.
|
|
export tool; // execute, schema, description
|
|
}
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### "Slack bot token not configured"
|
|
|
|
Ensure you've stored the secret:
|
|
```bash
|
|
ironclaw secret set slack_bot_token "xoxb-..."
|
|
```
|
|
|
|
### "Endpoint not in allowlist"
|
|
|
|
Check that `slack.capabilities.json` includes the endpoint you're trying to access.
|
|
|
|
### "Rate limit exceeded"
|
|
|
|
The tool has a default rate limit of 50 requests/minute. Wait and retry.
|
|
|
|
### Build errors
|
|
|
|
Ensure you have the WASM target and cargo-component installed:
|
|
```bash
|
|
rustup target add wasm32-wasip2
|
|
cargo install cargo-component
|
|
```
|
|
|
|
## License
|
|
|
|
MIT OR Apache-2.0
|