@amaster.ai/pi-channels 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 (68) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +156 -0
  3. package/dist/adapters/feishu.d.ts +5 -0
  4. package/dist/adapters/feishu.d.ts.map +1 -0
  5. package/dist/adapters/feishu.js +429 -0
  6. package/dist/adapters/feishu.js.map +1 -0
  7. package/dist/adapters/webhook.d.ts +3 -0
  8. package/dist/adapters/webhook.d.ts.map +1 -0
  9. package/dist/adapters/webhook.js +63 -0
  10. package/dist/adapters/webhook.js.map +1 -0
  11. package/dist/adapters/wecom/adapter.d.ts +3 -0
  12. package/dist/adapters/wecom/adapter.d.ts.map +1 -0
  13. package/dist/adapters/wecom/adapter.js +202 -0
  14. package/dist/adapters/wecom/adapter.js.map +1 -0
  15. package/dist/adapters/wecom/client.d.ts +13 -0
  16. package/dist/adapters/wecom/client.d.ts.map +1 -0
  17. package/dist/adapters/wecom/client.js +116 -0
  18. package/dist/adapters/wecom/client.js.map +1 -0
  19. package/dist/adapters/wecom/crypto.d.ts +14 -0
  20. package/dist/adapters/wecom/crypto.d.ts.map +1 -0
  21. package/dist/adapters/wecom/crypto.js +37 -0
  22. package/dist/adapters/wecom/crypto.js.map +1 -0
  23. package/dist/adapters/wecom/errors.d.ts +25 -0
  24. package/dist/adapters/wecom/errors.d.ts.map +1 -0
  25. package/dist/adapters/wecom/errors.js +56 -0
  26. package/dist/adapters/wecom/errors.js.map +1 -0
  27. package/dist/adapters/wecom/types.d.ts +52 -0
  28. package/dist/adapters/wecom/types.d.ts.map +1 -0
  29. package/dist/adapters/wecom/types.js +2 -0
  30. package/dist/adapters/wecom/types.js.map +1 -0
  31. package/dist/adapters/wecom/xml.d.ts +4 -0
  32. package/dist/adapters/wecom/xml.d.ts.map +1 -0
  33. package/dist/adapters/wecom/xml.js +16 -0
  34. package/dist/adapters/wecom/xml.js.map +1 -0
  35. package/dist/adapters/wecom.d.ts +4 -0
  36. package/dist/adapters/wecom.d.ts.map +1 -0
  37. package/dist/adapters/wecom.js +3 -0
  38. package/dist/adapters/wecom.js.map +1 -0
  39. package/dist/bridge-provider.d.ts +3 -0
  40. package/dist/bridge-provider.d.ts.map +1 -0
  41. package/dist/bridge-provider.js +79 -0
  42. package/dist/bridge-provider.js.map +1 -0
  43. package/dist/bridge.d.ts +26 -0
  44. package/dist/bridge.d.ts.map +1 -0
  45. package/dist/bridge.js +406 -0
  46. package/dist/bridge.js.map +1 -0
  47. package/dist/config.d.ts +4 -0
  48. package/dist/config.d.ts.map +1 -0
  49. package/dist/config.js +141 -0
  50. package/dist/config.js.map +1 -0
  51. package/dist/http.d.ts +11 -0
  52. package/dist/http.d.ts.map +1 -0
  53. package/dist/http.js +39 -0
  54. package/dist/http.js.map +1 -0
  55. package/dist/index.d.ts +3 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +368 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/registry.d.ts +35 -0
  60. package/dist/registry.d.ts.map +1 -0
  61. package/dist/registry.js +175 -0
  62. package/dist/registry.js.map +1 -0
  63. package/dist/types.d.ts +125 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +2 -0
  66. package/dist/types.js.map +1 -0
  67. package/package.json +64 -0
  68. package/preview.png +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,cAAc,EAGd,iBAAiB,EACjB,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,qBAAqB,GAAG;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/E,CAAC;AAaF,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,MAAM,CAAyC;IACvD,OAAO,CAAC,MAAM,CAAiD;IAC/D,OAAO,CAAC,UAAU,CAAsC;IACxD,OAAO,CAAC,GAAG,CAAC,CAA0E;IAEtF,SAAS,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAI7F,aAAa,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI;IAI5C,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B7D,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IA6B/B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAWrD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAM3B,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;IA+DxD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIpD,IAAI,IAAI,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;QAC1B,SAAS,CAAC,EAAE,gBAAgB,CAAC;QAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAsBF,SAAS,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAItD,OAAO,CAAC,OAAO;CAKhB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGnD"}
@@ -0,0 +1,175 @@
1
+ import { createFeishuAdapter } from './adapters/feishu.js';
2
+ import { createWebhookAdapter } from './adapters/webhook.js';
3
+ import { createWeComAdapter } from './adapters/wecom.js';
4
+ const adapterFactories = {
5
+ feishu: createFeishuAdapter,
6
+ webhook: createWebhookAdapter,
7
+ wecom: createWeComAdapter,
8
+ };
9
+ export class ChannelRegistry {
10
+ adapters = new Map();
11
+ routes = new Map();
12
+ errors = [];
13
+ onIncoming = () => undefined;
14
+ log;
15
+ setLogger(log) {
16
+ this.log = log;
17
+ }
18
+ setOnIncoming(onIncoming) {
19
+ this.onIncoming = onIncoming;
20
+ }
21
+ async loadConfig(config, cwd) {
22
+ await this.stopAll();
23
+ this.adapters.clear();
24
+ this.routes.clear();
25
+ this.errors = [];
26
+ for (const [alias, target] of Object.entries(config.routes ?? {})) {
27
+ this.routes.set(alias, target);
28
+ }
29
+ for (const [name, adapterConfig] of Object.entries(config.adapters ?? {})) {
30
+ const factory = adapterFactories[adapterConfig.type];
31
+ if (!factory) {
32
+ this.errors.push({ adapter: name, error: `Unknown adapter type: ${adapterConfig.type}` });
33
+ continue;
34
+ }
35
+ try {
36
+ const context = this.log ? { cwd, log: this.log } : { cwd };
37
+ const adapter = await factory(adapterConfig, context);
38
+ this.adapters.set(name, adapter);
39
+ }
40
+ catch (error) {
41
+ this.errors.push({ adapter: name, error: errorMessage(error) });
42
+ }
43
+ }
44
+ }
45
+ async startListening() {
46
+ for (const [name, adapter] of this.adapters) {
47
+ if (!adapter.start || adapter.direction === 'outgoing')
48
+ continue;
49
+ try {
50
+ await adapter.start((message) => {
51
+ const withAdapter = { ...message, adapter: name };
52
+ try {
53
+ const maybePromise = this.onIncoming(withAdapter);
54
+ if (maybePromise instanceof Promise) {
55
+ maybePromise.catch((error) => {
56
+ this.errors.push({
57
+ adapter: name,
58
+ error: `Incoming handler failed: ${errorMessage(error)}`,
59
+ });
60
+ });
61
+ }
62
+ }
63
+ catch (error) {
64
+ this.errors.push({
65
+ adapter: name,
66
+ error: `Incoming handler failed: ${errorMessage(error)}`,
67
+ });
68
+ }
69
+ });
70
+ }
71
+ catch (error) {
72
+ this.errors.push({ adapter: name, error: `Failed to start: ${errorMessage(error)}` });
73
+ }
74
+ }
75
+ }
76
+ async stopAll() {
77
+ for (const adapter of this.adapters.values()) {
78
+ await adapter.stop?.();
79
+ }
80
+ }
81
+ register(name, adapter) {
82
+ this.adapters.set(name, adapter);
83
+ if (adapter.start && adapter.direction !== 'outgoing') {
84
+ adapter
85
+ .start((message) => this.onIncoming({ ...message, adapter: name }))
86
+ .catch((error) => {
87
+ this.errors.push({ adapter: name, error: `Failed to start: ${errorMessage(error)}` });
88
+ });
89
+ }
90
+ }
91
+ unregister(name) {
92
+ const adapter = this.adapters.get(name);
93
+ adapter?.stop?.();
94
+ return this.adapters.delete(name);
95
+ }
96
+ async send(message) {
97
+ const resolved = this.resolve(message.adapter, message.recipient);
98
+ const adapter = this.adapters.get(resolved.adapter);
99
+ if (!adapter) {
100
+ const error = `No adapter "${resolved.adapter}"`;
101
+ this.log?.('message_send_failed', { adapter: resolved.adapter, recipient: resolved.recipient, error }, 'ERROR');
102
+ return { ok: false, error };
103
+ }
104
+ if (adapter.direction === 'incoming') {
105
+ const error = `Adapter "${resolved.adapter}" is incoming-only`;
106
+ this.log?.('message_send_failed', { adapter: resolved.adapter, recipient: resolved.recipient, error }, 'ERROR');
107
+ return { ok: false, error };
108
+ }
109
+ if (!adapter.send) {
110
+ const error = `Adapter "${resolved.adapter}" cannot send`;
111
+ this.log?.('message_send_failed', { adapter: resolved.adapter, recipient: resolved.recipient, error }, 'ERROR');
112
+ return { ok: false, error };
113
+ }
114
+ try {
115
+ this.log?.('message_send_start', {
116
+ adapter: resolved.adapter,
117
+ recipient: resolved.recipient,
118
+ source: message.source,
119
+ text: message.text,
120
+ });
121
+ await adapter.send({ ...message, adapter: resolved.adapter, recipient: resolved.recipient });
122
+ this.log?.('message_send_ok', {
123
+ adapter: resolved.adapter,
124
+ recipient: resolved.recipient,
125
+ source: message.source,
126
+ text: message.text,
127
+ });
128
+ return { ok: true };
129
+ }
130
+ catch (error) {
131
+ const messageError = errorMessage(error);
132
+ this.log?.('message_send_failed', {
133
+ adapter: resolved.adapter,
134
+ recipient: resolved.recipient,
135
+ source: message.source,
136
+ text: message.text,
137
+ error: messageError,
138
+ }, 'ERROR');
139
+ return { ok: false, error: messageError };
140
+ }
141
+ }
142
+ getAdapter(name) {
143
+ return this.adapters.get(name);
144
+ }
145
+ list() {
146
+ const result = [];
147
+ for (const [name, adapter] of this.adapters) {
148
+ result.push({ name, type: 'adapter', direction: adapter.direction });
149
+ }
150
+ for (const [name, route] of this.routes) {
151
+ result.push({
152
+ name,
153
+ type: 'route',
154
+ target: `${route.adapter} -> ${route.recipient}`,
155
+ ...(route.name ? { label: route.name } : {}),
156
+ });
157
+ }
158
+ return result;
159
+ }
160
+ getErrors() {
161
+ return [...this.errors];
162
+ }
163
+ resolve(adapterName, recipient) {
164
+ const route = this.routes.get(adapterName);
165
+ if (!route)
166
+ return { adapter: adapterName, recipient };
167
+ return { adapter: route.adapter, recipient: recipient || route.recipient };
168
+ }
169
+ }
170
+ export function errorMessage(error) {
171
+ if (error instanceof Error)
172
+ return error.message;
173
+ return String(error);
174
+ }
175
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ export type AdapterDirection = 'outgoing' | 'incoming' | 'bidirectional';
2
+ export type ChannelPayloadMode = 'envelope' | 'raw';
3
+ export type ChannelMessage = {
4
+ adapter: string;
5
+ recipient: string;
6
+ text?: string;
7
+ source?: string;
8
+ metadata?: Record<string, unknown>;
9
+ payloadMode?: ChannelPayloadMode;
10
+ rawBody?: unknown;
11
+ webhook?: {
12
+ method?: string;
13
+ contentType?: string;
14
+ };
15
+ };
16
+ export type IncomingAttachment = {
17
+ type: 'image' | 'document' | 'audio' | 'file';
18
+ path: string;
19
+ filename?: string;
20
+ mimeType?: string;
21
+ size?: number;
22
+ };
23
+ export type IncomingMessage = {
24
+ adapter: string;
25
+ sender: string;
26
+ text: string;
27
+ attachments?: IncomingAttachment[];
28
+ metadata?: Record<string, unknown>;
29
+ };
30
+ export type OnIncomingMessage = (message: IncomingMessage) => void | Promise<void>;
31
+ export type ChannelAdapter = {
32
+ direction: AdapterDirection;
33
+ send?(message: ChannelMessage): Promise<void>;
34
+ start?(onMessage: OnIncomingMessage): Promise<void>;
35
+ stop?(): Promise<void>;
36
+ sendTyping?(recipient: string): Promise<void>;
37
+ };
38
+ export type AdapterConfig = {
39
+ type: string;
40
+ [key: string]: unknown;
41
+ };
42
+ export type HttpIncomingConfig = {
43
+ enabled?: boolean;
44
+ host?: string;
45
+ port?: number;
46
+ path?: string;
47
+ };
48
+ export type FeishuAdapterConfig = AdapterConfig & {
49
+ type: 'feishu';
50
+ appId?: string;
51
+ appSecret?: string;
52
+ /**
53
+ * Event transport. Defaults to websocket. Set "off" for outgoing-only use,
54
+ * or "http" when the deployment already exposes an event callback endpoint.
55
+ */
56
+ eventMode?: 'websocket' | 'http' | 'off';
57
+ appType?: 'self_build' | 'selfBuild' | 'SelfBuild' | 'isv' | 'ISV';
58
+ domain?: 'feishu' | 'lark' | string;
59
+ verificationToken?: string;
60
+ encryptKey?: string;
61
+ botOpenId?: string;
62
+ receiveIdType?: 'chat_id' | 'open_id' | 'user_id' | 'union_id' | 'email';
63
+ respondToMentionsOnly?: boolean;
64
+ respondToMentionAll?: boolean;
65
+ replyInThread?: boolean;
66
+ ackReactionEmoji?: string | false;
67
+ allowedChatIds?: string[];
68
+ allowedSenderIds?: string[];
69
+ dmMode?: 'open' | 'allowlist' | 'pair' | 'disabled';
70
+ dmAllowlist?: string[];
71
+ loggerLevel?: 'error' | 'warn' | 'info' | 'debug' | 'trace';
72
+ handshakeTimeoutMs?: number;
73
+ wsPingTimeoutSeconds?: number;
74
+ incoming?: HttpIncomingConfig;
75
+ };
76
+ export type WeComAdapterConfig = AdapterConfig & {
77
+ type: 'wecom';
78
+ corpId?: string;
79
+ agentId?: string | number;
80
+ secret?: string;
81
+ baseUrl?: string;
82
+ timeoutMs?: number;
83
+ tokenRefreshBufferSeconds?: number;
84
+ token?: string;
85
+ encodingAesKey?: string;
86
+ receiveId?: string;
87
+ incoming?: HttpIncomingConfig;
88
+ };
89
+ export type WebhookAdapterConfig = AdapterConfig & {
90
+ type: 'webhook';
91
+ method?: string;
92
+ contentType?: string;
93
+ payloadMode?: ChannelPayloadMode;
94
+ secret?: string;
95
+ headers?: Record<string, string>;
96
+ };
97
+ export type BridgeConfig = {
98
+ enabled?: boolean;
99
+ timeoutMs?: number;
100
+ maxQueuePerSender?: number;
101
+ maxConcurrent?: number;
102
+ model?: string | null;
103
+ provider?: string | null;
104
+ piBin?: string;
105
+ commands?: boolean;
106
+ persistSessions?: boolean;
107
+ apiBase?: string;
108
+ env?: Record<string, string>;
109
+ };
110
+ export type ChannelRouteConfig = {
111
+ adapter: string;
112
+ recipient: string;
113
+ name?: string;
114
+ capture?: boolean;
115
+ };
116
+ export type ChannelConfig = {
117
+ adapters?: Record<string, AdapterConfig>;
118
+ routes?: Record<string, ChannelRouteConfig>;
119
+ bridge?: BridgeConfig;
120
+ };
121
+ export type SendResult = {
122
+ ok: boolean;
123
+ error?: string;
124
+ };
125
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
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":""}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@amaster.ai/pi-channels",
3
+ "version": "0.1.0",
4
+ "description": "Pi extension for native messaging channels including Feishu, WeCom, and webhooks.",
5
+ "keywords": [
6
+ "pi-package",
7
+ "pi",
8
+ "extension",
9
+ "channels",
10
+ "feishu",
11
+ "wecom",
12
+ "webhooks"
13
+ ],
14
+ "license": "Apache-2.0",
15
+ "type": "module",
16
+ "sideEffects": false,
17
+ "main": "./dist/index.js",
18
+ "types": "./dist/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "default": "./dist/index.js"
23
+ },
24
+ "./package.json": {
25
+ "default": "./package.json"
26
+ }
27
+ },
28
+ "files": [
29
+ "dist",
30
+ "preview.png",
31
+ "README.md"
32
+ ],
33
+ "pi": {
34
+ "image": "https://raw.githubusercontent.com/TGYD-helige/pi/master/packages/pi-channels/preview.png",
35
+ "extensions": [
36
+ "./dist/index.js"
37
+ ]
38
+ },
39
+ "publishConfig": {
40
+ "access": "public"
41
+ },
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "https://github.com/TGYD-helige/pi.git",
45
+ "directory": "packages/pi-channels"
46
+ },
47
+ "peerDependencies": {
48
+ "@earendil-works/pi-coding-agent": ">=0.74.0",
49
+ "typebox": "*"
50
+ },
51
+ "devDependencies": {
52
+ "@earendil-works/pi-coding-agent": "0.74.0",
53
+ "typebox": "*",
54
+ "vitest": "^4.0.0"
55
+ },
56
+ "dependencies": {
57
+ "@larksuiteoapi/node-sdk": "^1.64.0"
58
+ },
59
+ "scripts": {
60
+ "build": "tsc -b",
61
+ "typecheck": "tsc -b --pretty false",
62
+ "test": "vitest run src"
63
+ }
64
+ }
package/preview.png ADDED
Binary file