@openclaw/crabline 0.0.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 (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +226 -0
  3. package/dist/src/bin/crabline.d.ts +2 -0
  4. package/dist/src/bin/crabline.js +7 -0
  5. package/dist/src/bin/crabline.js.map +1 -0
  6. package/dist/src/cli/program.d.ts +5 -0
  7. package/dist/src/cli/program.js +295 -0
  8. package/dist/src/cli/program.js.map +1 -0
  9. package/dist/src/config/load.d.ts +6 -0
  10. package/dist/src/config/load.js +41 -0
  11. package/dist/src/config/load.js.map +1 -0
  12. package/dist/src/config/schema.d.ts +1571 -0
  13. package/dist/src/config/schema.js +528 -0
  14. package/dist/src/config/schema.js.map +1 -0
  15. package/dist/src/core/errors.d.ts +12 -0
  16. package/dist/src/core/errors.js +28 -0
  17. package/dist/src/core/errors.js.map +1 -0
  18. package/dist/src/core/exit-codes.d.ts +13 -0
  19. package/dist/src/core/exit-codes.js +13 -0
  20. package/dist/src/core/exit-codes.js.map +1 -0
  21. package/dist/src/core/matcher.d.ts +2 -0
  22. package/dist/src/core/matcher.js +30 -0
  23. package/dist/src/core/matcher.js.map +1 -0
  24. package/dist/src/core/message-template.d.ts +2 -0
  25. package/dist/src/core/message-template.js +20 -0
  26. package/dist/src/core/message-template.js.map +1 -0
  27. package/dist/src/core/nonces.d.ts +2 -0
  28. package/dist/src/core/nonces.js +11 -0
  29. package/dist/src/core/nonces.js.map +1 -0
  30. package/dist/src/core/reporters.d.ts +3 -0
  31. package/dist/src/core/reporters.js +23 -0
  32. package/dist/src/core/reporters.js.map +1 -0
  33. package/dist/src/core/run.d.ts +30 -0
  34. package/dist/src/core/run.js +240 -0
  35. package/dist/src/core/run.js.map +1 -0
  36. package/dist/src/fake-servers/index.d.ts +10 -0
  37. package/dist/src/fake-servers/index.js +12 -0
  38. package/dist/src/fake-servers/index.js.map +1 -0
  39. package/dist/src/fake-servers/telegram.d.ts +29 -0
  40. package/dist/src/fake-servers/telegram.js +346 -0
  41. package/dist/src/fake-servers/telegram.js.map +1 -0
  42. package/dist/src/index.d.ts +15 -0
  43. package/dist/src/index.js +9 -0
  44. package/dist/src/index.js.map +1 -0
  45. package/dist/src/openclaw.d.ts +102 -0
  46. package/dist/src/openclaw.js +289 -0
  47. package/dist/src/openclaw.js.map +1 -0
  48. package/dist/src/providers/builtin/discord.d.ts +15 -0
  49. package/dist/src/providers/builtin/discord.js +92 -0
  50. package/dist/src/providers/builtin/discord.js.map +1 -0
  51. package/dist/src/providers/builtin/feishu.d.ts +10 -0
  52. package/dist/src/providers/builtin/feishu.js +95 -0
  53. package/dist/src/providers/builtin/feishu.js.map +1 -0
  54. package/dist/src/providers/builtin/googlechat.d.ts +11 -0
  55. package/dist/src/providers/builtin/googlechat.js +83 -0
  56. package/dist/src/providers/builtin/googlechat.js.map +1 -0
  57. package/dist/src/providers/builtin/imessage.d.ts +11 -0
  58. package/dist/src/providers/builtin/imessage.js +67 -0
  59. package/dist/src/providers/builtin/imessage.js.map +1 -0
  60. package/dist/src/providers/builtin/loopback.d.ts +63 -0
  61. package/dist/src/providers/builtin/loopback.js +174 -0
  62. package/dist/src/providers/builtin/loopback.js.map +1 -0
  63. package/dist/src/providers/builtin/matrix.d.ts +21 -0
  64. package/dist/src/providers/builtin/matrix.js +84 -0
  65. package/dist/src/providers/builtin/matrix.js.map +1 -0
  66. package/dist/src/providers/builtin/mattermost.d.ts +11 -0
  67. package/dist/src/providers/builtin/mattermost.js +67 -0
  68. package/dist/src/providers/builtin/mattermost.js.map +1 -0
  69. package/dist/src/providers/builtin/msteams.d.ts +13 -0
  70. package/dist/src/providers/builtin/msteams.js +72 -0
  71. package/dist/src/providers/builtin/msteams.js.map +1 -0
  72. package/dist/src/providers/builtin/native-local-mock.d.ts +48 -0
  73. package/dist/src/providers/builtin/native-local-mock.js +119 -0
  74. package/dist/src/providers/builtin/native-local-mock.js.map +1 -0
  75. package/dist/src/providers/builtin/script.d.ts +39 -0
  76. package/dist/src/providers/builtin/script.js +206 -0
  77. package/dist/src/providers/builtin/script.js.map +1 -0
  78. package/dist/src/providers/builtin/slack.d.ts +6 -0
  79. package/dist/src/providers/builtin/slack.js +106 -0
  80. package/dist/src/providers/builtin/slack.js.map +1 -0
  81. package/dist/src/providers/builtin/telegram.d.ts +21 -0
  82. package/dist/src/providers/builtin/telegram.js +123 -0
  83. package/dist/src/providers/builtin/telegram.js.map +1 -0
  84. package/dist/src/providers/builtin/whatsapp.d.ts +19 -0
  85. package/dist/src/providers/builtin/whatsapp.js +90 -0
  86. package/dist/src/providers/builtin/whatsapp.js.map +1 -0
  87. package/dist/src/providers/builtin/zalo.d.ts +17 -0
  88. package/dist/src/providers/builtin/zalo.js +70 -0
  89. package/dist/src/providers/builtin/zalo.js.map +1 -0
  90. package/dist/src/providers/catalog.d.ts +69 -0
  91. package/dist/src/providers/catalog.js +95 -0
  92. package/dist/src/providers/catalog.js.map +1 -0
  93. package/dist/src/providers/local-mock.d.ts +41 -0
  94. package/dist/src/providers/local-mock.js +243 -0
  95. package/dist/src/providers/local-mock.js.map +1 -0
  96. package/dist/src/providers/recorder.d.ts +19 -0
  97. package/dist/src/providers/recorder.js +160 -0
  98. package/dist/src/providers/recorder.js.map +1 -0
  99. package/dist/src/providers/registry.d.ts +8 -0
  100. package/dist/src/providers/registry.js +171 -0
  101. package/dist/src/providers/registry.js.map +1 -0
  102. package/dist/src/providers/types.d.ts +94 -0
  103. package/dist/src/providers/types.js +2 -0
  104. package/dist/src/providers/types.js.map +1 -0
  105. package/dist/src/providers/webhook-server.d.ts +12 -0
  106. package/dist/src/providers/webhook-server.js +118 -0
  107. package/dist/src/providers/webhook-server.js.map +1 -0
  108. package/docs/channel-setup.md +181 -0
  109. package/fixtures/examples/crabline.example.yaml +195 -0
  110. package/fixtures/examples/openclaw-bridge.yaml +125 -0
  111. package/package.json +64 -0
@@ -0,0 +1,123 @@
1
+ import path from "node:path";
2
+ import { CrablineError } from "../../core/errors.js";
3
+ import { LocalMockProviderAdapter } from "../local-mock.js";
4
+ import { authorFromBotFlag, createNativeTargetCodec, genericMockPayloadWithNativeThread, isRecord, optionalRecord, optionalString, optionalStringish, requireNativeId, requireNativeInboundId, } from "./native-local-mock.js";
5
+ export function resolveTelegramAdapterConfig(config, env = process.env) {
6
+ const telegramConfig = config.telegram;
7
+ return {
8
+ mode: telegramConfig?.mode ?? "auto",
9
+ ...((telegramConfig?.apiUrl ?? env.TELEGRAM_API_BASE_URL)
10
+ ? { apiUrl: telegramConfig?.apiUrl ?? env.TELEGRAM_API_BASE_URL }
11
+ : {}),
12
+ ...((telegramConfig?.secretToken ?? env.TELEGRAM_WEBHOOK_SECRET_TOKEN)
13
+ ? { secretToken: telegramConfig?.secretToken ?? env.TELEGRAM_WEBHOOK_SECRET_TOKEN }
14
+ : {}),
15
+ ...((telegramConfig?.userName ?? env.TELEGRAM_BOT_USERNAME)
16
+ ? { userName: telegramConfig?.userName ?? env.TELEGRAM_BOT_USERNAME }
17
+ : {}),
18
+ };
19
+ }
20
+ function toRecorderPath(providerId, config) {
21
+ const configuredPath = config.telegram?.recorder.path;
22
+ return configuredPath
23
+ ? path.resolve(configuredPath)
24
+ : path.resolve(".crabline", "recorders", `${providerId}.jsonl`);
25
+ }
26
+ const TELEGRAM_CHAT_ID_RULE = {
27
+ example: "-1001234567890 or @channelusername",
28
+ name: "Telegram chat id",
29
+ pattern: /^(?:-?\d+|@[A-Za-z][A-Za-z0-9_]{4,31})$/u,
30
+ };
31
+ const TELEGRAM_MESSAGE_THREAD_ID_RULE = {
32
+ example: "42",
33
+ name: "Telegram message_thread_id",
34
+ pattern: /^\d+$/u,
35
+ };
36
+ const TELEGRAM_BASE_CODEC = createNativeTargetCodec({
37
+ channel: TELEGRAM_CHAT_ID_RULE,
38
+ channelLabel: "Telegram chat_id",
39
+ thread: TELEGRAM_MESSAGE_THREAD_ID_RULE,
40
+ threadLabel: "Telegram message_thread_id",
41
+ });
42
+ const TELEGRAM_CODEC = {
43
+ normalize(target) {
44
+ const normalized = TELEGRAM_BASE_CODEC.normalize({
45
+ ...target,
46
+ threadId: undefined,
47
+ });
48
+ if (!target.threadId) {
49
+ return normalized;
50
+ }
51
+ const topicId = requireNativeId(target.threadId, TELEGRAM_MESSAGE_THREAD_ID_RULE, "Telegram message_thread_id");
52
+ return {
53
+ ...normalized,
54
+ threadId: `${normalized.channelId}:${topicId}`,
55
+ };
56
+ },
57
+ resolveThreadId(target) {
58
+ const normalized = this.normalize(target);
59
+ return normalized.threadId ?? normalized.channelId ?? normalized.id;
60
+ },
61
+ };
62
+ export function normalizeTelegramWebhookPayload(payload) {
63
+ if (!isRecord(payload)) {
64
+ throw new CrablineError("Telegram webhook payload must be an object", { kind: "inbound" });
65
+ }
66
+ const message = optionalRecord(payload, "message") ??
67
+ optionalRecord(payload, "edited_message") ??
68
+ optionalRecord(payload, "channel_post");
69
+ if (!message) {
70
+ return genericMockPayloadWithNativeThread({
71
+ channelRule: TELEGRAM_CHAT_ID_RULE,
72
+ payload,
73
+ threadRule: TELEGRAM_MESSAGE_THREAD_ID_RULE,
74
+ });
75
+ }
76
+ const chat = optionalRecord(message, "chat");
77
+ const chatId = chat ? optionalStringish(chat, "id") : undefined;
78
+ const text = optionalString(message, "text") ?? optionalString(message, "caption");
79
+ if (!chatId || !text) {
80
+ throw new CrablineError("Telegram update requires message.chat.id and message.text", {
81
+ kind: "inbound",
82
+ });
83
+ }
84
+ const topicId = optionalStringish(message, "message_thread_id");
85
+ const normalizedChatId = requireNativeInboundId(chatId, TELEGRAM_CHAT_ID_RULE, "Telegram message.chat.id");
86
+ const from = optionalRecord(message, "from");
87
+ return {
88
+ author: authorFromBotFlag(from?.is_bot === true),
89
+ ...(optionalStringish(message, "message_id")
90
+ ? { id: optionalStringish(message, "message_id") }
91
+ : optionalStringish(payload, "update_id")
92
+ ? { id: optionalStringish(payload, "update_id") }
93
+ : {}),
94
+ raw: payload,
95
+ text,
96
+ threadId: topicId
97
+ ? `${normalizedChatId}:${requireNativeInboundId(topicId, TELEGRAM_MESSAGE_THREAD_ID_RULE, "Telegram message.message_thread_id")}`
98
+ : normalizedChatId,
99
+ };
100
+ }
101
+ export class TelegramProviderAdapter extends LocalMockProviderAdapter {
102
+ constructor(id, config, _userName) {
103
+ super({
104
+ codec: TELEGRAM_CODEC,
105
+ config,
106
+ id,
107
+ options: {
108
+ defaultWebhook: {
109
+ host: "127.0.0.1",
110
+ path: "/telegram/webhook",
111
+ port: 8790,
112
+ },
113
+ endpointLabel: "webhook endpoint",
114
+ normalizeWebhookPayload: normalizeTelegramWebhookPayload,
115
+ platform: "telegram",
116
+ publicUrl: config.telegram?.webhook.publicUrl,
117
+ recorderPath: toRecorderPath(id, config),
118
+ webhook: config.telegram?.webhook,
119
+ },
120
+ });
121
+ }
122
+ }
123
+ //# sourceMappingURL=telegram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../../../src/providers/builtin/telegram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ProviderConfig } from "../../config/schema.js";
2
+ import { LocalMockProviderAdapter } from "../local-mock.js";
3
+ import type { ProviderAdapter } from "../types.js";
4
+ export declare function resolveWhatsAppAdapterConfig(config: ProviderConfig, env?: NodeJS.ProcessEnv): {
5
+ accessToken: string;
6
+ appSecret: string;
7
+ phoneNumberId: string;
8
+ verifyToken: string;
9
+ };
10
+ export declare class WhatsAppProviderAdapter extends LocalMockProviderAdapter implements ProviderAdapter {
11
+ constructor(id: string, config: ProviderConfig, _userName: string, _runtime?: unknown);
12
+ }
13
+ export declare function normalizeWhatsAppWebhookPayload(payload: unknown): {
14
+ author?: "assistant" | "system" | "user" | undefined;
15
+ authorIsBot?: boolean;
16
+ id?: string | undefined;
17
+ raw: {};
18
+ text?: string | undefined;
19
+ };
@@ -0,0 +1,90 @@
1
+ import path from "node:path";
2
+ import { CrablineError } from "../../core/errors.js";
3
+ import { LocalMockProviderAdapter } from "../local-mock.js";
4
+ import { authorFromBotFlag, createNativeTargetCodec, genericMockPayloadWithNativeThread, isRecord, optionalRecord, optionalString, requireNativeInboundId, } from "./native-local-mock.js";
5
+ const WHATSAPP_WA_ID_RULE = {
6
+ example: "15551234567",
7
+ name: "WhatsApp wa_id",
8
+ pattern: /^\d{7,15}$/u,
9
+ };
10
+ export function resolveWhatsAppAdapterConfig(config, env = process.env) {
11
+ return {
12
+ accessToken: config.whatsapp?.accessToken ?? env.WHATSAPP_ACCESS_TOKEN ?? "local-mock-token",
13
+ appSecret: config.whatsapp?.appSecret ?? env.WHATSAPP_APP_SECRET ?? "local-mock-secret",
14
+ phoneNumberId: config.whatsapp?.phoneNumberId ?? env.WHATSAPP_PHONE_NUMBER_ID ?? "local-mock-phone",
15
+ verifyToken: config.whatsapp?.verifyToken ?? env.WHATSAPP_VERIFY_TOKEN ?? "local-mock-verify",
16
+ };
17
+ }
18
+ export class WhatsAppProviderAdapter extends LocalMockProviderAdapter {
19
+ constructor(id, config, _userName, _runtime) {
20
+ super({
21
+ codec: createNativeTargetCodec({
22
+ channel: WHATSAPP_WA_ID_RULE,
23
+ channelLabel: "WhatsApp wa_id",
24
+ }),
25
+ config,
26
+ id,
27
+ options: {
28
+ defaultWebhook: { host: "127.0.0.1", path: "/whatsapp/webhook", port: 8789 },
29
+ endpointLabel: "webhook endpoint",
30
+ normalizeWebhookPayload: normalizeWhatsAppWebhookPayload,
31
+ platform: "whatsapp",
32
+ publicUrl: config.whatsapp?.webhook.publicUrl,
33
+ recorderPath: config.whatsapp?.recorder.path
34
+ ? path.resolve(config.whatsapp.recorder.path)
35
+ : undefined,
36
+ webhook: config.whatsapp?.webhook,
37
+ },
38
+ });
39
+ }
40
+ }
41
+ export function normalizeWhatsAppWebhookPayload(payload) {
42
+ if (!isRecord(payload)) {
43
+ throw new CrablineError("WhatsApp webhook payload must be an object", { kind: "inbound" });
44
+ }
45
+ let message;
46
+ if (Array.isArray(payload.entry)) {
47
+ for (const entry of payload.entry) {
48
+ if (!isRecord(entry) || !Array.isArray(entry.changes)) {
49
+ continue;
50
+ }
51
+ for (const change of entry.changes) {
52
+ if (!isRecord(change)) {
53
+ continue;
54
+ }
55
+ const value = optionalRecord(change, "value");
56
+ const candidate = value && Array.isArray(value.messages) ? value.messages.find(isRecord) : undefined;
57
+ if (candidate) {
58
+ message = candidate;
59
+ break;
60
+ }
61
+ }
62
+ if (message) {
63
+ break;
64
+ }
65
+ }
66
+ }
67
+ if (!message) {
68
+ return genericMockPayloadWithNativeThread({
69
+ channelRule: WHATSAPP_WA_ID_RULE,
70
+ payload,
71
+ threadRule: WHATSAPP_WA_ID_RULE,
72
+ });
73
+ }
74
+ const text = optionalRecord(message, "text");
75
+ const from = optionalString(message, "from");
76
+ const body = text ? optionalString(text, "body") : undefined;
77
+ if (!from || !body) {
78
+ throw new CrablineError("WhatsApp webhook payload requires messages[].from and text.body", {
79
+ kind: "inbound",
80
+ });
81
+ }
82
+ return {
83
+ author: authorFromBotFlag(false),
84
+ ...(optionalString(message, "id") ? { id: optionalString(message, "id") } : {}),
85
+ raw: payload,
86
+ text: body,
87
+ threadId: requireNativeInboundId(from, WHATSAPP_WA_ID_RULE, "WhatsApp messages[].from"),
88
+ };
89
+ }
90
+ //# sourceMappingURL=whatsapp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whatsapp.js","sourceRoot":"","sources":["../../../../src/providers/builtin/whatsapp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ProviderConfig } from "../../config/schema.js";
2
+ import { LocalMockProviderAdapter } from "../local-mock.js";
3
+ import type { ProviderAdapter } from "../types.js";
4
+ export declare function resolveZaloAdapterConfig(config: ProviderConfig, env?: NodeJS.ProcessEnv): {
5
+ botToken: string;
6
+ webhookSecret: string | undefined;
7
+ };
8
+ export declare class ZaloProviderAdapter extends LocalMockProviderAdapter implements ProviderAdapter {
9
+ constructor(id: string, config: ProviderConfig, _userName: string, _runtime?: unknown);
10
+ }
11
+ export declare function normalizeZaloWebhookPayload(payload: unknown): {
12
+ author?: "assistant" | "system" | "user" | undefined;
13
+ authorIsBot?: boolean;
14
+ id?: string | undefined;
15
+ raw: {};
16
+ text?: string | undefined;
17
+ };
@@ -0,0 +1,70 @@
1
+ import path from "node:path";
2
+ import { CrablineError } from "../../core/errors.js";
3
+ import { LocalMockProviderAdapter } from "../local-mock.js";
4
+ import { authorFromBotFlag, createNativeTargetCodec, genericMockPayloadWithNativeThread, isRecord, optionalRecord, optionalString, requireNativeInboundId, } from "./native-local-mock.js";
5
+ const ZALO_ID_RULE = {
6
+ example: "123456789012345678",
7
+ name: "Zalo user or OA id",
8
+ pattern: /^\d{6,20}$/u,
9
+ };
10
+ export function resolveZaloAdapterConfig(config, env = process.env) {
11
+ return {
12
+ botToken: config.zalo?.botToken ?? env.ZALO_BOT_TOKEN ?? "local-mock-zalo-token",
13
+ webhookSecret: config.zalo?.webhookSecret ?? env.ZALO_WEBHOOK_SECRET,
14
+ };
15
+ }
16
+ export class ZaloProviderAdapter extends LocalMockProviderAdapter {
17
+ constructor(id, config, _userName, _runtime) {
18
+ super({
19
+ codec: createNativeTargetCodec({
20
+ channel: ZALO_ID_RULE,
21
+ channelLabel: "Zalo user_id or oa_id",
22
+ }),
23
+ config,
24
+ id,
25
+ options: {
26
+ defaultWebhook: { host: "127.0.0.1", path: "/zalo/webhook", port: 8794 },
27
+ endpointLabel: "webhook endpoint",
28
+ normalizeWebhookPayload: normalizeZaloWebhookPayload,
29
+ platform: "zalo",
30
+ publicUrl: config.zalo?.webhook.publicUrl,
31
+ recorderPath: config.zalo?.recorder.path
32
+ ? path.resolve(config.zalo.recorder.path)
33
+ : undefined,
34
+ webhook: config.zalo?.webhook,
35
+ },
36
+ });
37
+ }
38
+ }
39
+ export function normalizeZaloWebhookPayload(payload) {
40
+ if (!isRecord(payload)) {
41
+ throw new CrablineError("Zalo webhook payload must be an object", { kind: "inbound" });
42
+ }
43
+ if (optionalRecord(payload, "message") &&
44
+ optionalString(optionalRecord(payload, "message"), "threadId")) {
45
+ return genericMockPayloadWithNativeThread({
46
+ channelRule: ZALO_ID_RULE,
47
+ payload,
48
+ threadRule: ZALO_ID_RULE,
49
+ });
50
+ }
51
+ const sender = optionalRecord(payload, "sender");
52
+ const message = optionalRecord(payload, "message");
53
+ const senderId = sender ? optionalString(sender, "id") : undefined;
54
+ const text = message ? optionalString(message, "text") : undefined;
55
+ if (!senderId || !text) {
56
+ throw new CrablineError("Zalo webhook payload requires sender.id and message.text", {
57
+ kind: "inbound",
58
+ });
59
+ }
60
+ return {
61
+ author: authorFromBotFlag(false),
62
+ ...(message && optionalString(message, "msg_id")
63
+ ? { id: optionalString(message, "msg_id") }
64
+ : {}),
65
+ raw: payload,
66
+ text,
67
+ threadId: requireNativeInboundId(senderId, ZALO_ID_RULE, "Zalo sender.id"),
68
+ };
69
+ }
70
+ //# sourceMappingURL=zalo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zalo.js","sourceRoot":"","sources":["../../../../src/providers/builtin/zalo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import type { FixtureMode, ProviderPlatform } from "../config/schema.js";
2
+ import type { ProviderSupportStatus } from "./types.js";
3
+ export type CatalogEntry = {
4
+ notes: string;
5
+ platform: ProviderPlatform;
6
+ status: ProviderSupportStatus;
7
+ supports: readonly FixtureMode[];
8
+ };
9
+ export declare const OPENCLAW_SUPPORT_CATALOG: readonly [{
10
+ readonly notes: "Built-in local reference mock for development and tests.";
11
+ readonly platform: "loopback";
12
+ readonly status: "ready";
13
+ readonly supports: readonly ["probe", "send", "roundtrip", "agent"];
14
+ }, CatalogEntry, {
15
+ readonly notes: "Built-in local Discord mock with interactions webhook shape.";
16
+ readonly platform: "discord";
17
+ readonly status: "ready";
18
+ readonly supports: readonly ["probe", "send", "roundtrip", "agent"];
19
+ }, {
20
+ readonly notes: "Built-in local Feishu/Lark mock.";
21
+ readonly platform: "feishu";
22
+ readonly status: "ready";
23
+ readonly supports: readonly ["probe", "send", "roundtrip", "agent"];
24
+ }, {
25
+ readonly notes: "Built-in local Google Chat mock.";
26
+ readonly platform: "googlechat";
27
+ readonly status: "ready";
28
+ readonly supports: readonly ["probe", "send", "roundtrip", "agent"];
29
+ }, {
30
+ readonly notes: "Built-in local iMessage mock.";
31
+ readonly platform: "imessage";
32
+ readonly status: "ready";
33
+ readonly supports: readonly ["probe", "send", "roundtrip", "agent"];
34
+ }, CatalogEntry, CatalogEntry, {
35
+ readonly notes: "Built-in local Matrix mock.";
36
+ readonly platform: "matrix";
37
+ readonly status: "ready";
38
+ readonly supports: readonly ["probe", "send", "roundtrip", "agent"];
39
+ }, {
40
+ readonly notes: "Built-in local Mattermost mock.";
41
+ readonly platform: "mattermost";
42
+ readonly status: "ready";
43
+ readonly supports: readonly ["probe", "send", "roundtrip", "agent"];
44
+ }, {
45
+ readonly notes: "Built-in local Microsoft Teams mock.";
46
+ readonly platform: "msteams";
47
+ readonly status: "ready";
48
+ readonly supports: readonly ["probe", "send", "roundtrip", "agent"];
49
+ }, CatalogEntry, CatalogEntry, CatalogEntry, {
50
+ readonly notes: "Built-in local Slack mock with events webhook shape.";
51
+ readonly platform: "slack";
52
+ readonly status: "ready";
53
+ readonly supports: readonly ["probe", "send", "roundtrip", "agent"];
54
+ }, CatalogEntry, {
55
+ readonly notes: "Built-in local Telegram mock with Bot API-style webhook shape.";
56
+ readonly platform: "telegram";
57
+ readonly status: "ready";
58
+ readonly supports: readonly ["probe", "send", "roundtrip", "agent"];
59
+ }, CatalogEntry, CatalogEntry, CatalogEntry, {
60
+ readonly notes: "Built-in local WhatsApp mock with Business webhook shape.";
61
+ readonly platform: "whatsapp";
62
+ readonly status: "ready";
63
+ readonly supports: readonly ["probe", "send", "roundtrip", "agent"];
64
+ }, {
65
+ readonly notes: "Built-in local Zalo mock.";
66
+ readonly platform: "zalo";
67
+ readonly status: "ready";
68
+ readonly supports: readonly ["probe", "send", "roundtrip", "agent"];
69
+ }, CatalogEntry];
@@ -0,0 +1,95 @@
1
+ const COMMON_BRIDGE_SUPPORT = ["probe", "send", "roundtrip", "agent"];
2
+ function createBridgeEntry(platform, notes) {
3
+ return {
4
+ notes,
5
+ platform,
6
+ status: "bridge",
7
+ supports: COMMON_BRIDGE_SUPPORT,
8
+ };
9
+ }
10
+ export const OPENCLAW_SUPPORT_CATALOG = [
11
+ {
12
+ notes: "Built-in local reference mock for development and tests.",
13
+ platform: "loopback",
14
+ status: "ready",
15
+ supports: COMMON_BRIDGE_SUPPORT,
16
+ },
17
+ createBridgeEntry("bluebubbles", "OpenClaw channel via script bridge. Recommended iMessage path."),
18
+ {
19
+ notes: "Built-in local Discord mock with interactions webhook shape.",
20
+ platform: "discord",
21
+ status: "ready",
22
+ supports: COMMON_BRIDGE_SUPPORT,
23
+ },
24
+ {
25
+ notes: "Built-in local Feishu/Lark mock.",
26
+ platform: "feishu",
27
+ status: "ready",
28
+ supports: COMMON_BRIDGE_SUPPORT,
29
+ },
30
+ {
31
+ notes: "Built-in local Google Chat mock.",
32
+ platform: "googlechat",
33
+ status: "ready",
34
+ supports: COMMON_BRIDGE_SUPPORT,
35
+ },
36
+ {
37
+ notes: "Built-in local iMessage mock.",
38
+ platform: "imessage",
39
+ status: "ready",
40
+ supports: COMMON_BRIDGE_SUPPORT,
41
+ },
42
+ createBridgeEntry("irc", "OpenClaw channel via script bridge."),
43
+ createBridgeEntry("line", "OpenClaw plugin channel via script bridge."),
44
+ {
45
+ notes: "Built-in local Matrix mock.",
46
+ platform: "matrix",
47
+ status: "ready",
48
+ supports: COMMON_BRIDGE_SUPPORT,
49
+ },
50
+ {
51
+ notes: "Built-in local Mattermost mock.",
52
+ platform: "mattermost",
53
+ status: "ready",
54
+ supports: COMMON_BRIDGE_SUPPORT,
55
+ },
56
+ {
57
+ notes: "Built-in local Microsoft Teams mock.",
58
+ platform: "msteams",
59
+ status: "ready",
60
+ supports: COMMON_BRIDGE_SUPPORT,
61
+ },
62
+ createBridgeEntry("nextcloudtalk", "OpenClaw plugin channel via script bridge."),
63
+ createBridgeEntry("nostr", "OpenClaw plugin channel via script bridge."),
64
+ createBridgeEntry("signal", "OpenClaw channel via script bridge."),
65
+ {
66
+ notes: "Built-in local Slack mock with events webhook shape.",
67
+ platform: "slack",
68
+ status: "ready",
69
+ supports: COMMON_BRIDGE_SUPPORT,
70
+ },
71
+ createBridgeEntry("synologychat", "OpenClaw plugin channel via script bridge."),
72
+ {
73
+ notes: "Built-in local Telegram mock with Bot API-style webhook shape.",
74
+ platform: "telegram",
75
+ status: "ready",
76
+ supports: COMMON_BRIDGE_SUPPORT,
77
+ },
78
+ createBridgeEntry("tlon", "OpenClaw plugin channel via script bridge."),
79
+ createBridgeEntry("twitch", "OpenClaw plugin channel via script bridge."),
80
+ createBridgeEntry("webchat", "OpenClaw web channel via script bridge."),
81
+ {
82
+ notes: "Built-in local WhatsApp mock with Business webhook shape.",
83
+ platform: "whatsapp",
84
+ status: "ready",
85
+ supports: COMMON_BRIDGE_SUPPORT,
86
+ },
87
+ {
88
+ notes: "Built-in local Zalo mock.",
89
+ platform: "zalo",
90
+ status: "ready",
91
+ supports: COMMON_BRIDGE_SUPPORT,
92
+ },
93
+ createBridgeEntry("zalouser", "OpenClaw plugin personal-account channel via script bridge."),
94
+ ];
95
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/providers/catalog.ts"],"names":[],"mappings":"AAUA,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,CAAU,CAAC;AAE/E,SAAS,iBAAiB,CAAC,QAA0B,EAAE,KAAa;IAClE,OAAO;QACL,KAAK;QACL,QAAQ;QACR,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,qBAAqB;KAChC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC;QACE,KAAK,EAAE,0DAA0D;QACjE,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD,iBAAiB,CACf,aAAa,EACb,gEAAgE,CACjE;IACD;QACE,KAAK,EAAE,8DAA8D;QACrE,QAAQ,EAAE,SAAS;QACnB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD;QACE,KAAK,EAAE,kCAAkC;QACzC,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD;QACE,KAAK,EAAE,kCAAkC;QACzC,QAAQ,EAAE,YAAY;QACtB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD;QACE,KAAK,EAAE,+BAA+B;QACtC,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD,iBAAiB,CAAC,KAAK,EAAE,qCAAqC,CAAC;IAC/D,iBAAiB,CAAC,MAAM,EAAE,4CAA4C,CAAC;IACvE;QACE,KAAK,EAAE,6BAA6B;QACpC,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD;QACE,KAAK,EAAE,iCAAiC;QACxC,QAAQ,EAAE,YAAY;QACtB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD;QACE,KAAK,EAAE,sCAAsC;QAC7C,QAAQ,EAAE,SAAS;QACnB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD,iBAAiB,CAAC,eAAe,EAAE,4CAA4C,CAAC;IAChF,iBAAiB,CAAC,OAAO,EAAE,4CAA4C,CAAC;IACxE,iBAAiB,CAAC,QAAQ,EAAE,qCAAqC,CAAC;IAClE;QACE,KAAK,EAAE,sDAAsD;QAC7D,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD,iBAAiB,CAAC,cAAc,EAAE,4CAA4C,CAAC;IAC/E;QACE,KAAK,EAAE,gEAAgE;QACvE,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD,iBAAiB,CAAC,MAAM,EAAE,4CAA4C,CAAC;IACvE,iBAAiB,CAAC,QAAQ,EAAE,4CAA4C,CAAC;IACzE,iBAAiB,CAAC,SAAS,EAAE,yCAAyC,CAAC;IACvE;QACE,KAAK,EAAE,2DAA2D;QAClE,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD;QACE,KAAK,EAAE,2BAA2B;QAClC,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD,iBAAiB,CAAC,UAAU,EAAE,6DAA6D,CAAC;CAClD,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { ProviderConfig, ProviderPlatform } from "../config/schema.js";
2
+ import type { InboundEnvelope, NormalizedTarget, ProbeResult, ProviderAdapter, ProviderContext, SendContext, SendResult, WaitContext, WatchContext } from "./types.js";
3
+ export type LocalMockWebhookConfig = {
4
+ host?: string;
5
+ path?: string;
6
+ port?: number;
7
+ publicUrl?: string | undefined;
8
+ };
9
+ export type LocalMockAdapterOptions = {
10
+ defaultWebhook: Required<Pick<LocalMockWebhookConfig, "host" | "path" | "port">>;
11
+ endpointLabel: string;
12
+ normalizeWebhookPayload?: (payload: unknown) => unknown;
13
+ platform: ProviderPlatform;
14
+ publicUrl?: string | undefined;
15
+ recorderPath?: string | undefined;
16
+ webhook?: LocalMockWebhookConfig | undefined;
17
+ };
18
+ export type LocalMockTargetCodec = {
19
+ normalize(target: ProviderContext["fixture"]["target"]): NormalizedTarget;
20
+ resolveThreadId(target: ProviderContext["fixture"]["target"]): string;
21
+ };
22
+ export declare function createGenericLocalMockTargetCodec(platform: ProviderPlatform): LocalMockTargetCodec;
23
+ export declare class LocalMockProviderAdapter implements ProviderAdapter {
24
+ #private;
25
+ readonly id: string;
26
+ readonly platform: "bluebubbles" | "discord" | "feishu" | "googlechat" | "imessage" | "irc" | "line" | "loopback" | "matrix" | "mattermost" | "msteams" | "nextcloudtalk" | "nostr" | "signal" | "slack" | "synologychat" | "telegram" | "tlon" | "twitch" | "webchat" | "whatsapp" | "zalo" | "zalouser";
27
+ readonly status: "ready";
28
+ readonly supports: readonly ["probe", "send", "roundtrip", "agent"];
29
+ constructor(params: {
30
+ codec: LocalMockTargetCodec;
31
+ config: ProviderConfig;
32
+ id: string;
33
+ options: LocalMockAdapterOptions;
34
+ });
35
+ normalizeTarget(target: ProviderContext["fixture"]["target"]): NormalizedTarget;
36
+ probe(context: ProviderContext): Promise<ProbeResult>;
37
+ send(context: SendContext): Promise<SendResult>;
38
+ waitForInbound(context: WaitContext): Promise<InboundEnvelope | null>;
39
+ watch(context: WatchContext): AsyncIterable<InboundEnvelope>;
40
+ cleanup(): Promise<void>;
41
+ }