@datanovallc/openclaw-slack-router 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +224 -0
  2. package/dist/admin.d.ts +25 -0
  3. package/dist/admin.js +109 -0
  4. package/dist/admin.js.map +1 -0
  5. package/dist/app.d.ts +7 -0
  6. package/dist/app.js +18 -0
  7. package/dist/app.js.map +1 -0
  8. package/dist/bot.d.ts +15 -0
  9. package/dist/bot.js +42 -0
  10. package/dist/bot.js.map +1 -0
  11. package/dist/cli.d.ts +2 -0
  12. package/dist/cli.js +21 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/commands/init.d.ts +1 -0
  15. package/dist/commands/init.js +151 -0
  16. package/dist/commands/init.js.map +1 -0
  17. package/dist/config.d.ts +18 -0
  18. package/dist/config.js +41 -0
  19. package/dist/config.js.map +1 -0
  20. package/dist/context.d.ts +15 -0
  21. package/dist/context.js +36 -0
  22. package/dist/context.js.map +1 -0
  23. package/dist/events/app-mention.d.ts +3 -0
  24. package/dist/events/app-mention.js +66 -0
  25. package/dist/events/app-mention.js.map +1 -0
  26. package/dist/events/message.d.ts +3 -0
  27. package/dist/events/message.js +48 -0
  28. package/dist/events/message.js.map +1 -0
  29. package/dist/gateway/chat-client.d.ts +14 -0
  30. package/dist/gateway/chat-client.js +159 -0
  31. package/dist/gateway/chat-client.js.map +1 -0
  32. package/dist/handlers/reply.d.ts +4 -0
  33. package/dist/handlers/reply.js +4 -0
  34. package/dist/handlers/reply.js.map +1 -0
  35. package/dist/index.d.ts +1 -0
  36. package/dist/index.js +22 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/plugin.d.ts +84 -0
  39. package/dist/plugin.js +98 -0
  40. package/dist/plugin.js.map +1 -0
  41. package/dist/router.d.ts +11 -0
  42. package/dist/router.js +40 -0
  43. package/dist/router.js.map +1 -0
  44. package/dist/subagents/index.d.ts +7 -0
  45. package/dist/subagents/index.js +10 -0
  46. package/dist/subagents/index.js.map +1 -0
  47. package/dist/subagents/openclaw-gateway.d.ts +7 -0
  48. package/dist/subagents/openclaw-gateway.js +30 -0
  49. package/dist/subagents/openclaw-gateway.js.map +1 -0
  50. package/dist/subagents/types.d.ts +6 -0
  51. package/dist/subagents/types.js +2 -0
  52. package/dist/subagents/types.js.map +1 -0
  53. package/dist/types.d.ts +28 -0
  54. package/dist/types.js +2 -0
  55. package/dist/types.js.map +1 -0
  56. package/openclaw.plugin.json +17 -0
  57. package/package.json +57 -0
package/dist/plugin.js ADDED
@@ -0,0 +1,98 @@
1
+ import path from "node:path";
2
+ import { startSlackBot, stopSlackBot } from "./bot.js";
3
+ import { runInit } from "./commands/init.js";
4
+ const plugin = {
5
+ id: "@datanovallc/openclaw-slack-router",
6
+ name: "Slack Router",
7
+ description: "Connect openclaw to Slack with per-channel context isolation. Each Slack channel is an isolated project context — managed via chat.",
8
+ configSchema: {
9
+ jsonSchema: {
10
+ type: "object",
11
+ additionalProperties: false,
12
+ properties: {
13
+ botToken: {
14
+ type: "string",
15
+ description: "Slack bot OAuth token (xoxb-...)",
16
+ },
17
+ appToken: {
18
+ type: "string",
19
+ description: "Slack app-level token for Socket Mode (xapp-...)",
20
+ },
21
+ mainChannelId: {
22
+ type: "string",
23
+ description: "Channel ID of the admin channel where you manage project channels via chat",
24
+ },
25
+ gatewayUrl: {
26
+ type: "string",
27
+ description: "openclaw gateway WebSocket URL",
28
+ default: "ws://127.0.0.1:18789",
29
+ },
30
+ gatewayToken: {
31
+ type: "string",
32
+ description: "Gateway auth token (if your gateway requires one)",
33
+ },
34
+ },
35
+ required: ["botToken", "appToken"],
36
+ },
37
+ uiHints: {
38
+ botToken: { label: "Bot Token", sensitive: true, placeholder: "xoxb-..." },
39
+ appToken: {
40
+ label: "App Token (Socket Mode)",
41
+ sensitive: true,
42
+ placeholder: "xapp-...",
43
+ },
44
+ mainChannelId: {
45
+ label: "Main Channel ID",
46
+ help: "The admin channel where you create and manage project channels by chatting with the bot",
47
+ placeholder: "C...",
48
+ },
49
+ gatewayUrl: {
50
+ label: "Gateway URL",
51
+ placeholder: "ws://127.0.0.1:18789",
52
+ },
53
+ gatewayToken: {
54
+ label: "Gateway Token",
55
+ sensitive: true,
56
+ },
57
+ },
58
+ },
59
+ register(api) {
60
+ const pluginCfg = (api.pluginConfig ?? {});
61
+ api.registerService({
62
+ id: "openclaw-slack-router",
63
+ async start(ctx) {
64
+ const botToken = pluginCfg.botToken;
65
+ const appToken = pluginCfg.appToken;
66
+ if (!botToken || !appToken) {
67
+ ctx.logger.error("openclaw-slack-router: botToken and appToken are required. " +
68
+ "Run `openclaw slack setup` to configure them.");
69
+ return;
70
+ }
71
+ // Config file lives in the openclaw state directory so it persists across installs
72
+ const configPath = path.join(ctx.stateDir, "openclaw-slack-router.config.json");
73
+ await startSlackBot({
74
+ botToken,
75
+ appToken,
76
+ gatewayUrl: pluginCfg.gatewayUrl ??
77
+ process.env.OPENCLAW_GATEWAY_URL ??
78
+ "ws://127.0.0.1:18789",
79
+ gatewayToken: pluginCfg.gatewayToken,
80
+ configPath,
81
+ logger: ctx.logger,
82
+ });
83
+ },
84
+ stop: stopSlackBot,
85
+ });
86
+ api.registerCli((ctx) => {
87
+ const cmd = ctx.program
88
+ .command("slack")
89
+ .description("Slack router plugin commands");
90
+ cmd
91
+ .command("setup")
92
+ .description("Interactive setup wizard — configure tokens and main channel")
93
+ .action(runInit);
94
+ }, { commands: ["slack"] });
95
+ },
96
+ };
97
+ export default plugin;
98
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { SubagentConfig } from "./types.js";
2
+ export interface RouteResult {
3
+ agentName: string;
4
+ text: string;
5
+ }
6
+ export declare class UnknownAgentError extends Error {
7
+ readonly requestedAgent: string;
8
+ readonly availableAgents: string[];
9
+ constructor(requestedAgent: string, availableAgents: string[]);
10
+ }
11
+ export declare function resolveRoute(rawText: string, _botUserId: string, config: SubagentConfig): RouteResult;
package/dist/router.js ADDED
@@ -0,0 +1,40 @@
1
+ export class UnknownAgentError extends Error {
2
+ requestedAgent;
3
+ availableAgents;
4
+ constructor(requestedAgent, availableAgents) {
5
+ super(`Unknown agent "${requestedAgent}". Available agents: ${availableAgents.join(", ")}`);
6
+ this.requestedAgent = requestedAgent;
7
+ this.availableAgents = availableAgents;
8
+ this.name = "UnknownAgentError";
9
+ }
10
+ }
11
+ // Slack encodes mentions as <@UXXXXXX> — strip any leading mention
12
+ const MENTION_RE = /^<@[A-Z0-9]+>\s*/;
13
+ // /agentname message body
14
+ const SLASH_PREFIX_RE = /^\/(\w+)\s+([\s\S]*)$/;
15
+ // agentname: message body
16
+ const COLON_PREFIX_RE = /^(\w+):\s+([\s\S]*)$/;
17
+ export function resolveRoute(rawText, _botUserId, config) {
18
+ // Strip bot mention (present in app_mention, absent in DMs — regex is tolerant)
19
+ const text = rawText.replace(MENTION_RE, "").trim();
20
+ let agentName = null;
21
+ let message = text;
22
+ const slashMatch = text.match(SLASH_PREFIX_RE);
23
+ if (slashMatch) {
24
+ agentName = slashMatch[1].toLowerCase();
25
+ message = slashMatch[2].trim();
26
+ }
27
+ else {
28
+ const colonMatch = text.match(COLON_PREFIX_RE);
29
+ if (colonMatch) {
30
+ agentName = colonMatch[1].toLowerCase();
31
+ message = colonMatch[2].trim();
32
+ }
33
+ }
34
+ const resolvedName = agentName ?? config.defaultAgent;
35
+ if (!config.agents[resolvedName]) {
36
+ throw new UnknownAgentError(resolvedName, Object.keys(config.agents));
37
+ }
38
+ return { agentName: resolvedName, text: message };
39
+ }
40
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAExB;IACA;IAFlB,YACkB,cAAsB,EACtB,eAAyB;QAEzC,KAAK,CACH,kBAAkB,cAAc,wBAAwB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrF,CAAC;QALc,mBAAc,GAAd,cAAc,CAAQ;QACtB,oBAAe,GAAf,eAAe,CAAU;QAKzC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,mEAAmE;AACnE,MAAM,UAAU,GAAG,kBAAkB,CAAC;AACtC,0BAA0B;AAC1B,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAChD,0BAA0B;AAC1B,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAE/C,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,UAAkB,EAClB,MAAsB;IAEtB,gFAAgF;IAChF,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAEpD,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,OAAO,GAAG,IAAI,CAAC;IAEnB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC/C,IAAI,UAAU,EAAE,CAAC;QACf,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACxC,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC;SAAM,CAAC;QACN,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC/C,IAAI,UAAU,EAAE,CAAC;YACf,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACxC,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,SAAS,IAAI,MAAM,CAAC,YAAY,CAAC;IAEtD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,iBAAiB,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACpD,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { SubagentDefinition } from "./types.js";
2
+ export type SubagentRegistry = Record<string, SubagentDefinition>;
3
+ export interface RegistryOptions {
4
+ gatewayUrl: string;
5
+ gatewayToken?: string;
6
+ }
7
+ export declare function buildSubagentRegistry(options: RegistryOptions): SubagentRegistry;
@@ -0,0 +1,10 @@
1
+ import { createOpenclawGatewaySubagent } from "./openclaw-gateway.js";
2
+ export function buildSubagentRegistry(options) {
3
+ return {
4
+ default: createOpenclawGatewaySubagent({
5
+ gatewayUrl: options.gatewayUrl,
6
+ gatewayToken: options.gatewayToken,
7
+ }),
8
+ };
9
+ }
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/subagents/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAStE,MAAM,UAAU,qBAAqB,CAAC,OAAwB;IAC5D,OAAO;QACL,OAAO,EAAE,6BAA6B,CAAC;YACrC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;SACnC,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { SubagentDefinition } from "./types.js";
2
+ export interface OpenclawGatewaySubagentOptions {
3
+ gatewayUrl: string;
4
+ gatewayToken?: string;
5
+ timeoutMs?: number;
6
+ }
7
+ export declare function createOpenclawGatewaySubagent(options: OpenclawGatewaySubagentOptions): SubagentDefinition;
@@ -0,0 +1,30 @@
1
+ import { gatewayChatSend } from "../gateway/chat-client.js";
2
+ import { randomUUID } from "node:crypto";
3
+ export function createOpenclawGatewaySubagent(options) {
4
+ const { gatewayUrl, gatewayToken, timeoutMs } = options;
5
+ return {
6
+ name: "openclaw-gateway",
7
+ description: "Routes messages through the local openclaw gateway",
8
+ async handle(ctx) {
9
+ const chatOptions = {
10
+ url: gatewayUrl,
11
+ token: gatewayToken,
12
+ timeoutMs,
13
+ };
14
+ const idempotencyKey = randomUUID();
15
+ try {
16
+ const result = await gatewayChatSend(chatOptions, {
17
+ sessionKey: ctx.channelId,
18
+ message: ctx.currentMessage,
19
+ idempotencyKey,
20
+ });
21
+ return result.text;
22
+ }
23
+ catch (err) {
24
+ const errorMsg = err instanceof Error ? err.message : String(err);
25
+ return `[openclaw-gateway error] ${errorMsg}`;
26
+ }
27
+ },
28
+ };
29
+ }
30
+ //# sourceMappingURL=openclaw-gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-gateway.js","sourceRoot":"","sources":["../../src/subagents/openclaw-gateway.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQzC,MAAM,UAAU,6BAA6B,CAC3C,OAAuC;IAEvC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAExD,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,oDAAoD;QACjE,KAAK,CAAC,MAAM,CAAC,GAAoB;YAC/B,MAAM,WAAW,GAAuB;gBACtC,GAAG,EAAE,UAAU;gBACf,KAAK,EAAE,YAAY;gBACnB,SAAS;aACV,CAAC;YAEF,MAAM,cAAc,GAAG,UAAU,EAAE,CAAC;YAEpC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,WAAW,EAAE;oBAChD,UAAU,EAAE,GAAG,CAAC,SAAS;oBACzB,OAAO,EAAE,GAAG,CAAC,cAAc;oBAC3B,cAAc;iBACf,CAAC,CAAC;gBACH,OAAO,MAAM,CAAC,IAAI,CAAC;YACrB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,QAAQ,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAClE,OAAO,4BAA4B,QAAQ,EAAE,CAAC;YAChD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { SubagentContext } from "../types.js";
2
+ export interface SubagentDefinition {
3
+ name: string;
4
+ description: string;
5
+ handle(ctx: SubagentContext): Promise<string>;
6
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/subagents/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ export interface SubagentEntry {
2
+ name: string;
3
+ description: string;
4
+ }
5
+ export interface ChannelEntry {
6
+ name: string;
7
+ historyLimit?: number;
8
+ }
9
+ export interface HistoryMessage {
10
+ role: "user" | "assistant";
11
+ content: string;
12
+ }
13
+ export interface SubagentContext {
14
+ channelId: string;
15
+ userId: string;
16
+ threadTs: string;
17
+ currentMessage: string;
18
+ threadHistory: HistoryMessage[];
19
+ agentName: string;
20
+ }
21
+ export interface SubagentConfig {
22
+ botName: string;
23
+ mainChannelId: string | null;
24
+ introPosted: boolean;
25
+ defaultAgent: string;
26
+ agents: Record<string, SubagentEntry>;
27
+ channels: Record<string, ChannelEntry>;
28
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ {
2
+ "id": "@datanovallc/openclaw-slack-router",
3
+ "name": "Slack Router",
4
+ "description": "Connect openclaw to Slack with per-channel context isolation. Each Slack channel is an isolated project context — managed via chat.",
5
+ "configSchema": {
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "properties": {
9
+ "botToken": { "type": "string" },
10
+ "appToken": { "type": "string" },
11
+ "mainChannelId": { "type": "string" },
12
+ "gatewayUrl": { "type": "string", "default": "ws://127.0.0.1:18789" },
13
+ "gatewayToken": { "type": "string" }
14
+ },
15
+ "required": ["botToken", "appToken"]
16
+ }
17
+ }
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@datanovallc/openclaw-slack-router",
3
+ "version": "0.1.0",
4
+ "description": "Slack router plugin for openclaw — connect your agent to Slack with per-channel context isolation",
5
+ "keywords": [
6
+ "openclaw",
7
+ "slack",
8
+ "agent",
9
+ "router",
10
+ "bot"
11
+ ],
12
+ "homepage": "https://github.com/andrewtcrooks/openclaw-slack-router#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/andrewtcrooks/openclaw-slack-router/issues"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/andrewtcrooks/openclaw-slack-router.git"
19
+ },
20
+ "license": "MIT",
21
+ "author": "Andrew T. Crooks",
22
+ "type": "module",
23
+ "exports": {
24
+ ".": "./dist/plugin.js"
25
+ },
26
+ "main": "./dist/plugin.js",
27
+ "bin": {
28
+ "openclaw-slack-router": "dist/cli.js"
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "openclaw.plugin.json"
33
+ ],
34
+ "scripts": {
35
+ "dev": "tsx watch src/index.ts",
36
+ "build": "tsc",
37
+ "start": "node dist/index.js",
38
+ "typecheck": "tsc --noEmit",
39
+ "test": "vitest run --reporter=verbose",
40
+ "prepublishOnly": "npm run build"
41
+ },
42
+ "dependencies": {
43
+ "@inquirer/prompts": "^8.3.2",
44
+ "@slack/bolt": "^4.6.0",
45
+ "commander": "^14.0.3",
46
+ "dotenv": "^16.5.0",
47
+ "ws": "^8.20.0",
48
+ "zod": "^3.24.0"
49
+ },
50
+ "devDependencies": {
51
+ "@types/node": "latest",
52
+ "@types/ws": "^8.18.1",
53
+ "tsx": "^4.21.0",
54
+ "typescript": "^5.8.0",
55
+ "vitest": "^3.0.0"
56
+ }
57
+ }