@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.
- package/README.md +224 -0
- package/dist/admin.d.ts +25 -0
- package/dist/admin.js +109 -0
- package/dist/admin.js.map +1 -0
- package/dist/app.d.ts +7 -0
- package/dist/app.js +18 -0
- package/dist/app.js.map +1 -0
- package/dist/bot.d.ts +15 -0
- package/dist/bot.js +42 -0
- package/dist/bot.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +21 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +151 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/config.d.ts +18 -0
- package/dist/config.js +41 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +15 -0
- package/dist/context.js +36 -0
- package/dist/context.js.map +1 -0
- package/dist/events/app-mention.d.ts +3 -0
- package/dist/events/app-mention.js +66 -0
- package/dist/events/app-mention.js.map +1 -0
- package/dist/events/message.d.ts +3 -0
- package/dist/events/message.js +48 -0
- package/dist/events/message.js.map +1 -0
- package/dist/gateway/chat-client.d.ts +14 -0
- package/dist/gateway/chat-client.js +159 -0
- package/dist/gateway/chat-client.js.map +1 -0
- package/dist/handlers/reply.d.ts +4 -0
- package/dist/handlers/reply.js +4 -0
- package/dist/handlers/reply.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +84 -0
- package/dist/plugin.js +98 -0
- package/dist/plugin.js.map +1 -0
- package/dist/router.d.ts +11 -0
- package/dist/router.js +40 -0
- package/dist/router.js.map +1 -0
- package/dist/subagents/index.d.ts +7 -0
- package/dist/subagents/index.js +10 -0
- package/dist/subagents/index.js.map +1 -0
- package/dist/subagents/openclaw-gateway.d.ts +7 -0
- package/dist/subagents/openclaw-gateway.js +30 -0
- package/dist/subagents/openclaw-gateway.js.map +1 -0
- package/dist/subagents/types.d.ts +6 -0
- package/dist/subagents/types.js +2 -0
- package/dist/subagents/types.js.map +1 -0
- package/dist/types.d.ts +28 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/openclaw.plugin.json +17 -0
- 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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"}
|
package/dist/router.d.ts
ADDED
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/subagents/types.ts"],"names":[],"mappings":""}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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
|
+
}
|