@aigne/afs-mattermost 1.11.0-beta.12
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/LICENSE.md +26 -0
- package/dist/index.cjs +487 -0
- package/dist/index.d.cts +159 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +159 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +488 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/client.ts","../src/index.ts"],"sourcesContent":["/**\n * MattermostClient — pure Mattermost REST API wrapper.\n *\n * Zero external dependencies (uses native fetch).\n * No AFS or application-specific concepts.\n * WebSocket is handled by the provider, not the client.\n */\n\nconst DEFAULT_API_BASE = \"https://mattermost.example.com/api/v4\";\nconst DEFAULT_TIMEOUT = 30_000;\n\nexport interface MattermostClientOptions {\n token: string;\n apiBase?: string;\n timeout?: number;\n}\n\n/** Mattermost post object (subset). */\nexport interface MattermostPost {\n id: string;\n channel_id: string;\n user_id: string;\n message: string;\n create_at: number;\n update_at?: number;\n root_id?: string;\n type?: string;\n}\n\n/** Mattermost user object (subset). */\nexport interface MattermostUser {\n id: string;\n username: string;\n email?: string;\n first_name?: string;\n last_name?: string;\n nickname?: string;\n roles?: string;\n}\n\n/** Mattermost WebSocket event envelope. */\nexport interface MattermostWSEvent {\n event: string;\n data: Record<string, unknown>;\n broadcast?: {\n channel_id?: string;\n team_id?: string;\n user_id?: string;\n };\n seq: number;\n}\n\nexport class MattermostClient {\n private readonly _token: string;\n private readonly _apiBase: string;\n private readonly _timeout: number;\n\n constructor(options: MattermostClientOptions) {\n if (!options.token) throw new Error(\"MattermostClient requires a token\");\n this._token = options.token;\n this._apiBase = options.apiBase ?? DEFAULT_API_BASE;\n this._timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n // --- API Methods ---\n\n async sendMessage(channelId: string, text: string): Promise<MattermostPost> {\n return this._call(\"POST\", \"/posts\", {\n channel_id: channelId,\n message: text,\n });\n }\n\n async sendTyping(channelId: string): Promise<void> {\n await this._call(\"POST\", \"/users/me/typing\", { channel_id: channelId });\n }\n\n async getCurrentUser(): Promise<MattermostUser> {\n return this._call(\"GET\", \"/users/me\");\n }\n\n // --- Internal ---\n\n private async _call(method: string, path: string, body?: Record<string, unknown>): Promise<any> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this._token}`,\n };\n const init: RequestInit = {\n method,\n headers,\n signal: AbortSignal.timeout(this._timeout),\n };\n\n if (body) {\n headers[\"Content-Type\"] = \"application/json\";\n init.body = JSON.stringify(body);\n }\n\n const response = await fetch(`${this._apiBase}${path}`, init);\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n const desc = text.replace(this._token, \"***\");\n throw new Error(`Mattermost API error ${response.status}: ${desc}`);\n }\n\n return response.json();\n }\n}\n","/**\n * AFSMattermost — AFS provider for Mattermost API.\n *\n * Extends BaseMessageProvider (Plan 9 model).\n * Path structure (from base):\n * / -> List bots\n * /:botName/ctl -> Bot status\n * /:botName/conversations/:convId/messages -> List messages\n * /:botName/conversations/:convId/messages/:msgId -> Read message\n *\n * Additional Mattermost actions:\n * /.actions/start -> Connect to Mattermost WebSocket\n * /.actions/stop -> Disconnect from WebSocket\n * /.actions/process-event -> Inject event externally\n *\n * Standard events (from base):\n * messaging:message -> Inbound text message\n * messaging:command -> Inbound /command\n *\n * Mattermost WebSocket:\n * Connects to ws://host/api/v4/websocket\n * Auth: send {\"seq\": 1, \"action\": \"authentication_challenge\", \"data\": {\"token\": \"...\"}}\n * Events: {\"event\": \"posted\", \"data\": {\"post\": \"{json}\", \"channel_id\": \"...\"}}\n */\n\nimport type { AFSExecResult, AFSListResult, ProviderTreeSchema } from \"@aigne/afs\";\nimport { Actions, type RouteContext } from \"@aigne/afs/provider\";\nimport type {\n BotConfig,\n BufferedMessage,\n MessageCapabilities,\n MessageSender,\n SendOptions,\n} from \"@aigne/afs-messaging\";\nimport { BaseMessageProvider } from \"@aigne/afs-messaging\";\nimport { MattermostClient, type MattermostPost, type MattermostWSEvent } from \"./client.js\";\n\nexport type {\n MattermostClient,\n MattermostPost,\n MattermostUser,\n MattermostWSEvent,\n} from \"./client.js\";\n\nexport interface AFSMattermostOptions {\n /** Multi-bot config */\n bots?: Array<{\n name: string;\n token: string;\n conversations?: string[];\n apiBase?: string;\n }>;\n /** Single-bot shorthand: token */\n token?: string;\n /** Single-bot shorthand: channel IDs to monitor */\n channels?: string[];\n apiBase?: string;\n bufferSize?: number;\n}\n\ninterface WebSocketState {\n ws: WebSocket | null;\n connected: boolean;\n disposed: boolean;\n seq: number;\n heartbeatTimer: ReturnType<typeof setInterval> | null;\n backoff: number;\n}\n\nexport class AFSMattermost extends BaseMessageProvider {\n static manifest() {\n return {\n name: \"mattermost\",\n description:\n \"Mattermost messaging — bidirectional via WebSocket events.\\n- Self-hosted team messaging with REST + WebSocket API\\n- Multi-bot support with per-bot channel monitoring\\n- Path: /:bot/conversations/:channelId/messages/:msgId\",\n uriTemplate: \"mattermost://{serverUrl}\",\n category: \"messaging\",\n schema: {\n type: \"object\",\n properties: {\n serverUrl: { type: \"string\", description: \"Mattermost server URL\" },\n token: {\n type: \"string\",\n description: \"Personal access token or bot token\",\n sensitive: true,\n },\n channels: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Channel IDs to monitor\",\n },\n },\n required: [\"serverUrl\", \"token\"],\n },\n tags: [\"mattermost\", \"messaging\", \"chat\", \"self-hosted\"],\n capabilityTags: [\n \"read-write\",\n \"crud\",\n \"search\",\n \"auth:token\",\n \"remote\",\n \"http\",\n \"on-premise\",\n \"real-time\",\n ],\n security: {\n riskLevel: \"external\",\n resourceAccess: [\"internet\"],\n notes: [\"Connects to self-hosted Mattermost instance — requires access token\"],\n },\n capabilities: {\n network: { egress: true },\n },\n };\n }\n\n static treeSchema(): ProviderTreeSchema {\n return {\n operations: [\"list\", \"read\", \"exec\", \"stat\", \"explain\"],\n tree: {\n \"/\": {\n kind: \"messaging:root\",\n operations: [\"list\", \"exec\"],\n actions: [\"add-bot\", \"remove-bot\", \"start\", \"stop\", \"process-event\"],\n },\n \"/{bot}\": { kind: \"messaging:bot\", operations: [\"list\", \"read\"] },\n \"/{bot}/ctl\": { kind: \"messaging:status\", operations: [\"read\"] },\n \"/{bot}/conversations\": { kind: \"messaging:conversations\", operations: [\"list\"] },\n \"/{bot}/conversations/{convId}\": { kind: \"messaging:conversation\", operations: [\"list\"] },\n \"/{bot}/conversations/{convId}/messages\": {\n kind: \"messaging:messages\",\n operations: [\"list\", \"exec\"],\n actions: [\"send\"],\n },\n \"/{bot}/conversations/{convId}/messages/{msgId}\": {\n kind: \"messaging:message\",\n operations: [\"read\"],\n },\n },\n auth: { type: \"token\", env: [\"MATTERMOST_TOKEN\"] },\n bestFor: [\"self-hosted chat\", \"team messaging\", \"devops alerts\"],\n notFor: [\"file storage\", \"database queries\"],\n };\n }\n\n readonly providerName = \"mattermost\";\n readonly eventPrefix = \"mattermost\";\n\n private readonly _wsStates = new Map<string, WebSocketState>();\n\n constructor(options: AFSMattermostOptions) {\n let bots: BotConfig[];\n if (options.bots) {\n bots = options.bots;\n for (const bot of bots) {\n if (!bot.token) throw new Error(`AFSMattermost bot \"${bot.name}\" requires a token`);\n }\n } else {\n if (!options.token) throw new Error(\"AFSMattermost requires a token\");\n bots = [\n {\n name: \"default\",\n token: options.token,\n conversations: options.channels ?? [],\n apiBase: options.apiBase,\n },\n ];\n }\n\n super({ bots, bufferSize: options.bufferSize });\n\n for (const bot of bots) {\n this._wsStates.set(bot.name, {\n ws: null,\n connected: false,\n disposed: false,\n seq: 1,\n heartbeatTimer: null,\n backoff: 1000,\n });\n }\n }\n\n // --- Abstract Implementation ---\n\n getMessageCapabilities(): MessageCapabilities {\n return {\n formats: {\n send: [\"text\", \"markdown\"],\n receive: [\"text\"],\n },\n maxMessageLength: 16383,\n features: {\n edit: true,\n delete: true,\n reply: true,\n thread: true,\n reaction: true,\n inlineKeyboard: false,\n },\n limits: {\n messagesPerSecond: 10,\n },\n };\n }\n\n createBotClient(config: BotConfig): MattermostClient {\n return new MattermostClient({\n token: config.token as string,\n apiBase: config.apiBase as string | undefined,\n });\n }\n\n async sendMessage(\n client: unknown,\n convId: string,\n text: string,\n _opts?: SendOptions,\n ): Promise<{ messageId: string }> {\n const mc = client as MattermostClient;\n const result = await mc.sendMessage(convId, text);\n return { messageId: result.id };\n }\n\n async sendTypingIndicator(client: unknown, convId: string): Promise<void> {\n const mc = client as MattermostClient;\n await mc.sendTyping(convId);\n }\n\n normalizeMessage(raw: Record<string, unknown>): BufferedMessage {\n const msg = raw as unknown as MattermostPost;\n return {\n id: msg.id ?? \"0\",\n text: String(msg.message ?? \"\"),\n from: this.normalizeSender({ id: msg.user_id } as Record<string, unknown>),\n timestamp: msg.create_at ? Math.floor(msg.create_at / 1000) : Math.floor(Date.now() / 1000),\n conversationId: String(msg.channel_id ?? \"\"),\n platform: { root_id: msg.root_id },\n };\n }\n\n normalizeSender(raw: Record<string, unknown>): MessageSender {\n return {\n id: String(raw.id ?? \"0\"),\n name: String(raw.username ?? raw.name ?? \"\"),\n isBot: raw.is_bot as boolean | undefined,\n };\n }\n\n // --- Lifecycle ---\n\n start(botName?: string): void {\n const names = botName ? [botName] : [...this._wsStates.keys()];\n for (const name of names) {\n const state = this._wsStates.get(name);\n if (!state || state.connected || state.disposed) continue;\n this._connectWebSocket(name);\n }\n }\n\n stop(botName?: string): void {\n const names = botName ? [botName] : [...this._wsStates.keys()];\n for (const name of names) {\n this._disconnectWebSocket(name);\n }\n }\n\n dispose(): void {\n for (const name of this._wsStates.keys()) {\n const state = this._wsStates.get(name)!;\n state.disposed = true;\n this._disconnectWebSocket(name);\n }\n }\n\n // --- Mattermost-specific Actions ---\n\n @Actions(\"/\")\n async listRootActions(_ctx: RouteContext): Promise<AFSListResult> {\n return {\n data: [\n this.buildEntry(\"/.actions/add-bot\", {\n meta: { description: \"Add a bot instance at runtime\" },\n }),\n this.buildEntry(\"/.actions/remove-bot\", {\n meta: { description: \"Remove a bot instance\" },\n }),\n this.buildEntry(\"/.actions/start\", {\n meta: { description: \"Connect to Mattermost WebSocket\" },\n }),\n this.buildEntry(\"/.actions/stop\", {\n meta: { description: \"Disconnect from WebSocket\" },\n }),\n this.buildEntry(\"/.actions/process-event\", {\n meta: { description: \"Inject a Mattermost event externally\" },\n }),\n ],\n };\n }\n\n @Actions.Exec(\"/\", \"start\")\n async execStart(_ctx: RouteContext): Promise<AFSExecResult> {\n this.start();\n return { success: true, data: { ok: true, websocket: true } };\n }\n\n @Actions.Exec(\"/\", \"stop\")\n async execStop(_ctx: RouteContext): Promise<AFSExecResult> {\n this.stop();\n return { success: true, data: { ok: true, websocket: false } };\n }\n\n @Actions.Exec(\"/\", \"process-event\")\n async execProcessEvent(\n _ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n this._processEvent(args);\n return { success: true, data: { ok: true } };\n }\n\n // --- WebSocket Connection ---\n\n private async _connectWebSocket(botName: string): Promise<void> {\n const state = this._wsStates.get(botName);\n if (!state || state.disposed) return;\n\n const botConfig = this._pendingBots?.find((b: BotConfig) => b.name === botName);\n const token = botConfig?.token as string;\n const apiBase = (botConfig?.apiBase as string) ?? \"https://mattermost.example.com/api/v4\";\n if (!token) return;\n\n try {\n // Derive WebSocket URL from API base\n const wsBase = apiBase.replace(/^http/, \"ws\").replace(/\\/api\\/v4$/, \"\");\n const wsUrl = `${wsBase}/api/v4/websocket`;\n const ws = new WebSocket(wsUrl);\n state.ws = ws;\n\n ws.onopen = () => {\n // Send authentication challenge\n state.ws?.send(\n JSON.stringify({\n seq: state.seq++,\n action: \"authentication_challenge\",\n data: { token },\n }),\n );\n state.connected = true;\n state.backoff = 1000;\n };\n\n ws.onmessage = (event) => {\n try {\n const payload = JSON.parse(String(event.data));\n this._handleWSEvent(botName, payload);\n } catch {\n // Ignore malformed payloads\n }\n };\n\n ws.onclose = () => {\n this._cleanupWebSocket(botName);\n if (!state.disposed) {\n setTimeout(() => this._connectWebSocket(botName), state.backoff);\n state.backoff = Math.min(state.backoff * 2, 60_000);\n }\n };\n\n ws.onerror = () => {\n // onclose will fire after onerror\n };\n } catch {\n if (!state.disposed) {\n setTimeout(() => this._connectWebSocket(botName), state.backoff);\n state.backoff = Math.min(state.backoff * 2, 60_000);\n }\n }\n }\n\n private _handleWSEvent(botName: string, payload: MattermostWSEvent): void {\n const state = this._wsStates.get(botName);\n if (!state) return;\n\n if (payload.event === \"posted\") {\n const postStr = payload.data.post as string;\n if (!postStr) return;\n\n let post: MattermostPost;\n try {\n post = JSON.parse(postStr);\n } catch {\n return;\n }\n\n const text = String(post.message ?? \"\").trim();\n if (!text) return;\n\n // Skip system messages\n if (post.type && post.type !== \"\") return;\n\n const channelId = String(post.channel_id ?? payload.broadcast?.channel_id ?? \"\");\n\n this.emitMessageReceived(botName, {\n id: String(post.id),\n text,\n from: this.normalizeSender({\n id: post.user_id,\n }),\n timestamp: post.create_at\n ? Math.floor(post.create_at / 1000)\n : Math.floor(Date.now() / 1000),\n conversationId: channelId,\n platform: { root_id: post.root_id },\n });\n }\n }\n\n private _disconnectWebSocket(botName: string): void {\n const state = this._wsStates.get(botName);\n if (!state) return;\n if (state.heartbeatTimer) {\n clearInterval(state.heartbeatTimer);\n state.heartbeatTimer = null;\n }\n if (state.ws) {\n state.ws.onclose = null;\n state.ws.onmessage = null;\n state.ws.onerror = null;\n state.ws.close();\n state.ws = null;\n }\n state.connected = false;\n }\n\n private _cleanupWebSocket(botName: string): void {\n const state = this._wsStates.get(botName);\n if (!state) return;\n if (state.heartbeatTimer) {\n clearInterval(state.heartbeatTimer);\n state.heartbeatTimer = null;\n }\n state.ws = null;\n state.connected = false;\n }\n\n // --- External Event Injection ---\n\n /** Process an externally-provided Mattermost event. Public for testing. */\n _processEvent(payload: Record<string, unknown>): void {\n const botName = (payload.botName as string) ?? this._botOrder[0] ?? \"default\";\n const event = payload.event as string;\n const data = (payload.data ?? payload) as Record<string, unknown>;\n\n if (event === \"posted\" || data.message !== undefined) {\n // Handle wrapped format (event + data.post as JSON string)\n let post: Record<string, unknown>;\n if (typeof data.post === \"string\") {\n try {\n post = JSON.parse(data.post);\n } catch {\n return;\n }\n } else if (data.post && typeof data.post === \"object\") {\n post = data.post as Record<string, unknown>;\n } else {\n // Shorthand format: data itself is the post\n post = data;\n }\n\n const text = String(post.message ?? \"\").trim();\n if (!text) return;\n\n // Skip system messages\n if (post.type && post.type !== \"\") return;\n\n const channelId = String(post.channel_id ?? (payload.broadcast as any)?.channel_id ?? \"\");\n\n this.emitMessageReceived(botName, {\n id: String(post.id ?? Date.now()),\n text,\n from: this.normalizeSender({\n id: post.user_id ?? \"0\",\n username: post.username ?? \"\",\n }),\n timestamp: post.create_at\n ? Math.floor((post.create_at as number) / 1000)\n : Math.floor(Date.now() / 1000),\n conversationId: channelId,\n platform: { root_id: post.root_id },\n });\n }\n }\n\n // --- Convenience Methods (test helpers) ---\n\n /** Add a channel to a bot. Defaults to first bot. */\n addChannel(channelId: string, botName?: string): void {\n const name = botName ?? this._botOrder[0];\n if (!name) return;\n const convs = this._botConversations.get(name);\n if (!convs || convs.has(channelId)) return;\n convs.add(channelId);\n const buffers = this._botBuffers.get(name);\n if (buffers && !buffers.has(channelId)) {\n buffers.set(channelId, []);\n }\n }\n\n /** Remove a channel from a bot. */\n removeChannel(channelId: string, botName?: string): void {\n const name = botName ?? this._botOrder[0];\n if (!name) return;\n const convs = this._botConversations.get(name);\n if (convs) convs.delete(channelId);\n const buffers = this._botBuffers.get(name);\n if (buffers) buffers.delete(channelId);\n }\n\n /** Add a message to the ring buffer directly. Public for testing/conformance. */\n _addToBuffer(\n channelId: string,\n msg: {\n id: string;\n message: string;\n user_id: string;\n username?: string;\n create_at?: number;\n },\n ): void {\n const botName = this._botOrder[0] ?? \"default\";\n\n const convs = this._botConversations.get(botName);\n if (convs && !convs.has(channelId)) {\n convs.add(channelId);\n }\n\n let botBuffers = this._botBuffers.get(botName);\n if (!botBuffers) {\n botBuffers = new Map();\n this._botBuffers.set(botName, botBuffers);\n }\n let buffer = botBuffers.get(channelId);\n if (!buffer) {\n buffer = [];\n botBuffers.set(channelId, buffer);\n }\n buffer.push({\n id: msg.id,\n text: msg.message,\n from: { id: msg.user_id, name: msg.username ?? \"\" },\n timestamp: msg.create_at ? Math.floor(msg.create_at / 1000) : Math.floor(Date.now() / 1000),\n conversationId: channelId,\n platform: {},\n });\n while (buffer.length > this._bufferSize) {\n buffer.shift();\n }\n }\n}\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aigne/afs-mattermost",
|
|
3
|
+
"version": "1.11.0-beta.12",
|
|
4
|
+
"description": "AIGNE AFS provider for Mattermost",
|
|
5
|
+
"license": "UNLICENSED",
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"author": "Arcblock <blocklet@arcblock.io> https://github.com/arcblock",
|
|
10
|
+
"homepage": "https://github.com/arcblock/afs",
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/arcblock/afs"
|
|
14
|
+
},
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/arcblock/afs/issues"
|
|
17
|
+
},
|
|
18
|
+
"type": "module",
|
|
19
|
+
"main": "./dist/index.cjs",
|
|
20
|
+
"module": "./dist/index.mjs",
|
|
21
|
+
"types": "./dist/index.d.cts",
|
|
22
|
+
"exports": {
|
|
23
|
+
".": {
|
|
24
|
+
"require": "./dist/index.cjs",
|
|
25
|
+
"import": "./dist/index.mjs"
|
|
26
|
+
},
|
|
27
|
+
"./*": "./*"
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"dist",
|
|
31
|
+
"LICENSE",
|
|
32
|
+
"README.md",
|
|
33
|
+
"CHANGELOG.md"
|
|
34
|
+
],
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@aigne/afs": "^1.11.0-beta.12",
|
|
37
|
+
"@aigne/afs-messaging": "^1.11.0-beta.12"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@types/bun": "^1.3.6",
|
|
41
|
+
"npm-run-all": "^4.1.5",
|
|
42
|
+
"rimraf": "^6.1.2",
|
|
43
|
+
"tsdown": "0.20.0-beta.3",
|
|
44
|
+
"typescript": "5.9.2",
|
|
45
|
+
"@aigne/scripts": "0.0.0",
|
|
46
|
+
"@aigne/typescript-config": "0.0.0",
|
|
47
|
+
"@aigne/afs-testing": "1.11.0-beta.12"
|
|
48
|
+
},
|
|
49
|
+
"scripts": {
|
|
50
|
+
"build": "tsdown",
|
|
51
|
+
"check-types": "tsc --noEmit",
|
|
52
|
+
"clean": "rimraf dist coverage",
|
|
53
|
+
"test": "bun test",
|
|
54
|
+
"test:coverage": "bun test --coverage --coverage-reporter=lcov --coverage-reporter=text"
|
|
55
|
+
}
|
|
56
|
+
}
|