Adds .pi/extensions/slack/ with Socket Mode bridge, allowlist gating, and 4 LLM-callable tools (slack_post/reply/react/upload). Inbound messages bridge into pi.sendUserMessage() with ctx.isIdle() guard; turn_end posts the assistant's reply back to Slack via SlackContext. session_shutdown tears down the Socket Mode connection. Customizations preserved from portfolio-advisor reference: - threadTs field on event types (7 sites in events.ts) - threadParent routing in createSlackContext (context.ts:45) - exported parseEventContent + buildSyntheticEvent Tests: 27 new (3 files); 78 pre-existing tests still green; 114 total. Plan: .claude/plans/context-study-https-github-com-ryaneggz-binary-hartmanis.md Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
54 lines
1.1 KiB
JSON
54 lines
1.1 KiB
JSON
{
|
|
"display_information": {
|
|
"name": "Open Harness",
|
|
"description": "AI coding agent interface for Open Harness sandboxes",
|
|
"background_color": "#1a1a2e"
|
|
},
|
|
"features": {
|
|
"app_home": {
|
|
"home_tab_enabled": false,
|
|
"messages_tab_enabled": true,
|
|
"messages_tab_read_only_enabled": false
|
|
},
|
|
"bot_user": {
|
|
"display_name": "OpenHarness",
|
|
"always_online": true
|
|
}
|
|
},
|
|
"oauth_config": {
|
|
"scopes": {
|
|
"bot": [
|
|
"app_mentions:read",
|
|
"channels:history",
|
|
"channels:read",
|
|
"chat:write",
|
|
"files:read",
|
|
"files:write",
|
|
"groups:history",
|
|
"groups:read",
|
|
"im:history",
|
|
"im:read",
|
|
"im:write",
|
|
"reactions:read",
|
|
"users:read"
|
|
]
|
|
}
|
|
},
|
|
"settings": {
|
|
"event_subscriptions": {
|
|
"bot_events": [
|
|
"app_mention",
|
|
"message.channels",
|
|
"message.groups",
|
|
"message.im"
|
|
]
|
|
},
|
|
"interactivity": {
|
|
"is_enabled": false
|
|
},
|
|
"org_deploy_enabled": false,
|
|
"socket_mode_enabled": true,
|
|
"token_rotation_enabled": false
|
|
}
|
|
}
|