@xpert-ai/plugin-community-wechat 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 (69) hide show
  1. package/README.md +353 -0
  2. package/dist/index.d.ts +20 -0
  3. package/dist/index.js +139 -0
  4. package/dist/lib/constants.d.ts +23 -0
  5. package/dist/lib/constants.js +23 -0
  6. package/dist/lib/conversation-user-key.d.ts +13 -0
  7. package/dist/lib/conversation-user-key.js +28 -0
  8. package/dist/lib/conversation.service.d.ts +215 -0
  9. package/dist/lib/conversation.service.js +1179 -0
  10. package/dist/lib/decorators.d.ts +2 -0
  11. package/dist/lib/decorators.js +3 -0
  12. package/dist/lib/entities/index.d.ts +4 -0
  13. package/dist/lib/entities/index.js +4 -0
  14. package/dist/lib/entities/wechat-personal-account.entity.d.ts +19 -0
  15. package/dist/lib/entities/wechat-personal-account.entity.js +83 -0
  16. package/dist/lib/entities/wechat-personal-conversation-binding.entity.d.ts +14 -0
  17. package/dist/lib/entities/wechat-personal-conversation-binding.entity.js +65 -0
  18. package/dist/lib/entities/wechat-personal-message-log.entity.d.ts +27 -0
  19. package/dist/lib/entities/wechat-personal-message-log.entity.js +108 -0
  20. package/dist/lib/entities/wechat-personal-trigger-binding.entity.d.ts +17 -0
  21. package/dist/lib/entities/wechat-personal-trigger-binding.entity.js +71 -0
  22. package/dist/lib/handoff/index.d.ts +4 -0
  23. package/dist/lib/handoff/index.js +4 -0
  24. package/dist/lib/handoff/wechat-personal-chat-callback.processor.d.ts +26 -0
  25. package/dist/lib/handoff/wechat-personal-chat-callback.processor.js +312 -0
  26. package/dist/lib/handoff/wechat-personal-chat-dispatch.service.d.ts +26 -0
  27. package/dist/lib/handoff/wechat-personal-chat-dispatch.service.js +187 -0
  28. package/dist/lib/handoff/wechat-personal-chat-run-state.service.d.ts +21 -0
  29. package/dist/lib/handoff/wechat-personal-chat-run-state.service.js +39 -0
  30. package/dist/lib/handoff/wechat-personal-chat.types.d.ts +69 -0
  31. package/dist/lib/handoff/wechat-personal-chat.types.js +2 -0
  32. package/dist/lib/message.d.ts +49 -0
  33. package/dist/lib/message.js +64 -0
  34. package/dist/lib/remote-components/wechat-personal-workbench/app.js +1831 -0
  35. package/dist/lib/tokens.d.ts +1 -0
  36. package/dist/lib/tokens.js +1 -0
  37. package/dist/lib/types.d.ts +48 -0
  38. package/dist/lib/types.js +365 -0
  39. package/dist/lib/views/wechat-personal-view.provider.d.ts +17 -0
  40. package/dist/lib/views/wechat-personal-view.provider.js +441 -0
  41. package/dist/lib/wechat-personal-channel.strategy.d.ts +33 -0
  42. package/dist/lib/wechat-personal-channel.strategy.js +197 -0
  43. package/dist/lib/wechat-personal-integration.strategy.d.ts +56 -0
  44. package/dist/lib/wechat-personal-integration.strategy.js +217 -0
  45. package/dist/lib/wechat-personal.client.d.ts +29 -0
  46. package/dist/lib/wechat-personal.client.js +146 -0
  47. package/dist/lib/wechat-personal.controller.d.ts +50 -0
  48. package/dist/lib/wechat-personal.controller.js +270 -0
  49. package/dist/lib/wechat-personal.middleware.d.ts +20 -0
  50. package/dist/lib/wechat-personal.middleware.js +267 -0
  51. package/dist/lib/wechat-personal.plugin.d.ts +2 -0
  52. package/dist/lib/wechat-personal.plugin.js +58 -0
  53. package/dist/lib/wechat-personal.templates.d.ts +2 -0
  54. package/dist/lib/wechat-personal.templates.js +100 -0
  55. package/dist/lib/workflow/index.d.ts +5 -0
  56. package/dist/lib/workflow/index.js +5 -0
  57. package/dist/lib/workflow/wechat-personal-trigger-aggregation.service.d.ts +10 -0
  58. package/dist/lib/workflow/wechat-personal-trigger-aggregation.service.js +39 -0
  59. package/dist/lib/workflow/wechat-personal-trigger-aggregation.types.d.ts +30 -0
  60. package/dist/lib/workflow/wechat-personal-trigger-aggregation.types.js +2 -0
  61. package/dist/lib/workflow/wechat-personal-trigger-flush.processor.d.ts +8 -0
  62. package/dist/lib/workflow/wechat-personal-trigger-flush.processor.js +39 -0
  63. package/dist/lib/workflow/wechat-personal-trigger.strategy.d.ts +65 -0
  64. package/dist/lib/workflow/wechat-personal-trigger.strategy.js +511 -0
  65. package/dist/lib/workflow/wechat-personal-trigger.types.d.ts +10 -0
  66. package/dist/lib/workflow/wechat-personal-trigger.types.js +2 -0
  67. package/dist/xpert-wechat-personal-admin-assistant.yaml +103 -0
  68. package/dist/xpert-wechat-personal-user-assistant.yaml +127 -0
  69. package/package.json +79 -0
@@ -0,0 +1,100 @@
1
+ import { existsSync, readFileSync } from 'fs';
2
+ import { dirname, join } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ import { XpertTypeEnum } from '@xpert-ai/contracts';
5
+ import { WECHAT_PERSONAL_FEATURE, WECHAT_PERSONAL_MIDDLEWARE_NAME, WECHAT_PERSONAL_PLUGIN_NAME, WECHAT_PERSONAL_RUNTIME_FEATURE, WECHAT_PERSONAL_TEMPLATE_PROVIDER_KEY, WECHAT_PERSONAL_VIEW_PROVIDER_KEY } from './constants.js';
6
+ const WECHAT_PERSONAL_ADMIN_TEMPLATE_KEY = 'wechat-personal-admin-assistant';
7
+ const WECHAT_PERSONAL_USER_TEMPLATE_KEY = 'wechat-personal-user-assistant';
8
+ const WECHAT_PERSONAL_ADMIN_TEMPLATE_FILE = 'xpert-wechat-personal-admin-assistant.yaml';
9
+ const WECHAT_PERSONAL_USER_TEMPLATE_FILE = 'xpert-wechat-personal-user-assistant.yaml';
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = dirname(__filename);
12
+ function getTemplateCandidates(templateFile) {
13
+ const runtimeDir = __dirname;
14
+ return [
15
+ join(runtimeDir, '..', templateFile),
16
+ join(runtimeDir, templateFile),
17
+ join(process.cwd(), 'community/integrations/wechat/src', templateFile),
18
+ join(process.cwd(), 'dist/community/integrations/wechat', templateFile)
19
+ ];
20
+ }
21
+ function readTemplateDsl(templateFile) {
22
+ const candidates = getTemplateCandidates(templateFile);
23
+ const templatePath = candidates.find((candidate) => existsSync(candidate));
24
+ if (!templatePath) {
25
+ throw new Error(`Personal WeChat xpert DSL template file not found: ${candidates.join(', ')}`);
26
+ }
27
+ return readFileSync(templatePath, 'utf8');
28
+ }
29
+ export const wechatPersonalTemplates = [
30
+ {
31
+ key: WECHAT_PERSONAL_ADMIN_TEMPLATE_KEY,
32
+ name: 'Personal WeChat Admin Assistant',
33
+ title: '个人微信管理员',
34
+ description: '管理组织内 wx2.0 个人微信集成、账号、会话、消息日志和回调配置的管理员助手模板。',
35
+ category: 'Integration',
36
+ type: XpertTypeEnum.Agent,
37
+ targetApps: ['data-xpert'],
38
+ targetAppMeta: {
39
+ 'data-xpert': {
40
+ types: ['business-assistant', 'assistant-tool', 'workbench-view'],
41
+ capabilities: [WECHAT_PERSONAL_FEATURE, WECHAT_PERSONAL_RUNTIME_FEATURE, 'wechat-personal-workbench'],
42
+ requiredPlugins: [WECHAT_PERSONAL_PLUGIN_NAME],
43
+ defaultConfig: {
44
+ assistantKind: 'wechat-personal-admin-assistant',
45
+ businessDomain: 'wechat-personal',
46
+ role: 'admin',
47
+ managedBy: 'data-xpert',
48
+ middlewareProvider: WECHAT_PERSONAL_MIDDLEWARE_NAME,
49
+ viewProvider: WECHAT_PERSONAL_VIEW_PROVIDER_KEY
50
+ }
51
+ }
52
+ },
53
+ dslContent: readTemplateDsl(WECHAT_PERSONAL_ADMIN_TEMPLATE_FILE),
54
+ order: 45,
55
+ default: false,
56
+ startPrompts: [
57
+ '请汇总组织内所有个人微信集成的账号状态和最近错误。',
58
+ '帮我生成每个 wx2.0 账号的回调配置步骤。',
59
+ '检查最近 AI 回复发送失败的微信消息,并给出排查建议。'
60
+ ],
61
+ releaseNotes: '创建组织级个人微信运行管理助手。',
62
+ xpertName: '个人微信管理员',
63
+ providerKey: WECHAT_PERSONAL_TEMPLATE_PROVIDER_KEY
64
+ },
65
+ {
66
+ key: WECHAT_PERSONAL_USER_TEMPLATE_KEY,
67
+ name: 'Personal WeChat User Assistant',
68
+ title: '个人微信会话助手',
69
+ description: '通过 wx2.0 接收个人微信消息、交给 Agent 处理,并把最终文本回复发回微信的使用者助手模板。',
70
+ category: 'Integration',
71
+ type: XpertTypeEnum.Agent,
72
+ targetApps: ['data-xpert'],
73
+ targetAppMeta: {
74
+ 'data-xpert': {
75
+ types: ['business-assistant', 'assistant-tool'],
76
+ capabilities: [WECHAT_PERSONAL_FEATURE, WECHAT_PERSONAL_RUNTIME_FEATURE, 'wechat-personal-workbench'],
77
+ requiredPlugins: [WECHAT_PERSONAL_PLUGIN_NAME],
78
+ defaultConfig: {
79
+ assistantKind: 'wechat-personal-user-assistant',
80
+ businessDomain: 'wechat-personal',
81
+ role: 'user',
82
+ managedBy: 'data-xpert',
83
+ middlewareProvider: WECHAT_PERSONAL_MIDDLEWARE_NAME,
84
+ viewProvider: WECHAT_PERSONAL_VIEW_PROVIDER_KEY
85
+ }
86
+ }
87
+ },
88
+ dslContent: readTemplateDsl(WECHAT_PERSONAL_USER_TEMPLATE_FILE),
89
+ order: 46,
90
+ default: false,
91
+ startPrompts: [
92
+ '请作为微信会话助手,帮我自然回复用户消息。',
93
+ '如果微信群消息触发了你,请只围绕当前被触发的问题简洁回复。',
94
+ '当微信用户缺少上下文时,先提出一个澄清问题。'
95
+ ],
96
+ releaseNotes: '创建个人微信消息收发会话助手。',
97
+ xpertName: '个人微信会话助手',
98
+ providerKey: WECHAT_PERSONAL_TEMPLATE_PROVIDER_KEY
99
+ }
100
+ ];
@@ -0,0 +1,5 @@
1
+ export * from './wechat-personal-trigger-aggregation.service.js';
2
+ export * from './wechat-personal-trigger-aggregation.types.js';
3
+ export * from './wechat-personal-trigger-flush.processor.js';
4
+ export * from './wechat-personal-trigger.strategy.js';
5
+ export * from './wechat-personal-trigger.types.js';
@@ -0,0 +1,5 @@
1
+ export * from './wechat-personal-trigger-aggregation.service.js';
2
+ export * from './wechat-personal-trigger-aggregation.types.js';
3
+ export * from './wechat-personal-trigger-flush.processor.js';
4
+ export * from './wechat-personal-trigger.strategy.js';
5
+ export * from './wechat-personal-trigger.types.js';
@@ -0,0 +1,10 @@
1
+ import { type Cache } from 'cache-manager';
2
+ import { WechatPersonalTriggerAggregationState } from './wechat-personal-trigger-aggregation.types.js';
3
+ export declare class WechatPersonalTriggerAggregationService {
4
+ private readonly cacheManager;
5
+ constructor(cacheManager: Cache);
6
+ save(state: WechatPersonalTriggerAggregationState, ttlSeconds?: number): Promise<void>;
7
+ get(aggregateKey: string): Promise<WechatPersonalTriggerAggregationState | null>;
8
+ clear(aggregateKey: string): Promise<void>;
9
+ private buildKey;
10
+ }
@@ -0,0 +1,39 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { CACHE_MANAGER } from '@nestjs/cache-manager';
14
+ import { Inject, Injectable } from '@nestjs/common';
15
+ const DEFAULT_AGGREGATION_TTL_SECONDS = 2 * 60 * 60;
16
+ let WechatPersonalTriggerAggregationService = class WechatPersonalTriggerAggregationService {
17
+ constructor(cacheManager) {
18
+ this.cacheManager = cacheManager;
19
+ }
20
+ async save(state, ttlSeconds = DEFAULT_AGGREGATION_TTL_SECONDS) {
21
+ await this.cacheManager.set(this.buildKey(state.aggregateKey), state, ttlSeconds * 1000);
22
+ }
23
+ async get(aggregateKey) {
24
+ const state = await this.cacheManager.get(this.buildKey(aggregateKey));
25
+ return state ?? null;
26
+ }
27
+ async clear(aggregateKey) {
28
+ await this.cacheManager.del(this.buildKey(aggregateKey));
29
+ }
30
+ buildKey(aggregateKey) {
31
+ return `wechat-personal:trigger:aggregate:${aggregateKey}`;
32
+ }
33
+ };
34
+ WechatPersonalTriggerAggregationService = __decorate([
35
+ Injectable(),
36
+ __param(0, Inject(CACHE_MANAGER)),
37
+ __metadata("design:paramtypes", [Object])
38
+ ], WechatPersonalTriggerAggregationService);
39
+ export { WechatPersonalTriggerAggregationService };
@@ -0,0 +1,30 @@
1
+ export declare const WECHAT_PERSONAL_TRIGGER_FLUSH_MESSAGE_TYPE: import("@xpert-ai/plugin-sdk").StructuredHandoffMessageType;
2
+ export interface WechatPersonalTriggerFlushPayload extends Record<string, unknown> {
3
+ aggregateKey: string;
4
+ version: number;
5
+ }
6
+ export interface WechatPersonalTriggerAggregationMessageContext {
7
+ integrationId: string;
8
+ uuid: string;
9
+ ownerWxid?: string;
10
+ contactId: string;
11
+ chatType?: 'private' | 'group';
12
+ senderId?: string;
13
+ language?: string;
14
+ messageId?: string;
15
+ }
16
+ export interface WechatPersonalTriggerAggregationState {
17
+ aggregateKey: string;
18
+ integrationId: string;
19
+ conversationUserKey: string;
20
+ xpertId: string;
21
+ version: number;
22
+ inputParts: string[];
23
+ lastMessageAt: number;
24
+ conversationId?: string;
25
+ tenantId: string;
26
+ organizationId?: string;
27
+ executorUserId?: string;
28
+ endUserId?: string;
29
+ latestMessage: WechatPersonalTriggerAggregationMessageContext;
30
+ }
@@ -0,0 +1,2 @@
1
+ import { defineChannelMessageType } from '@xpert-ai/plugin-sdk';
2
+ export const WECHAT_PERSONAL_TRIGGER_FLUSH_MESSAGE_TYPE = defineChannelMessageType('wechat_personal', 'trigger_flush', 1);
@@ -0,0 +1,8 @@
1
+ import { HandoffMessage, IHandoffProcessor, ProcessContext, ProcessResult } from '@xpert-ai/plugin-sdk';
2
+ import { WechatPersonalTriggerFlushPayload } from './wechat-personal-trigger-aggregation.types.js';
3
+ import { WechatPersonalTriggerStrategy } from './wechat-personal-trigger.strategy.js';
4
+ export declare class WechatPersonalTriggerFlushProcessor implements IHandoffProcessor<WechatPersonalTriggerFlushPayload> {
5
+ private readonly triggerStrategy;
6
+ constructor(triggerStrategy: WechatPersonalTriggerStrategy);
7
+ process(message: HandoffMessage<WechatPersonalTriggerFlushPayload>, _ctx: ProcessContext): Promise<ProcessResult>;
8
+ }
@@ -0,0 +1,39 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Injectable } from '@nestjs/common';
11
+ import { HandoffProcessorStrategy } from '@xpert-ai/plugin-sdk';
12
+ import { WECHAT_PERSONAL_TRIGGER_FLUSH_MESSAGE_TYPE } from './wechat-personal-trigger-aggregation.types.js';
13
+ import { WechatPersonalTriggerStrategy } from './wechat-personal-trigger.strategy.js';
14
+ let WechatPersonalTriggerFlushProcessor = class WechatPersonalTriggerFlushProcessor {
15
+ constructor(triggerStrategy) {
16
+ this.triggerStrategy = triggerStrategy;
17
+ }
18
+ async process(message, _ctx) {
19
+ if (!message.payload?.aggregateKey || !message.payload?.version) {
20
+ return {
21
+ status: 'dead',
22
+ reason: 'Missing aggregateKey or version in WeChat personal trigger flush payload'
23
+ };
24
+ }
25
+ await this.triggerStrategy.flushBufferedConversation(message.payload);
26
+ return { status: 'ok' };
27
+ }
28
+ };
29
+ WechatPersonalTriggerFlushProcessor = __decorate([
30
+ Injectable(),
31
+ HandoffProcessorStrategy(WECHAT_PERSONAL_TRIGGER_FLUSH_MESSAGE_TYPE, {
32
+ types: [WECHAT_PERSONAL_TRIGGER_FLUSH_MESSAGE_TYPE],
33
+ policy: {
34
+ lane: 'main'
35
+ }
36
+ }),
37
+ __metadata("design:paramtypes", [WechatPersonalTriggerStrategy])
38
+ ], WechatPersonalTriggerFlushProcessor);
39
+ export { WechatPersonalTriggerFlushProcessor };
@@ -0,0 +1,65 @@
1
+ import type { ChecklistItem, TWorkflowTriggerMeta } from '@xpert-ai/contracts';
2
+ import { IWorkflowTriggerStrategy, type PluginContext, TWorkflowTriggerParams } from '@xpert-ai/plugin-sdk';
3
+ import { Repository } from 'typeorm';
4
+ import { WechatPersonalTriggerBindingEntity } from '../entities/wechat-personal-trigger-binding.entity.js';
5
+ import { WechatPersonalChatDispatchService } from '../handoff/wechat-personal-chat-dispatch.service.js';
6
+ import { WechatPersonalMessage } from '../message.js';
7
+ import { WechatPersonalChannelStrategy } from '../wechat-personal-channel.strategy.js';
8
+ import { WechatPersonalTriggerFlushPayload } from './wechat-personal-trigger-aggregation.types.js';
9
+ import { WechatPersonalTriggerAggregationService } from './wechat-personal-trigger-aggregation.service.js';
10
+ import { TWechatPersonalTriggerConfig } from './wechat-personal-trigger.types.js';
11
+ type WechatPersonalTenantScope = {
12
+ tenantId?: string | null;
13
+ organizationId?: string | null;
14
+ };
15
+ export declare class WechatPersonalTriggerStrategy implements IWorkflowTriggerStrategy<TWechatPersonalTriggerConfig> {
16
+ private readonly dispatchService;
17
+ private readonly aggregationService;
18
+ private readonly wechatChannel;
19
+ private readonly bindingRepository;
20
+ private readonly pluginContext;
21
+ private readonly logger;
22
+ private readonly callbacks;
23
+ private _integrationPermissionService;
24
+ private _handoffPermissionService;
25
+ readonly meta: TWorkflowTriggerMeta;
26
+ readonly bootstrap: {
27
+ mode: "replay_publish";
28
+ critical: boolean;
29
+ };
30
+ constructor(dispatchService: WechatPersonalChatDispatchService, aggregationService: WechatPersonalTriggerAggregationService, wechatChannel: WechatPersonalChannelStrategy, bindingRepository: Repository<WechatPersonalTriggerBindingEntity>, pluginContext: PluginContext);
31
+ private get integrationPermissionService();
32
+ private get handoffPermissionService();
33
+ validate(payload: TWorkflowTriggerParams<TWechatPersonalTriggerConfig>): Promise<ChecklistItem[]>;
34
+ publish(payload: TWorkflowTriggerParams<TWechatPersonalTriggerConfig>, callback: (payload: any) => void): Promise<void>;
35
+ stop(payload: TWorkflowTriggerParams<TWechatPersonalTriggerConfig>): Promise<void>;
36
+ getBinding(integrationId: string, scope?: WechatPersonalTenantScope | null): Promise<WechatPersonalTriggerBindingEntity | null>;
37
+ getBoundXpertId(integrationId: string): Promise<string | null>;
38
+ getBindingByXpertId(xpertId: string): Promise<WechatPersonalTriggerBindingEntity | null>;
39
+ getBoundIntegrationId(xpertId: string): Promise<string | null>;
40
+ clearBufferedConversation(conversationUserKey: string): Promise<void>;
41
+ handleInboundMessage(params: {
42
+ integrationId: string;
43
+ input?: string;
44
+ wechatMessage: WechatPersonalMessage;
45
+ conversationId?: string;
46
+ conversationUserKey?: string;
47
+ tenantId: string;
48
+ organizationId?: string;
49
+ executorUserId?: string;
50
+ endUserId?: string;
51
+ }): Promise<boolean>;
52
+ flushBufferedConversation(payload: WechatPersonalTriggerFlushPayload): Promise<boolean>;
53
+ private buildFlushMessage;
54
+ private dispatchInboundMessage;
55
+ private resolveBindingContext;
56
+ private normalizeAggregateKey;
57
+ private normalizePositiveSeconds;
58
+ private normalizeNonNegativeSeconds;
59
+ private removeBindingFromStore;
60
+ private removeBindingsByXpertId;
61
+ private resolveRequestTenantScope;
62
+ private resolveQueryTenantScope;
63
+ private scopedWhere;
64
+ }
65
+ export {};