opc-agent 4.1.0 → 4.1.2
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/.github/ISSUE_TEMPLATE/bug_report.md +20 -20
- package/.github/ISSUE_TEMPLATE/feature_request.md +14 -14
- package/.github/PULL_REQUEST_TEMPLATE.md +13 -13
- package/CHANGELOG.md +48 -48
- package/CONTRIBUTING.md +36 -36
- package/README.zh-CN.md +497 -497
- package/USABILITY-ISSUES.md +73 -0
- package/dist/channels/web.js +8 -2
- package/dist/channels/wechat.js +6 -6
- package/dist/cli.js +200 -85
- package/dist/core/runtime.js +37 -15
- package/dist/deploy/index.js +56 -56
- package/dist/doctor.d.ts +1 -0
- package/dist/doctor.js +105 -10
- package/dist/memory/deepbrain.d.ts +1 -1
- package/dist/memory/deepbrain.js +95 -4
- package/dist/scheduler/cron-engine.js +3 -36
- package/dist/studio/server.js +30 -1
- package/dist/studio-ui/index.html +230 -10
- package/dist/ui/components.js +105 -105
- package/examples/README.md +22 -22
- package/examples/basic-agent.ts +90 -90
- package/examples/brain-integration.ts +71 -71
- package/examples/multi-channel.ts +74 -74
- package/fix-sidebar.mjs +188 -188
- package/install.ps1 +154 -154
- package/install.sh +164 -164
- package/package.json +1 -1
- package/scripts/install.ps1 +31 -31
- package/scripts/install.sh +40 -40
- package/serve-studio.js +13 -13
- package/serve-test.js +25 -25
- package/src/channels/dingtalk.ts +46 -46
- package/src/channels/email.ts +351 -351
- package/src/channels/feishu.ts +349 -349
- package/src/channels/googlechat.ts +42 -42
- package/src/channels/imessage.ts +31 -31
- package/src/channels/irc.ts +82 -82
- package/src/channels/line.ts +32 -32
- package/src/channels/matrix.ts +33 -33
- package/src/channels/mattermost.ts +57 -57
- package/src/channels/msteams.ts +32 -32
- package/src/channels/nostr.ts +32 -32
- package/src/channels/qq.ts +33 -33
- package/src/channels/signal.ts +32 -32
- package/src/channels/sms.ts +33 -33
- package/src/channels/telegram.ts +616 -616
- package/src/channels/twitch.ts +65 -65
- package/src/channels/voice-call.ts +100 -100
- package/src/channels/web.ts +8 -2
- package/src/channels/websocket.ts +399 -399
- package/src/channels/wechat.ts +329 -329
- package/src/channels/whatsapp.ts +32 -32
- package/src/cli/chat.ts +99 -99
- package/src/cli/setup.ts +314 -314
- package/src/cli.ts +195 -92
- package/src/core/agent.ts +476 -476
- package/src/core/api-server.ts +277 -277
- package/src/core/audio.ts +98 -98
- package/src/core/collaboration.ts +275 -275
- package/src/core/context-discovery.ts +85 -85
- package/src/core/context-refs.ts +140 -140
- package/src/core/gateway.ts +106 -106
- package/src/core/heartbeat.ts +51 -51
- package/src/core/hooks.ts +105 -105
- package/src/core/ide-bridge.ts +133 -133
- package/src/core/node-network.ts +86 -86
- package/src/core/profiles.ts +122 -122
- package/src/core/runtime.ts +25 -0
- package/src/core/scheduler.ts +187 -187
- package/src/core/session-manager.ts +137 -137
- package/src/core/subagent.ts +98 -98
- package/src/core/vision.ts +180 -180
- package/src/core/workflow-graph.ts +365 -365
- package/src/daemon.ts +96 -96
- package/src/deploy/index.ts +255 -255
- package/src/doctor.ts +98 -11
- package/src/eval/index.ts +211 -211
- package/src/eval/suites/basic.json +16 -16
- package/src/eval/suites/memory.json +12 -12
- package/src/eval/suites/safety.json +14 -14
- package/src/hub/brain-seed.ts +54 -54
- package/src/hub/client.ts +60 -60
- package/src/mcp/servers/calculator-mcp.ts +65 -65
- package/src/mcp/servers/crypto-mcp.ts +73 -73
- package/src/mcp/servers/database-mcp.ts +72 -72
- package/src/mcp/servers/datetime-mcp.ts +69 -69
- package/src/mcp/servers/filesystem.ts +66 -66
- package/src/mcp/servers/github-mcp.ts +58 -58
- package/src/mcp/servers/index.ts +63 -63
- package/src/mcp/servers/json-mcp.ts +102 -102
- package/src/mcp/servers/memory-mcp.ts +56 -56
- package/src/mcp/servers/regex-mcp.ts +53 -53
- package/src/mcp/servers/web-mcp.ts +49 -49
- package/src/memory/context-compressor.ts +189 -189
- package/src/memory/deepbrain.ts +99 -5
- package/src/memory/seed-loader.ts +212 -212
- package/src/memory/user-profiler.ts +215 -215
- package/src/plugins/content-filter.ts +23 -23
- package/src/plugins/logger.ts +18 -18
- package/src/plugins/rate-limiter.ts +38 -38
- package/src/protocols/a2a/client.ts +132 -132
- package/src/protocols/a2a/index.ts +8 -8
- package/src/protocols/a2a/server.ts +333 -333
- package/src/protocols/a2a/types.ts +88 -88
- package/src/protocols/a2a/utils.ts +50 -50
- package/src/protocols/agui/client.ts +83 -83
- package/src/protocols/agui/index.ts +4 -4
- package/src/protocols/agui/server.ts +218 -218
- package/src/protocols/agui/types.ts +153 -153
- package/src/protocols/index.ts +2 -2
- package/src/protocols/mcp/agent-tools.ts +134 -134
- package/src/protocols/mcp/index.ts +8 -8
- package/src/protocols/mcp/server.ts +262 -262
- package/src/protocols/mcp/types.ts +69 -69
- package/src/providers/index.ts +632 -632
- package/src/publish/index.ts +376 -376
- package/src/scheduler/cron-engine.ts +191 -191
- package/src/scheduler/index.ts +2 -2
- package/src/schema/oad.ts +217 -217
- package/src/security/approval.ts +131 -131
- package/src/security/approvals.ts +143 -143
- package/src/security/elevated.ts +105 -105
- package/src/security/guardrails.ts +248 -248
- package/src/security/index.ts +9 -9
- package/src/security/keys.ts +87 -87
- package/src/security/secrets.ts +129 -129
- package/src/skills/builtin/index.ts +408 -408
- package/src/skills/marketplace.ts +113 -113
- package/src/skills/types.ts +42 -42
- package/src/studio/server.ts +31 -1
- package/src/studio/templates-data.ts +178 -178
- package/src/studio-ui/index.html +230 -10
- package/src/telemetry/index.ts +324 -324
- package/src/tools/builtin/browser.ts +299 -299
- package/src/tools/builtin/datetime.ts +41 -41
- package/src/tools/builtin/file.ts +107 -107
- package/src/tools/builtin/home-assistant.ts +116 -116
- package/src/tools/builtin/rl-tools.ts +243 -243
- package/src/tools/builtin/shell.ts +43 -43
- package/src/tools/builtin/vision.ts +64 -64
- package/src/tools/builtin/web-search.ts +126 -126
- package/src/tools/builtin/web.ts +35 -35
- package/src/tools/document-processor.ts +213 -213
- package/src/tools/image-generator.ts +150 -150
- package/src/tools/integrations/calendar.ts +73 -73
- package/src/tools/integrations/code-exec.ts +39 -39
- package/src/tools/integrations/csv-analyzer.ts +92 -92
- package/src/tools/integrations/database.ts +44 -44
- package/src/tools/integrations/email-send.ts +76 -76
- package/src/tools/integrations/git-tool.ts +42 -42
- package/src/tools/integrations/github-tool.ts +76 -76
- package/src/tools/integrations/image-gen.ts +56 -56
- package/src/tools/integrations/index.ts +92 -92
- package/src/tools/integrations/jira.ts +83 -83
- package/src/tools/integrations/notion.ts +71 -71
- package/src/tools/integrations/npm-tool.ts +48 -48
- package/src/tools/integrations/pdf-reader.ts +58 -58
- package/src/tools/integrations/slack.ts +65 -65
- package/src/tools/integrations/summarizer.ts +49 -49
- package/src/tools/integrations/translator.ts +48 -48
- package/src/tools/integrations/trello.ts +60 -60
- package/src/tools/integrations/vector-search.ts +42 -42
- package/src/tools/integrations/web-scraper.ts +47 -47
- package/src/tools/integrations/web-search.ts +58 -58
- package/src/tools/integrations/webhook.ts +38 -38
- package/src/tools/mcp-client.ts +131 -131
- package/src/tools/web-scraper.ts +179 -179
- package/src/tools/web-search.ts +180 -180
- package/src/ui/components.ts +127 -127
- package/srv-out.txt +1 -1
- package/templates/ecommerce-assistant/README.md +45 -45
- package/templates/ecommerce-assistant/oad.yaml +47 -47
- package/templates/tech-support/README.md +43 -43
- package/templates/tech-support/oad.yaml +45 -45
- package/test-agent/Dockerfile +9 -9
- package/test-agent/README.md +50 -50
- package/test-agent/agent.yaml +23 -23
- package/test-agent/docker-compose.yml +11 -11
- package/test-agent/oad.yaml +31 -31
- package/test-agent/package-lock.json +1492 -1492
- package/test-agent/package.json +17 -17
- package/test-agent/src/index.ts +24 -24
- package/test-agent/src/skills/echo.ts +15 -15
- package/test-agent/tsconfig.json +24 -24
- package/test-full.js +43 -43
- package/test-sidebar.js +22 -22
- package/test-studio3.js +75 -75
- package/test-studio4.js +41 -41
- package/tests/a2a-protocol.test.ts +285 -285
- package/tests/agui-protocol.test.ts +246 -246
- package/tests/api-server.test.ts +148 -148
- package/tests/approvals.test.ts +89 -89
- package/tests/audio.test.ts +40 -40
- package/tests/brain-seed-extended.test.ts +490 -490
- package/tests/brain-seed.test.ts +239 -239
- package/tests/browser.test.ts +179 -179
- package/tests/channels/discord.test.ts +79 -79
- package/tests/channels/email.test.ts +148 -148
- package/tests/channels/feishu.test.ts +123 -123
- package/tests/channels/telegram.test.ts +129 -129
- package/tests/channels/websocket.test.ts +53 -53
- package/tests/channels/wechat.test.ts +170 -170
- package/tests/channels-extra.test.ts +45 -45
- package/tests/chat-cli.test.ts +160 -160
- package/tests/cli.test.ts +46 -46
- package/tests/context-compressor.test.ts +172 -172
- package/tests/context-refs.test.ts +121 -121
- package/tests/cron-engine.test.ts +101 -101
- package/tests/daemon.test.ts +135 -135
- package/tests/deepbrain-wire.test.ts +234 -234
- package/tests/deploy-and-dag.test.ts +196 -196
- package/tests/doctor.test.ts +38 -38
- package/tests/document-processor.test.ts +69 -69
- package/tests/e2e-nocode.test.ts +442 -442
- package/tests/elevated.test.ts +69 -69
- package/tests/eval.test.ts +173 -173
- package/tests/gateway.test.ts +63 -63
- package/tests/guardrails.test.ts +177 -177
- package/tests/home-assistant.test.ts +40 -40
- package/tests/hooks.test.ts +79 -79
- package/tests/ide-bridge.test.ts +38 -38
- package/tests/image-generator.test.ts +84 -84
- package/tests/init-role.test.ts +124 -124
- package/tests/integrations.test.ts +249 -249
- package/tests/mcp-client.test.ts +92 -92
- package/tests/mcp-server.test.ts +178 -178
- package/tests/mcp-servers.test.ts +260 -260
- package/tests/node-network.test.ts +74 -74
- package/tests/plugin-a2a-enhanced.test.ts +230 -230
- package/tests/profiles.test.ts +61 -61
- package/tests/publish.test.ts +231 -231
- package/tests/rl-tools.test.ts +93 -93
- package/tests/sandbox-manager.test.ts +46 -46
- package/tests/scheduler.test.ts +200 -200
- package/tests/secrets.test.ts +107 -107
- package/tests/security-enhanced.test.ts +233 -233
- package/tests/settings-api.test.ts +148 -148
- package/tests/setup.test.ts +73 -73
- package/tests/subagent.test.ts +193 -193
- package/tests/telegram-discord.test.ts +60 -60
- package/tests/telemetry.test.ts +186 -186
- package/tests/user-profiler.test.ts +169 -169
- package/tests/v090-features.test.ts +254 -254
- package/tests/vision.test.ts +61 -61
- package/tests/voice-call.test.ts +47 -47
- package/tests/voice-enhanced.test.ts +169 -169
- package/tests/voice-interaction.test.ts +38 -38
- package/tests/web-search.test.ts +155 -155
- package/tests/workflow-graph.test.ts +279 -279
- package/tutorial/customer-service-agent/README.md +612 -612
- package/tutorial/customer-service-agent/SOUL.md +26 -26
- package/tutorial/customer-service-agent/agent.yaml +63 -63
- package/tutorial/customer-service-agent/package.json +19 -19
- package/tutorial/customer-service-agent/src/index.ts +69 -69
- package/tutorial/customer-service-agent/src/skills/faq.ts +27 -27
- package/tutorial/customer-service-agent/src/skills/ticket.ts +22 -22
- package/tutorial/customer-service-agent/tsconfig.json +14 -14
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
import { BaseChannel } from './index';
|
|
2
|
-
import type { Message } from '../core/types';
|
|
3
|
-
|
|
4
|
-
export interface GoogleChatChannelConfig {
|
|
5
|
-
webhookUrl: string;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export class GoogleChatChannel extends BaseChannel {
|
|
9
|
-
readonly type = 'googlechat';
|
|
10
|
-
private config: GoogleChatChannelConfig;
|
|
11
|
-
private running = false;
|
|
12
|
-
|
|
13
|
-
constructor(config: GoogleChatChannelConfig) {
|
|
14
|
-
super();
|
|
15
|
-
if (!config.webhookUrl) {
|
|
16
|
-
throw new Error('GoogleChatChannel requires webhookUrl in config');
|
|
17
|
-
}
|
|
18
|
-
this.config = config;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
async start(): Promise<void> {
|
|
22
|
-
this.running = true;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
async stop(): Promise<void> {
|
|
26
|
-
this.running = false;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
async send(spaceId: string, text: string): Promise<void> {
|
|
30
|
-
if (!this.running) {
|
|
31
|
-
throw new Error('GoogleChatChannel: not started. Call start() first.');
|
|
32
|
-
}
|
|
33
|
-
const res = await fetch(this.config.webhookUrl, {
|
|
34
|
-
method: 'POST',
|
|
35
|
-
headers: { 'Content-Type': 'application/json' },
|
|
36
|
-
body: JSON.stringify({ text }),
|
|
37
|
-
});
|
|
38
|
-
if (!res.ok) {
|
|
39
|
-
throw new Error(`Google Chat webhook failed: ${res.status}`);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
1
|
+
import { BaseChannel } from './index';
|
|
2
|
+
import type { Message } from '../core/types';
|
|
3
|
+
|
|
4
|
+
export interface GoogleChatChannelConfig {
|
|
5
|
+
webhookUrl: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export class GoogleChatChannel extends BaseChannel {
|
|
9
|
+
readonly type = 'googlechat';
|
|
10
|
+
private config: GoogleChatChannelConfig;
|
|
11
|
+
private running = false;
|
|
12
|
+
|
|
13
|
+
constructor(config: GoogleChatChannelConfig) {
|
|
14
|
+
super();
|
|
15
|
+
if (!config.webhookUrl) {
|
|
16
|
+
throw new Error('GoogleChatChannel requires webhookUrl in config');
|
|
17
|
+
}
|
|
18
|
+
this.config = config;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async start(): Promise<void> {
|
|
22
|
+
this.running = true;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async stop(): Promise<void> {
|
|
26
|
+
this.running = false;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async send(spaceId: string, text: string): Promise<void> {
|
|
30
|
+
if (!this.running) {
|
|
31
|
+
throw new Error('GoogleChatChannel: not started. Call start() first.');
|
|
32
|
+
}
|
|
33
|
+
const res = await fetch(this.config.webhookUrl, {
|
|
34
|
+
method: 'POST',
|
|
35
|
+
headers: { 'Content-Type': 'application/json' },
|
|
36
|
+
body: JSON.stringify({ text }),
|
|
37
|
+
});
|
|
38
|
+
if (!res.ok) {
|
|
39
|
+
throw new Error(`Google Chat webhook failed: ${res.status}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
package/src/channels/imessage.ts
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
import { BaseChannel } from './index';
|
|
2
|
-
import type { Message } from '../core/types';
|
|
3
|
-
|
|
4
|
-
export interface IMessageChannelConfig {
|
|
5
|
-
applescriptPath?: string;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export class IMessageChannel extends BaseChannel {
|
|
9
|
-
readonly type = 'imessage';
|
|
10
|
-
private config: IMessageChannelConfig;
|
|
11
|
-
|
|
12
|
-
constructor(config: IMessageChannelConfig = {}) {
|
|
13
|
-
super();
|
|
14
|
-
this.config = config;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
async start(): Promise<void> {
|
|
18
|
-
try {
|
|
19
|
-
require('macOS iMessage CLI');
|
|
20
|
-
} catch {
|
|
21
|
-
throw new Error('Install macOS iMessage CLI to use the IMessageChannel. Run: npm install macOS iMessage CLI');
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
async stop(): Promise<void> {
|
|
26
|
-
// cleanup
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
async send(chatId: string, text: string): Promise<void> {
|
|
30
|
-
throw new Error('IMessageChannel: not yet connected. Call start() first.');
|
|
31
|
-
}
|
|
1
|
+
import { BaseChannel } from './index';
|
|
2
|
+
import type { Message } from '../core/types';
|
|
3
|
+
|
|
4
|
+
export interface IMessageChannelConfig {
|
|
5
|
+
applescriptPath?: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export class IMessageChannel extends BaseChannel {
|
|
9
|
+
readonly type = 'imessage';
|
|
10
|
+
private config: IMessageChannelConfig;
|
|
11
|
+
|
|
12
|
+
constructor(config: IMessageChannelConfig = {}) {
|
|
13
|
+
super();
|
|
14
|
+
this.config = config;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
async start(): Promise<void> {
|
|
18
|
+
try {
|
|
19
|
+
require('macOS iMessage CLI');
|
|
20
|
+
} catch {
|
|
21
|
+
throw new Error('Install macOS iMessage CLI to use the IMessageChannel. Run: npm install macOS iMessage CLI');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async stop(): Promise<void> {
|
|
26
|
+
// cleanup
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async send(chatId: string, text: string): Promise<void> {
|
|
30
|
+
throw new Error('IMessageChannel: not yet connected. Call start() first.');
|
|
31
|
+
}
|
|
32
32
|
}
|
package/src/channels/irc.ts
CHANGED
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
import { BaseChannel } from './index';
|
|
2
|
-
import type { Message } from '../core/types';
|
|
3
|
-
|
|
4
|
-
export interface IRCChannelConfig {
|
|
5
|
-
host: string;
|
|
6
|
-
port?: number;
|
|
7
|
-
nick: string;
|
|
8
|
-
channels: string[];
|
|
9
|
-
tls?: boolean;
|
|
10
|
-
password?: string;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export class IRCChannel extends BaseChannel {
|
|
14
|
-
readonly type = 'irc';
|
|
15
|
-
private config: IRCChannelConfig;
|
|
16
|
-
private client: any = null;
|
|
17
|
-
private running = false;
|
|
18
|
-
|
|
19
|
-
constructor(config: IRCChannelConfig) {
|
|
20
|
-
super();
|
|
21
|
-
if (!config.host || !config.nick || !config.channels?.length) {
|
|
22
|
-
throw new Error('IRCChannel requires host, nick, and channels in config');
|
|
23
|
-
}
|
|
24
|
-
this.config = config;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
async start(): Promise<void> {
|
|
28
|
-
let IRC: any;
|
|
29
|
-
try {
|
|
30
|
-
IRC = require('irc-framework');
|
|
31
|
-
} catch {
|
|
32
|
-
throw new Error('Install irc-framework to use the IRCChannel. Run: npm install irc-framework');
|
|
33
|
-
}
|
|
34
|
-
this.client = new IRC.Client();
|
|
35
|
-
this.client.connect({
|
|
36
|
-
host: this.config.host,
|
|
37
|
-
port: this.config.port ?? (this.config.tls ? 6697 : 6667),
|
|
38
|
-
nick: this.config.nick,
|
|
39
|
-
tls: this.config.tls ?? false,
|
|
40
|
-
password: this.config.password,
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
await new Promise<void>((resolve, reject) => {
|
|
44
|
-
this.client.on('registered', () => {
|
|
45
|
-
for (const ch of this.config.channels) {
|
|
46
|
-
this.client.join(ch);
|
|
47
|
-
}
|
|
48
|
-
resolve();
|
|
49
|
-
});
|
|
50
|
-
this.client.on('error', (err: any) => reject(new Error(`IRC connection error: ${err.message || err}`)));
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
this.running = true;
|
|
54
|
-
|
|
55
|
-
this.client.on('privmsg', async (event: any) => {
|
|
56
|
-
if (!this.handler) return;
|
|
57
|
-
const msg: Message = {
|
|
58
|
-
id: Date.now().toString(),
|
|
59
|
-
role: 'user',
|
|
60
|
-
content: event.message,
|
|
61
|
-
timestamp: Date.now(),
|
|
62
|
-
metadata: { channel: event.target, nick: event.nick },
|
|
63
|
-
};
|
|
64
|
-
await this.handler(msg);
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
async stop(): Promise<void> {
|
|
69
|
-
if (this.client) {
|
|
70
|
-
this.client.quit('Goodbye');
|
|
71
|
-
this.client = null;
|
|
72
|
-
}
|
|
73
|
-
this.running = false;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
async send(target: string, text: string): Promise<void> {
|
|
77
|
-
if (!this.running || !this.client) {
|
|
78
|
-
throw new Error('IRCChannel: not started. Call start() first.');
|
|
79
|
-
}
|
|
80
|
-
this.client.say(target, text);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
1
|
+
import { BaseChannel } from './index';
|
|
2
|
+
import type { Message } from '../core/types';
|
|
3
|
+
|
|
4
|
+
export interface IRCChannelConfig {
|
|
5
|
+
host: string;
|
|
6
|
+
port?: number;
|
|
7
|
+
nick: string;
|
|
8
|
+
channels: string[];
|
|
9
|
+
tls?: boolean;
|
|
10
|
+
password?: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export class IRCChannel extends BaseChannel {
|
|
14
|
+
readonly type = 'irc';
|
|
15
|
+
private config: IRCChannelConfig;
|
|
16
|
+
private client: any = null;
|
|
17
|
+
private running = false;
|
|
18
|
+
|
|
19
|
+
constructor(config: IRCChannelConfig) {
|
|
20
|
+
super();
|
|
21
|
+
if (!config.host || !config.nick || !config.channels?.length) {
|
|
22
|
+
throw new Error('IRCChannel requires host, nick, and channels in config');
|
|
23
|
+
}
|
|
24
|
+
this.config = config;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async start(): Promise<void> {
|
|
28
|
+
let IRC: any;
|
|
29
|
+
try {
|
|
30
|
+
IRC = require('irc-framework');
|
|
31
|
+
} catch {
|
|
32
|
+
throw new Error('Install irc-framework to use the IRCChannel. Run: npm install irc-framework');
|
|
33
|
+
}
|
|
34
|
+
this.client = new IRC.Client();
|
|
35
|
+
this.client.connect({
|
|
36
|
+
host: this.config.host,
|
|
37
|
+
port: this.config.port ?? (this.config.tls ? 6697 : 6667),
|
|
38
|
+
nick: this.config.nick,
|
|
39
|
+
tls: this.config.tls ?? false,
|
|
40
|
+
password: this.config.password,
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
await new Promise<void>((resolve, reject) => {
|
|
44
|
+
this.client.on('registered', () => {
|
|
45
|
+
for (const ch of this.config.channels) {
|
|
46
|
+
this.client.join(ch);
|
|
47
|
+
}
|
|
48
|
+
resolve();
|
|
49
|
+
});
|
|
50
|
+
this.client.on('error', (err: any) => reject(new Error(`IRC connection error: ${err.message || err}`)));
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
this.running = true;
|
|
54
|
+
|
|
55
|
+
this.client.on('privmsg', async (event: any) => {
|
|
56
|
+
if (!this.handler) return;
|
|
57
|
+
const msg: Message = {
|
|
58
|
+
id: Date.now().toString(),
|
|
59
|
+
role: 'user',
|
|
60
|
+
content: event.message,
|
|
61
|
+
timestamp: Date.now(),
|
|
62
|
+
metadata: { channel: event.target, nick: event.nick },
|
|
63
|
+
};
|
|
64
|
+
await this.handler(msg);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async stop(): Promise<void> {
|
|
69
|
+
if (this.client) {
|
|
70
|
+
this.client.quit('Goodbye');
|
|
71
|
+
this.client = null;
|
|
72
|
+
}
|
|
73
|
+
this.running = false;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async send(target: string, text: string): Promise<void> {
|
|
77
|
+
if (!this.running || !this.client) {
|
|
78
|
+
throw new Error('IRCChannel: not started. Call start() first.');
|
|
79
|
+
}
|
|
80
|
+
this.client.say(target, text);
|
|
81
|
+
}
|
|
82
|
+
}
|
package/src/channels/line.ts
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
import { BaseChannel } from './index';
|
|
2
|
-
import type { Message } from '../core/types';
|
|
3
|
-
|
|
4
|
-
export interface LINEChannelConfig {
|
|
5
|
-
channelAccessToken?: string;
|
|
6
|
-
channelSecret?: string;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export class LINEChannel extends BaseChannel {
|
|
10
|
-
readonly type = 'line';
|
|
11
|
-
private config: LINEChannelConfig;
|
|
12
|
-
|
|
13
|
-
constructor(config: LINEChannelConfig = {}) {
|
|
14
|
-
super();
|
|
15
|
-
this.config = config;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
async start(): Promise<void> {
|
|
19
|
-
try {
|
|
20
|
-
require('@line/bot-sdk');
|
|
21
|
-
} catch {
|
|
22
|
-
throw new Error('Install @line/bot-sdk to use the LINEChannel. Run: npm install @line/bot-sdk');
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
async stop(): Promise<void> {
|
|
27
|
-
// cleanup
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
async send(chatId: string, text: string): Promise<void> {
|
|
31
|
-
throw new Error('LINEChannel: not yet connected. Call start() first.');
|
|
32
|
-
}
|
|
1
|
+
import { BaseChannel } from './index';
|
|
2
|
+
import type { Message } from '../core/types';
|
|
3
|
+
|
|
4
|
+
export interface LINEChannelConfig {
|
|
5
|
+
channelAccessToken?: string;
|
|
6
|
+
channelSecret?: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export class LINEChannel extends BaseChannel {
|
|
10
|
+
readonly type = 'line';
|
|
11
|
+
private config: LINEChannelConfig;
|
|
12
|
+
|
|
13
|
+
constructor(config: LINEChannelConfig = {}) {
|
|
14
|
+
super();
|
|
15
|
+
this.config = config;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async start(): Promise<void> {
|
|
19
|
+
try {
|
|
20
|
+
require('@line/bot-sdk');
|
|
21
|
+
} catch {
|
|
22
|
+
throw new Error('Install @line/bot-sdk to use the LINEChannel. Run: npm install @line/bot-sdk');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async stop(): Promise<void> {
|
|
27
|
+
// cleanup
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async send(chatId: string, text: string): Promise<void> {
|
|
31
|
+
throw new Error('LINEChannel: not yet connected. Call start() first.');
|
|
32
|
+
}
|
|
33
33
|
}
|
package/src/channels/matrix.ts
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import { BaseChannel } from './index';
|
|
2
|
-
import type { Message } from '../core/types';
|
|
3
|
-
|
|
4
|
-
export interface MatrixChannelConfig {
|
|
5
|
-
homeserverUrl?: string;
|
|
6
|
-
accessToken?: string;
|
|
7
|
-
userId?: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export class MatrixChannel extends BaseChannel {
|
|
11
|
-
readonly type = 'matrix';
|
|
12
|
-
private config: MatrixChannelConfig;
|
|
13
|
-
|
|
14
|
-
constructor(config: MatrixChannelConfig = {}) {
|
|
15
|
-
super();
|
|
16
|
-
this.config = config;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
async start(): Promise<void> {
|
|
20
|
-
try {
|
|
21
|
-
require('matrix-js-sdk');
|
|
22
|
-
} catch {
|
|
23
|
-
throw new Error('Install matrix-js-sdk to use the MatrixChannel. Run: npm install matrix-js-sdk');
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
async stop(): Promise<void> {
|
|
28
|
-
// cleanup
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
async send(chatId: string, text: string): Promise<void> {
|
|
32
|
-
throw new Error('MatrixChannel: not yet connected. Call start() first.');
|
|
33
|
-
}
|
|
1
|
+
import { BaseChannel } from './index';
|
|
2
|
+
import type { Message } from '../core/types';
|
|
3
|
+
|
|
4
|
+
export interface MatrixChannelConfig {
|
|
5
|
+
homeserverUrl?: string;
|
|
6
|
+
accessToken?: string;
|
|
7
|
+
userId?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export class MatrixChannel extends BaseChannel {
|
|
11
|
+
readonly type = 'matrix';
|
|
12
|
+
private config: MatrixChannelConfig;
|
|
13
|
+
|
|
14
|
+
constructor(config: MatrixChannelConfig = {}) {
|
|
15
|
+
super();
|
|
16
|
+
this.config = config;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async start(): Promise<void> {
|
|
20
|
+
try {
|
|
21
|
+
require('matrix-js-sdk');
|
|
22
|
+
} catch {
|
|
23
|
+
throw new Error('Install matrix-js-sdk to use the MatrixChannel. Run: npm install matrix-js-sdk');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async stop(): Promise<void> {
|
|
28
|
+
// cleanup
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async send(chatId: string, text: string): Promise<void> {
|
|
32
|
+
throw new Error('MatrixChannel: not yet connected. Call start() first.');
|
|
33
|
+
}
|
|
34
34
|
}
|
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
import { BaseChannel } from './index';
|
|
2
|
-
import type { Message } from '../core/types';
|
|
3
|
-
|
|
4
|
-
export interface MattermostChannelConfig {
|
|
5
|
-
serverUrl: string;
|
|
6
|
-
token: string;
|
|
7
|
-
teamId?: string;
|
|
8
|
-
defaultChannelId?: string;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export class MattermostChannel extends BaseChannel {
|
|
12
|
-
readonly type = 'mattermost';
|
|
13
|
-
private config: MattermostChannelConfig;
|
|
14
|
-
private running = false;
|
|
15
|
-
private ws: any = null;
|
|
16
|
-
|
|
17
|
-
constructor(config: MattermostChannelConfig) {
|
|
18
|
-
super();
|
|
19
|
-
if (!config.serverUrl || !config.token) {
|
|
20
|
-
throw new Error('MattermostChannel requires serverUrl and token in config');
|
|
21
|
-
}
|
|
22
|
-
this.config = config;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
async start(): Promise<void> {
|
|
26
|
-
// Verify connection by hitting the API
|
|
27
|
-
const res = await fetch(`${this.config.serverUrl}/api/v4/users/me`, {
|
|
28
|
-
headers: { Authorization: `Bearer ${this.config.token}` },
|
|
29
|
-
}).catch(() => null);
|
|
30
|
-
this.running = true;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
async stop(): Promise<void> {
|
|
34
|
-
if (this.ws) {
|
|
35
|
-
this.ws.close();
|
|
36
|
-
this.ws = null;
|
|
37
|
-
}
|
|
38
|
-
this.running = false;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
async send(channelId: string, text: string): Promise<void> {
|
|
42
|
-
if (!this.running) {
|
|
43
|
-
throw new Error('MattermostChannel: not started. Call start() first.');
|
|
44
|
-
}
|
|
45
|
-
const res = await fetch(`${this.config.serverUrl}/api/v4/posts`, {
|
|
46
|
-
method: 'POST',
|
|
47
|
-
headers: {
|
|
48
|
-
Authorization: `Bearer ${this.config.token}`,
|
|
49
|
-
'Content-Type': 'application/json',
|
|
50
|
-
},
|
|
51
|
-
body: JSON.stringify({ channel_id: channelId, message: text }),
|
|
52
|
-
});
|
|
53
|
-
if (!res.ok) {
|
|
54
|
-
throw new Error(`Mattermost API failed: ${res.status}`);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
1
|
+
import { BaseChannel } from './index';
|
|
2
|
+
import type { Message } from '../core/types';
|
|
3
|
+
|
|
4
|
+
export interface MattermostChannelConfig {
|
|
5
|
+
serverUrl: string;
|
|
6
|
+
token: string;
|
|
7
|
+
teamId?: string;
|
|
8
|
+
defaultChannelId?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export class MattermostChannel extends BaseChannel {
|
|
12
|
+
readonly type = 'mattermost';
|
|
13
|
+
private config: MattermostChannelConfig;
|
|
14
|
+
private running = false;
|
|
15
|
+
private ws: any = null;
|
|
16
|
+
|
|
17
|
+
constructor(config: MattermostChannelConfig) {
|
|
18
|
+
super();
|
|
19
|
+
if (!config.serverUrl || !config.token) {
|
|
20
|
+
throw new Error('MattermostChannel requires serverUrl and token in config');
|
|
21
|
+
}
|
|
22
|
+
this.config = config;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async start(): Promise<void> {
|
|
26
|
+
// Verify connection by hitting the API
|
|
27
|
+
const res = await fetch(`${this.config.serverUrl}/api/v4/users/me`, {
|
|
28
|
+
headers: { Authorization: `Bearer ${this.config.token}` },
|
|
29
|
+
}).catch(() => null);
|
|
30
|
+
this.running = true;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async stop(): Promise<void> {
|
|
34
|
+
if (this.ws) {
|
|
35
|
+
this.ws.close();
|
|
36
|
+
this.ws = null;
|
|
37
|
+
}
|
|
38
|
+
this.running = false;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async send(channelId: string, text: string): Promise<void> {
|
|
42
|
+
if (!this.running) {
|
|
43
|
+
throw new Error('MattermostChannel: not started. Call start() first.');
|
|
44
|
+
}
|
|
45
|
+
const res = await fetch(`${this.config.serverUrl}/api/v4/posts`, {
|
|
46
|
+
method: 'POST',
|
|
47
|
+
headers: {
|
|
48
|
+
Authorization: `Bearer ${this.config.token}`,
|
|
49
|
+
'Content-Type': 'application/json',
|
|
50
|
+
},
|
|
51
|
+
body: JSON.stringify({ channel_id: channelId, message: text }),
|
|
52
|
+
});
|
|
53
|
+
if (!res.ok) {
|
|
54
|
+
throw new Error(`Mattermost API failed: ${res.status}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
package/src/channels/msteams.ts
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
import { BaseChannel } from './index';
|
|
2
|
-
import type { Message } from '../core/types';
|
|
3
|
-
|
|
4
|
-
export interface MSTeamsChannelConfig {
|
|
5
|
-
appId?: string;
|
|
6
|
-
appPassword?: string;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export class MSTeamsChannel extends BaseChannel {
|
|
10
|
-
readonly type = 'msteams';
|
|
11
|
-
private config: MSTeamsChannelConfig;
|
|
12
|
-
|
|
13
|
-
constructor(config: MSTeamsChannelConfig = {}) {
|
|
14
|
-
super();
|
|
15
|
-
this.config = config;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
async start(): Promise<void> {
|
|
19
|
-
try {
|
|
20
|
-
require('botframework-connector');
|
|
21
|
-
} catch {
|
|
22
|
-
throw new Error('Install botframework-connector to use the MSTeamsChannel. Run: npm install botframework-connector');
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
async stop(): Promise<void> {
|
|
27
|
-
// cleanup
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
async send(chatId: string, text: string): Promise<void> {
|
|
31
|
-
throw new Error('MSTeamsChannel: not yet connected. Call start() first.');
|
|
32
|
-
}
|
|
1
|
+
import { BaseChannel } from './index';
|
|
2
|
+
import type { Message } from '../core/types';
|
|
3
|
+
|
|
4
|
+
export interface MSTeamsChannelConfig {
|
|
5
|
+
appId?: string;
|
|
6
|
+
appPassword?: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export class MSTeamsChannel extends BaseChannel {
|
|
10
|
+
readonly type = 'msteams';
|
|
11
|
+
private config: MSTeamsChannelConfig;
|
|
12
|
+
|
|
13
|
+
constructor(config: MSTeamsChannelConfig = {}) {
|
|
14
|
+
super();
|
|
15
|
+
this.config = config;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async start(): Promise<void> {
|
|
19
|
+
try {
|
|
20
|
+
require('botframework-connector');
|
|
21
|
+
} catch {
|
|
22
|
+
throw new Error('Install botframework-connector to use the MSTeamsChannel. Run: npm install botframework-connector');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async stop(): Promise<void> {
|
|
27
|
+
// cleanup
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async send(chatId: string, text: string): Promise<void> {
|
|
31
|
+
throw new Error('MSTeamsChannel: not yet connected. Call start() first.');
|
|
32
|
+
}
|
|
33
33
|
}
|