@openclaw/crabline 0.1.9 → 0.1.11
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/README.md +47 -22
- package/assets/crabline-banner.svg +20 -0
- package/dist/src/bin/crabline.js.map +1 -1
- package/dist/src/cli/program.d.ts +25 -1
- package/dist/src/cli/program.js +579 -82
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/config/load.js +59 -6
- package/dist/src/config/load.js.map +1 -1
- package/dist/src/config/schema.d.ts +116 -92
- package/dist/src/config/schema.js +179 -73
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/core/errors.js +9 -2
- package/dist/src/core/errors.js.map +1 -1
- package/dist/src/core/exit-codes.js.map +1 -1
- package/dist/src/core/matcher.js +7 -6
- package/dist/src/core/matcher.js.map +1 -1
- package/dist/src/core/message-template.js.map +1 -1
- package/dist/src/core/nonces.d.ts +1 -0
- package/dist/src/core/nonces.js +4 -2
- package/dist/src/core/nonces.js.map +1 -1
- package/dist/src/core/reporters.d.ts +1 -0
- package/dist/src/core/reporters.js +42 -4
- package/dist/src/core/reporters.js.map +1 -1
- package/dist/src/core/run.d.ts +3 -0
- package/dist/src/core/run.js +415 -107
- package/dist/src/core/run.js.map +1 -1
- package/dist/src/core/safe-regex.d.ts +3 -0
- package/dist/src/core/safe-regex.js +21 -0
- package/dist/src/core/safe-regex.js.map +1 -0
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/openclaw/artifact-generation.d.ts +43 -0
- package/dist/src/openclaw/artifact-generation.js +363 -0
- package/dist/src/openclaw/artifact-generation.js.map +1 -0
- package/dist/src/openclaw/bridges/matrix.js +97 -12
- package/dist/src/openclaw/bridges/matrix.js.map +1 -1
- package/dist/src/openclaw/bridges/mattermost.js +32 -10
- package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
- package/dist/src/openclaw/bridges/signal.js +55 -18
- package/dist/src/openclaw/bridges/signal.js.map +1 -1
- package/dist/src/openclaw/bridges/slack.js +85 -7
- package/dist/src/openclaw/bridges/slack.js.map +1 -1
- package/dist/src/openclaw/bridges/telegram.js +124 -30
- package/dist/src/openclaw/bridges/telegram.js.map +1 -1
- package/dist/src/openclaw/bridges/whatsapp.js +78 -17
- package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
- package/dist/src/openclaw/bridges/zalo.js +14 -5
- package/dist/src/openclaw/bridges/zalo.js.map +1 -1
- package/dist/src/openclaw/outbound-contract.d.ts +5 -0
- package/dist/src/openclaw/outbound-contract.js +40 -0
- package/dist/src/openclaw/outbound-contract.js.map +1 -0
- package/dist/src/openclaw/private-file.d.ts +28 -0
- package/dist/src/openclaw/private-file.js +465 -0
- package/dist/src/openclaw/private-file.js.map +1 -0
- package/dist/src/openclaw/shared.d.ts +21 -2
- package/dist/src/openclaw/shared.js +115 -18
- package/dist/src/openclaw/shared.js.map +1 -1
- package/dist/src/openclaw/smoke-lock.d.ts +63 -0
- package/dist/src/openclaw/smoke-lock.js +1004 -0
- package/dist/src/openclaw/smoke-lock.js.map +1 -0
- package/dist/src/openclaw.d.ts +16 -8
- package/dist/src/openclaw.js +334 -52
- package/dist/src/openclaw.js.map +1 -1
- package/dist/src/providers/builtin/discord.d.ts +10 -1
- package/dist/src/providers/builtin/discord.js +144 -18
- package/dist/src/providers/builtin/discord.js.map +1 -1
- package/dist/src/providers/builtin/external-webhook-auth.d.ts +11 -0
- package/dist/src/providers/builtin/external-webhook-auth.js +10 -0
- package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -0
- package/dist/src/providers/builtin/feishu.d.ts +19 -2
- package/dist/src/providers/builtin/feishu.js +307 -25
- package/dist/src/providers/builtin/feishu.js.map +1 -1
- package/dist/src/providers/builtin/googlechat.d.ts +20 -1
- package/dist/src/providers/builtin/googlechat.js +178 -19
- package/dist/src/providers/builtin/googlechat.js.map +1 -1
- package/dist/src/providers/builtin/imessage.d.ts +4 -0
- package/dist/src/providers/builtin/imessage.js +26 -11
- package/dist/src/providers/builtin/imessage.js.map +1 -1
- package/dist/src/providers/builtin/loopback.js +92 -30
- package/dist/src/providers/builtin/loopback.js.map +1 -1
- package/dist/src/providers/builtin/matrix.d.ts +11 -1
- package/dist/src/providers/builtin/matrix.js +53 -29
- package/dist/src/providers/builtin/matrix.js.map +1 -1
- package/dist/src/providers/builtin/mattermost.d.ts +10 -0
- package/dist/src/providers/builtin/mattermost.js +38 -15
- package/dist/src/providers/builtin/mattermost.js.map +1 -1
- package/dist/src/providers/builtin/msteams.d.ts +17 -1
- package/dist/src/providers/builtin/msteams.js +113 -14
- package/dist/src/providers/builtin/msteams.js.map +1 -1
- package/dist/src/providers/builtin/native-local-mock.d.ts +2 -9
- package/dist/src/providers/builtin/native-local-mock.js +12 -35
- package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
- package/dist/src/providers/builtin/script.d.ts +11 -15
- package/dist/src/providers/builtin/script.js +566 -104
- package/dist/src/providers/builtin/script.js.map +1 -1
- package/dist/src/providers/builtin/slack.d.ts +6 -0
- package/dist/src/providers/builtin/slack.js +99 -40
- package/dist/src/providers/builtin/slack.js.map +1 -1
- package/dist/src/providers/builtin/telegram.d.ts +6 -0
- package/dist/src/providers/builtin/telegram.js +64 -43
- package/dist/src/providers/builtin/telegram.js.map +1 -1
- package/dist/src/providers/builtin/whatsapp.d.ts +28 -8
- package/dist/src/providers/builtin/whatsapp.js +567 -30
- package/dist/src/providers/builtin/whatsapp.js.map +1 -1
- package/dist/src/providers/builtin/zalo.js +30 -19
- package/dist/src/providers/builtin/zalo.js.map +1 -1
- package/dist/src/providers/catalog.d.ts +3 -3
- package/dist/src/providers/catalog.js +3 -3
- package/dist/src/providers/catalog.js.map +1 -1
- package/dist/src/providers/local-mock.d.ts +11 -2
- package/dist/src/providers/local-mock.js +322 -96
- package/dist/src/providers/local-mock.js.map +1 -1
- package/dist/src/providers/native-ids.d.ts +1 -0
- package/dist/src/providers/native-ids.js +6 -1
- package/dist/src/providers/native-ids.js.map +1 -1
- package/dist/src/providers/recorder.d.ts +30 -2
- package/dist/src/providers/recorder.js +549 -70
- package/dist/src/providers/recorder.js.map +1 -1
- package/dist/src/providers/registry.d.ts +25 -1
- package/dist/src/providers/registry.js +280 -40
- package/dist/src/providers/registry.js.map +1 -1
- package/dist/src/providers/signed-jwt.d.ts +29 -0
- package/dist/src/providers/signed-jwt.js +202 -0
- package/dist/src/providers/signed-jwt.js.map +1 -0
- package/dist/src/providers/slack-ids.js.map +1 -1
- package/dist/src/providers/target-normalizers.d.ts +26 -0
- package/dist/src/providers/target-normalizers.js +276 -0
- package/dist/src/providers/target-normalizers.js.map +1 -0
- package/dist/src/providers/types.d.ts +5 -0
- package/dist/src/providers/types.js.map +1 -1
- package/dist/src/providers/webhook-server.d.ts +2 -0
- package/dist/src/providers/webhook-server.js +72 -25
- package/dist/src/providers/webhook-server.js.map +1 -1
- package/dist/src/servers/http.d.ts +23 -3
- package/dist/src/servers/http.js +213 -20
- package/dist/src/servers/http.js.map +1 -1
- package/dist/src/servers/index.js +20 -21
- package/dist/src/servers/index.js.map +1 -1
- package/dist/src/servers/matrix.js +465 -51
- package/dist/src/servers/matrix.js.map +1 -1
- package/dist/src/servers/mattermost.d.ts +5 -0
- package/dist/src/servers/mattermost.js +306 -58
- package/dist/src/servers/mattermost.js.map +1 -1
- package/dist/src/servers/pending-events.d.ts +2 -0
- package/dist/src/servers/pending-events.js +11 -0
- package/dist/src/servers/pending-events.js.map +1 -0
- package/dist/src/servers/recorder.d.ts +5 -0
- package/dist/src/servers/recorder.js +262 -3
- package/dist/src/servers/recorder.js.map +1 -1
- package/dist/src/servers/signal.d.ts +2 -0
- package/dist/src/servers/signal.js +444 -56
- package/dist/src/servers/signal.js.map +1 -1
- package/dist/src/servers/slack.d.ts +5 -0
- package/dist/src/servers/slack.js +515 -49
- package/dist/src/servers/slack.js.map +1 -1
- package/dist/src/servers/telegram.d.ts +111 -0
- package/dist/src/servers/telegram.js +830 -158
- package/dist/src/servers/telegram.js.map +1 -1
- package/dist/src/servers/webhook-target.d.ts +40 -0
- package/dist/src/servers/webhook-target.js +349 -0
- package/dist/src/servers/webhook-target.js.map +1 -0
- package/dist/src/servers/websocket.d.ts +2 -0
- package/dist/src/servers/websocket.js +29 -0
- package/dist/src/servers/websocket.js.map +1 -0
- package/dist/src/servers/whatsapp-baileys-websocket.d.ts +65 -1
- package/dist/src/servers/whatsapp-baileys-websocket.js +723 -99
- package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
- package/dist/src/servers/whatsapp-jid.d.ts +5 -0
- package/dist/src/servers/whatsapp-jid.js +32 -0
- package/dist/src/servers/whatsapp-jid.js.map +1 -0
- package/dist/src/servers/whatsapp-wire/binary-node.d.ts +5 -0
- package/dist/src/servers/whatsapp-wire/binary-node.js +87 -20
- package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/crypto.d.ts +6 -1
- package/dist/src/servers/whatsapp-wire/crypto.js +99 -45
- package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/handshake.js +39 -4
- package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
- package/dist/src/servers/whatsapp.d.ts +12 -7
- package/dist/src/servers/whatsapp.js +269 -107
- package/dist/src/servers/whatsapp.js.map +1 -1
- package/dist/src/servers/zalo.d.ts +14 -0
- package/dist/src/servers/zalo.js +521 -88
- package/dist/src/servers/zalo.js.map +1 -1
- package/docs/channel-setup.md +197 -19
- package/fixtures/examples/crabline.example.yaml +10 -0
- package/package.json +20 -15
|
@@ -1,22 +1,80 @@
|
|
|
1
1
|
import { ADMIN_TOKEN_HEADER } from "../servers/http.js";
|
|
2
2
|
export const DEFAULT_ACCOUNT_ID = "default";
|
|
3
3
|
export const OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH = "crabline-fake-provider-capabilities.json";
|
|
4
|
-
export const
|
|
4
|
+
export const OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH = "crabline-fake-provider-smoke.json";
|
|
5
|
+
/** @deprecated Use OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH. */
|
|
6
|
+
export const OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH = OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH;
|
|
5
7
|
export const OPENCLAW_CRABLINE_MANIFEST_PATH = "crabline-fake-provider-server.json";
|
|
8
|
+
export const OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY = ".crabline-smoke-artifacts";
|
|
9
|
+
export const OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH = `${OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY}/current.json`;
|
|
6
10
|
export const OPENCLAW_CRABLINE_DEFAULT_CHANNEL = "telegram";
|
|
11
|
+
const OPENCLAW_CRABLINE_PROVIDER_PROBE_TIMEOUT_MS = 5_000;
|
|
12
|
+
const OPENCLAW_CRABLINE_PROVIDER_PROBE_LABELS = {
|
|
13
|
+
mattermost: "Mattermost users.me",
|
|
14
|
+
matrix: "Matrix whoami",
|
|
15
|
+
signal: "Signal check",
|
|
16
|
+
slack: "Slack auth.test",
|
|
17
|
+
telegram: "Telegram getMe",
|
|
18
|
+
whatsapp: "WhatsApp phone number",
|
|
19
|
+
zalo: "Zalo getMe",
|
|
20
|
+
};
|
|
7
21
|
export function createOpenClawCrablineProviderBridge(params) {
|
|
22
|
+
const createAdapter = (manifest) => {
|
|
23
|
+
const adapter = params.createAdapter(manifest);
|
|
24
|
+
return {
|
|
25
|
+
...adapter,
|
|
26
|
+
createInbound(input) {
|
|
27
|
+
if (!readNonBlankString(input.text)) {
|
|
28
|
+
throw new Error("OpenClaw Crabline inbound message text is required.");
|
|
29
|
+
}
|
|
30
|
+
if (input.conversation.kind !== "direct" && input.conversation.kind !== "group") {
|
|
31
|
+
throw new Error("OpenClaw Crabline inbound conversation kind must be direct or group.");
|
|
32
|
+
}
|
|
33
|
+
return adapter.createInbound(input);
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
};
|
|
8
37
|
const bridge = {
|
|
9
|
-
createAdapter
|
|
38
|
+
createAdapter,
|
|
10
39
|
createAdapterFromManifest(manifest) {
|
|
11
40
|
if (manifest.provider !== params.provider) {
|
|
12
41
|
throw new Error(`Unsupported OpenClaw provider binding: expected ${params.provider}, got ${manifest.provider}.`);
|
|
13
42
|
}
|
|
14
|
-
return
|
|
43
|
+
return createAdapter(manifest);
|
|
15
44
|
},
|
|
16
45
|
provider: params.provider,
|
|
17
46
|
};
|
|
18
47
|
return bridge;
|
|
19
48
|
}
|
|
49
|
+
export async function runOpenClawCrablineProviderProbe(provider, probe) {
|
|
50
|
+
const signal = AbortSignal.timeout(OPENCLAW_CRABLINE_PROVIDER_PROBE_TIMEOUT_MS);
|
|
51
|
+
const timeoutError = (cause) => new Error(`Crabline ${OPENCLAW_CRABLINE_PROVIDER_PROBE_LABELS[provider]} probe timed out after ${OPENCLAW_CRABLINE_PROVIDER_PROBE_TIMEOUT_MS} ms.`, { cause });
|
|
52
|
+
let onAbort;
|
|
53
|
+
const timeout = new Promise((_, reject) => {
|
|
54
|
+
onAbort = () => reject(timeoutError(signal.reason));
|
|
55
|
+
if (signal.aborted) {
|
|
56
|
+
onAbort();
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
60
|
+
});
|
|
61
|
+
const probeResult = Promise.resolve()
|
|
62
|
+
.then(() => probe(signal))
|
|
63
|
+
.catch((error) => {
|
|
64
|
+
if (signal.aborted) {
|
|
65
|
+
throw timeoutError(error);
|
|
66
|
+
}
|
|
67
|
+
throw error;
|
|
68
|
+
});
|
|
69
|
+
try {
|
|
70
|
+
return await Promise.race([probeResult, timeout]);
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
if (onAbort) {
|
|
74
|
+
signal.removeEventListener("abort", onAbort);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
20
78
|
export function readString(value) {
|
|
21
79
|
if (typeof value === "string" && value.trim()) {
|
|
22
80
|
return value.trim();
|
|
@@ -26,6 +84,9 @@ export function readString(value) {
|
|
|
26
84
|
}
|
|
27
85
|
return undefined;
|
|
28
86
|
}
|
|
87
|
+
export function readNonBlankString(value) {
|
|
88
|
+
return typeof value === "string" && value.trim() ? value : undefined;
|
|
89
|
+
}
|
|
29
90
|
export function isRecord(value) {
|
|
30
91
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
31
92
|
}
|
|
@@ -38,33 +99,69 @@ export function readInteger(value) {
|
|
|
38
99
|
}
|
|
39
100
|
export function parseQaTarget(target) {
|
|
40
101
|
const trimmed = target.trim();
|
|
102
|
+
const invalidTarget = () => {
|
|
103
|
+
throw new Error("OpenClaw Crabline target must be a non-blank native id or a valid dm:<id>, group:<id>, channel:<id>, or thread:<id>/<thread-id> target.");
|
|
104
|
+
};
|
|
105
|
+
if (!trimmed) {
|
|
106
|
+
return invalidTarget();
|
|
107
|
+
}
|
|
41
108
|
if (trimmed.startsWith("thread:")) {
|
|
42
|
-
const
|
|
109
|
+
const encoded = trimmed.startsWith("thread:/v1/");
|
|
110
|
+
const rest = trimmed.slice(encoded ? "thread:/v1/".length : "thread:".length);
|
|
43
111
|
const slash = rest.indexOf("/");
|
|
44
|
-
if (slash
|
|
45
|
-
return
|
|
112
|
+
if (slash <= 0 || slash !== rest.lastIndexOf("/")) {
|
|
113
|
+
return invalidTarget();
|
|
114
|
+
}
|
|
115
|
+
let id = rest.slice(0, slash).trim();
|
|
116
|
+
let threadId = rest.slice(slash + 1).trim();
|
|
117
|
+
if (encoded) {
|
|
118
|
+
try {
|
|
119
|
+
id = decodeURIComponent(id).trim();
|
|
120
|
+
threadId = decodeURIComponent(threadId).trim();
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return invalidTarget();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (!id || !threadId) {
|
|
127
|
+
return invalidTarget();
|
|
46
128
|
}
|
|
129
|
+
return { kind: "group", id, native: false, threadId };
|
|
47
130
|
}
|
|
48
131
|
if (trimmed.startsWith("channel:")) {
|
|
49
|
-
|
|
132
|
+
const id = trimmed.slice("channel:".length).trim();
|
|
133
|
+
return id ? { kind: "group", id, native: false } : invalidTarget();
|
|
50
134
|
}
|
|
51
135
|
if (trimmed.startsWith("group:")) {
|
|
52
|
-
|
|
136
|
+
const id = trimmed.slice("group:".length).trim();
|
|
137
|
+
return id ? { kind: "group", id, native: false } : invalidTarget();
|
|
53
138
|
}
|
|
54
139
|
if (trimmed.startsWith("dm:")) {
|
|
55
|
-
|
|
140
|
+
const id = trimmed.slice("dm:".length).trim();
|
|
141
|
+
return id ? { kind: "direct", id, native: false } : invalidTarget();
|
|
56
142
|
}
|
|
57
|
-
|
|
143
|
+
if (/^(?:dm|group|channel|thread)(?=\s*:|$)/iu.test(trimmed)) {
|
|
144
|
+
return invalidTarget();
|
|
145
|
+
}
|
|
146
|
+
return { kind: "direct", id: trimmed, native: true };
|
|
147
|
+
}
|
|
148
|
+
export function canonicalConversationIdForInbound(input) {
|
|
149
|
+
const conversationId = readNonBlankString(input.conversation.id);
|
|
150
|
+
if (!conversationId) {
|
|
151
|
+
throw new Error("OpenClaw Crabline inbound conversation id is required.");
|
|
152
|
+
}
|
|
153
|
+
return conversationId.trim();
|
|
154
|
+
}
|
|
155
|
+
function encodeQaThreadComponent(value) {
|
|
156
|
+
return value.replaceAll("%", "%25").replaceAll("/", "%2F");
|
|
58
157
|
}
|
|
59
158
|
export function qaTargetForInbound(input) {
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
? `thread:${input.conversation.id}/${input.threadId}`
|
|
67
|
-
: `${prefix}:${input.conversation.id}`;
|
|
159
|
+
const conversationId = canonicalConversationIdForInbound(input);
|
|
160
|
+
const threadId = input.threadId?.trim();
|
|
161
|
+
const prefix = input.conversation.kind === "direct" ? "dm" : "group";
|
|
162
|
+
return threadId
|
|
163
|
+
? `thread:/v1/${encodeQaThreadComponent(conversationId)}/${encodeQaThreadComponent(threadId)}`
|
|
164
|
+
: `${prefix}:${conversationId}`;
|
|
68
165
|
}
|
|
69
166
|
export function createAdminInboundRequest(manifest) {
|
|
70
167
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/openclaw/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAIxD,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAC5C,MAAM,CAAC,MAAM,gDAAgD,GAC3D,0CAA0C,CAAC;AAC7C,MAAM,CAAC,MAAM,oCAAoC,GAAG,mCAAmC,CAAC;AACxF,MAAM,CAAC,MAAM,+BAA+B,GAAG,oCAAoC,CAAC;AACpF,MAAM,CAAC,MAAM,iCAAiC,GAAG,UAAU,CAAC;AAmH5D,MAAM,UAAU,oCAAoC,CAElD,MAKD;IAEC,MAAM,MAAM,GAAqD;QAC/D,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,yBAAyB,CAAC,QAAQ;YAChC,IAAI,QAAQ,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CACb,mDAAmD,MAAM,CAAC,QAAQ,SAAS,QAAQ,CAAC,QAAQ,GAAG,CAChG,CAAC;YACJ,CAAC;YACD,OAAO,MAAM,CAAC,aAAa,CAAC,QAA4B,CAAC,CAAC;QAC5D,CAAC;QACD,QAAQ,EAAE,MAAM,CAAC,QAAwC;KAC1D,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC3D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAClD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;QACtF,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;IACjE,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;IAC/D,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;IAC7D,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAmC;IACpE,MAAM,MAAM,GACV,KAAK,CAAC,YAAY,CAAC,IAAI,KAAK,QAAQ;QAClC,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,KAAK,SAAS;YACrC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,OAAO,CAAC;IAChB,OAAO,KAAK,CAAC,QAAQ;QACnB,CAAC,CAAC,UAAU,KAAK,CAAC,YAAY,CAAC,EAAE,IAAI,KAAK,CAAC,QAAQ,EAAE;QACrD,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,QAAgC;IACxE,OAAO;QACL,eAAe,EAAE;YACf,cAAc,EAAE,kBAAkB;YAClC,CAAC,kBAAkB,CAAC,EAAE,QAAQ,CAAC,UAAU;SAC1C;QACD,WAAW,EAAE,QAAQ,CAAC,SAAS,CAAC,eAAe;KAChD,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/openclaw/shared.ts"],"names":[],"mappings":"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","sourcesContent":["import { ADMIN_TOKEN_HEADER } from \"../servers/http.js\";\nimport type { CrablineServerChannel, CrablineServerManifest } from \"../servers/index.js\";\nimport type { ServerEventObserver } from \"../servers/recorder.js\";\n\nexport const DEFAULT_ACCOUNT_ID = \"default\";\nexport const OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH =\n \"crabline-fake-provider-capabilities.json\";\nexport const OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH = \"crabline-fake-provider-smoke.json\";\n/** @deprecated Use OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH. */\nexport const OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH = OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH;\nexport const OPENCLAW_CRABLINE_MANIFEST_PATH = \"crabline-fake-provider-server.json\";\nexport const OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY = \".crabline-smoke-artifacts\";\nexport const OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH = `${OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY}/current.json`;\nexport const OPENCLAW_CRABLINE_DEFAULT_CHANNEL = \"telegram\";\n\nconst OPENCLAW_CRABLINE_PROVIDER_PROBE_TIMEOUT_MS = 5_000;\nconst OPENCLAW_CRABLINE_PROVIDER_PROBE_LABELS = {\n mattermost: \"Mattermost users.me\",\n matrix: \"Matrix whoami\",\n signal: \"Signal check\",\n slack: \"Slack auth.test\",\n telegram: \"Telegram getMe\",\n whatsapp: \"WhatsApp phone number\",\n zalo: \"Zalo getMe\",\n} satisfies Record<CrablineServerManifest[\"provider\"], string>;\n\nexport type OpenClawCrablineChannelDriverSelection = {\n channel: CrablineServerChannel;\n channelDriver: \"crabline\";\n capabilityMatrixPath: typeof OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH;\n providerReadinessArtifactPath?: typeof OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH;\n smokeArtifactPath: typeof OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH;\n};\n\n/** @deprecated Use OpenClawCrablineProviderReadinessResult. */\nexport type OpenClawCrablineChannelDriverSmokeResult = {\n artifactPointerPath: string;\n capabilityReport: unknown;\n capabilityMatrixPath: string;\n generation: string;\n manifestPath: string;\n smoke: unknown;\n smokeArtifactPath: string;\n warnings?: string[];\n};\n\nexport type OpenClawCrablineProviderReadinessResult = OpenClawCrablineChannelDriverSmokeResult & {\n providerReadiness: unknown;\n providerReadinessArtifactPath: string;\n};\nexport type OpenClawCrablineConversation = {\n id: string;\n kind: \"direct\" | \"group\";\n};\n\nexport type OpenClawCrablineGatewayBinding = {\n accountId: string;\n channel: string;\n createChannelDriverSmokeEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv;\n createGatewayConfig(openclawConfig?: Record<string, unknown>): Record<string, unknown>;\n requiredPluginIds: string[];\n};\n\nexport type OpenClawCrablineAgentDelivery = {\n channel: string;\n replyChannel: string;\n replyTo: string;\n to: string;\n};\n\nexport type OpenClawCrablineInboundInput = {\n conversation: {\n id: string;\n kind: \"direct\" | \"group\";\n };\n senderId: string;\n senderName?: string | undefined;\n text: string;\n threadId?: string | undefined;\n nativeCommand?: { name: string } | undefined;\n};\n\nexport type OpenClawCrablineInbound = {\n providerBody: Record<string, unknown>;\n providerHeaders: Record<string, string>;\n providerTargetKey: string;\n providerUrl: string;\n qaTarget: string;\n stateConversation: OpenClawCrablineConversation;\n threadId?: string | undefined;\n};\n\nexport type OpenClawCrablineOutboundMessage = {\n accountId: string;\n senderId: string;\n senderName: string;\n text: string;\n to: string;\n};\n\nexport type StartOpenClawCrablineAdapterParams = {\n channel: CrablineServerChannel;\n onEvent?: ServerEventObserver | undefined;\n openclawConfig?: Record<string, unknown> | undefined;\n recorderPath?: string | undefined;\n};\n\nexport type StartedOpenClawCrablineAdapter = OpenClawCrablineGatewayBinding & {\n close(): Promise<void>;\n createAgentDelivery(params: { target: string }): OpenClawCrablineAgentDelivery;\n createInbound(params: { input: OpenClawCrablineInboundInput }): OpenClawCrablineInbound;\n createOutboundFromRecorderEvent(params: {\n event: unknown;\n targetByProviderTarget: ReadonlyMap<string, string>;\n }): OpenClawCrablineOutboundMessage | null;\n manifest: CrablineServerManifest;\n probe(): Promise<unknown>;\n};\n\nexport type ParsedQaTarget = {\n kind: \"direct\" | \"group\";\n id: string;\n native: boolean;\n threadId?: string;\n};\n\nexport type OpenClawCrablineProviderAdapter = {\n createAgentDelivery(parsed: ParsedQaTarget): OpenClawCrablineAgentDelivery;\n createBinding(): OpenClawCrablineGatewayBinding;\n createInbound(input: OpenClawCrablineInboundInput): OpenClawCrablineInbound;\n createOutboundFromRecorderEvent(params: {\n event: unknown;\n targetByProviderTarget: ReadonlyMap<string, string>;\n }): OpenClawCrablineOutboundMessage | null;\n probe(signal?: AbortSignal): Promise<unknown>;\n};\n\nexport type OpenClawCrablineProviderBridge<\n TManifest extends CrablineServerManifest = CrablineServerManifest,\n> = {\n createAdapter(manifest: TManifest): OpenClawCrablineProviderAdapter;\n createAdapterFromManifest(manifest: CrablineServerManifest): OpenClawCrablineProviderAdapter;\n provider: TManifest[\"provider\"];\n};\n\nexport type OpenClawCrablineProviderBridgeRegistry = {\n [Provider in CrablineServerManifest[\"provider\"]]: OpenClawCrablineProviderBridge<\n Extract<CrablineServerManifest, { provider: Provider }>\n >;\n};\n\nexport function createOpenClawCrablineProviderBridge<\n TProvider extends CrablineServerManifest[\"provider\"],\n>(params: {\n createAdapter(\n manifest: Extract<CrablineServerManifest, { provider: TProvider }>,\n ): OpenClawCrablineProviderAdapter;\n provider: TProvider;\n}): OpenClawCrablineProviderBridge<Extract<CrablineServerManifest, { provider: TProvider }>> {\n type ProviderManifest = Extract<CrablineServerManifest, { provider: TProvider }>;\n const createAdapter = (manifest: ProviderManifest): OpenClawCrablineProviderAdapter => {\n const adapter = params.createAdapter(manifest);\n return {\n ...adapter,\n createInbound(input) {\n if (!readNonBlankString(input.text)) {\n throw new Error(\"OpenClaw Crabline inbound message text is required.\");\n }\n if (input.conversation.kind !== \"direct\" && input.conversation.kind !== \"group\") {\n throw new Error(\"OpenClaw Crabline inbound conversation kind must be direct or group.\");\n }\n return adapter.createInbound(input);\n },\n };\n };\n const bridge: OpenClawCrablineProviderBridge<ProviderManifest> = {\n createAdapter,\n createAdapterFromManifest(manifest) {\n if (manifest.provider !== params.provider) {\n throw new Error(\n `Unsupported OpenClaw provider binding: expected ${params.provider}, got ${manifest.provider}.`,\n );\n }\n return createAdapter(manifest as ProviderManifest);\n },\n provider: params.provider as ProviderManifest[\"provider\"],\n };\n return bridge;\n}\n\nexport async function runOpenClawCrablineProviderProbe<T>(\n provider: CrablineServerManifest[\"provider\"],\n probe: (signal: AbortSignal) => Promise<T>,\n): Promise<T> {\n const signal = AbortSignal.timeout(OPENCLAW_CRABLINE_PROVIDER_PROBE_TIMEOUT_MS);\n const timeoutError = (cause: unknown) =>\n new Error(\n `Crabline ${OPENCLAW_CRABLINE_PROVIDER_PROBE_LABELS[provider]} probe timed out after ${OPENCLAW_CRABLINE_PROVIDER_PROBE_TIMEOUT_MS} ms.`,\n { cause },\n );\n let onAbort: (() => void) | undefined;\n const timeout = new Promise<never>((_, reject) => {\n onAbort = () => reject(timeoutError(signal.reason));\n if (signal.aborted) {\n onAbort();\n return;\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n const probeResult = Promise.resolve()\n .then(() => probe(signal))\n .catch((error: unknown) => {\n if (signal.aborted) {\n throw timeoutError(error);\n }\n throw error;\n });\n try {\n return await Promise.race([probeResult, timeout]);\n } finally {\n if (onAbort) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n }\n}\n\nexport function readString(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n if (typeof value === \"number\" || typeof value === \"bigint\") {\n return String(value);\n }\n return undefined;\n}\n\nexport function readNonBlankString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function readInteger(value: unknown): number | undefined {\n const stringValue = readString(value);\n if (!stringValue || !/^-?\\d+$/u.test(stringValue)) {\n return undefined;\n }\n return Number(stringValue);\n}\n\nexport function parseQaTarget(target: string): ParsedQaTarget {\n const trimmed = target.trim();\n const invalidTarget = () => {\n throw new Error(\n \"OpenClaw Crabline target must be a non-blank native id or a valid dm:<id>, group:<id>, channel:<id>, or thread:<id>/<thread-id> target.\",\n );\n };\n if (!trimmed) {\n return invalidTarget();\n }\n if (trimmed.startsWith(\"thread:\")) {\n const encoded = trimmed.startsWith(\"thread:/v1/\");\n const rest = trimmed.slice(encoded ? \"thread:/v1/\".length : \"thread:\".length);\n const slash = rest.indexOf(\"/\");\n if (slash <= 0 || slash !== rest.lastIndexOf(\"/\")) {\n return invalidTarget();\n }\n let id = rest.slice(0, slash).trim();\n let threadId = rest.slice(slash + 1).trim();\n if (encoded) {\n try {\n id = decodeURIComponent(id).trim();\n threadId = decodeURIComponent(threadId).trim();\n } catch {\n return invalidTarget();\n }\n }\n if (!id || !threadId) {\n return invalidTarget();\n }\n return { kind: \"group\", id, native: false, threadId };\n }\n if (trimmed.startsWith(\"channel:\")) {\n const id = trimmed.slice(\"channel:\".length).trim();\n return id ? { kind: \"group\", id, native: false } : invalidTarget();\n }\n if (trimmed.startsWith(\"group:\")) {\n const id = trimmed.slice(\"group:\".length).trim();\n return id ? { kind: \"group\", id, native: false } : invalidTarget();\n }\n if (trimmed.startsWith(\"dm:\")) {\n const id = trimmed.slice(\"dm:\".length).trim();\n return id ? { kind: \"direct\", id, native: false } : invalidTarget();\n }\n if (/^(?:dm|group|channel|thread)(?=\\s*:|$)/iu.test(trimmed)) {\n return invalidTarget();\n }\n return { kind: \"direct\", id: trimmed, native: true };\n}\n\nexport function canonicalConversationIdForInbound(input: OpenClawCrablineInboundInput) {\n const conversationId = readNonBlankString(input.conversation.id);\n if (!conversationId) {\n throw new Error(\"OpenClaw Crabline inbound conversation id is required.\");\n }\n return conversationId.trim();\n}\n\nfunction encodeQaThreadComponent(value: string): string {\n return value.replaceAll(\"%\", \"%25\").replaceAll(\"/\", \"%2F\");\n}\n\nexport function qaTargetForInbound(input: OpenClawCrablineInboundInput) {\n const conversationId = canonicalConversationIdForInbound(input);\n const threadId = input.threadId?.trim();\n const prefix = input.conversation.kind === \"direct\" ? \"dm\" : \"group\";\n return threadId\n ? `thread:/v1/${encodeQaThreadComponent(conversationId)}/${encodeQaThreadComponent(threadId)}`\n : `${prefix}:${conversationId}`;\n}\n\nexport function createAdminInboundRequest(manifest: CrablineServerManifest) {\n return {\n providerHeaders: {\n \"content-type\": \"application/json\",\n [ADMIN_TOKEN_HEADER]: manifest.adminToken,\n },\n providerUrl: manifest.endpoints.adminInboundUrl,\n };\n}\n"]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { type CrablineServerChannel } from "../servers/index.js";
|
|
2
|
+
export type OpenClawCrablineSmokeRunLock = {
|
|
3
|
+
assertOwned(): Promise<void>;
|
|
4
|
+
commitFileAtomically(params: {
|
|
5
|
+
contents: string;
|
|
6
|
+
destinationPath: string;
|
|
7
|
+
stageDirectory?: string;
|
|
8
|
+
stageFile(filePath: string, contents: string): Promise<void>;
|
|
9
|
+
}): Promise<void>;
|
|
10
|
+
release(): Promise<void>;
|
|
11
|
+
};
|
|
12
|
+
type HeartbeatController = {
|
|
13
|
+
assertHealthy(): void;
|
|
14
|
+
settle(): Promise<void>;
|
|
15
|
+
stop(): Promise<void>;
|
|
16
|
+
};
|
|
17
|
+
type RemoveLockDirectory = (lockDirectory: string) => Promise<void>;
|
|
18
|
+
type Sleep = (delayMs: number) => Promise<void>;
|
|
19
|
+
type IsProcessAlive = (pid: number) => boolean;
|
|
20
|
+
type GetProcessIdentity = (pid: number) => string | null;
|
|
21
|
+
type StartHeartbeat = (renew: () => Promise<void>, intervalMs: number) => HeartbeatController;
|
|
22
|
+
type BeforeRecoveryClaim = () => Promise<void>;
|
|
23
|
+
type BeforeRecoveryDeleteClaim = () => Promise<void>;
|
|
24
|
+
type BeforeReleaseClaim = () => Promise<void>;
|
|
25
|
+
type BeforeCommitClaim = () => Promise<void>;
|
|
26
|
+
type BeforeCommitFileRename = () => Promise<void>;
|
|
27
|
+
type BeforeCommitRename = () => Promise<void>;
|
|
28
|
+
type SecureWindowsDirectory = (directoryPath: string) => Promise<void>;
|
|
29
|
+
type AfterLockDirectoryWrite = (directoryPath: string) => Promise<void>;
|
|
30
|
+
export declare function processStartedAtMsFromTimeOrigin(timeOrigin: number): number;
|
|
31
|
+
export declare const isProcessAlive: IsProcessAlive;
|
|
32
|
+
export declare function processIdentityFromLinuxStat(value: string, bootId: string): string | null;
|
|
33
|
+
export declare function processIdentityFromDarwin(processStartedAt: string, bootTime: string): string | null;
|
|
34
|
+
export declare function darwinProcessIdentityEnvironment(environment: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
35
|
+
export declare function acquireOpenClawCrablineSmokeRunLock(params: {
|
|
36
|
+
channel: CrablineServerChannel;
|
|
37
|
+
outputDir: string;
|
|
38
|
+
}, dependencies?: {
|
|
39
|
+
afterLockCandidateInstall?: AfterLockDirectoryWrite;
|
|
40
|
+
afterLockOwnerWrite?: AfterLockDirectoryWrite;
|
|
41
|
+
getProcessIdentity?: GetProcessIdentity;
|
|
42
|
+
isProcessAlive?: IsProcessAlive;
|
|
43
|
+
leaseMs?: number;
|
|
44
|
+
now?: () => number;
|
|
45
|
+
pid?: number;
|
|
46
|
+
processIdentity?: string | null;
|
|
47
|
+
processStartedAtMs?: number;
|
|
48
|
+
platform?: NodeJS.Platform;
|
|
49
|
+
secureWindowsDirectory?: SecureWindowsDirectory;
|
|
50
|
+
beforeCommitClaim?: BeforeCommitClaim;
|
|
51
|
+
beforeCommitFileRename?: BeforeCommitFileRename;
|
|
52
|
+
beforeCommitRename?: BeforeCommitRename;
|
|
53
|
+
beforeRecoveryDeleteClaim?: BeforeRecoveryDeleteClaim;
|
|
54
|
+
beforeRecoveryClaim?: BeforeRecoveryClaim;
|
|
55
|
+
beforeReleaseClaim?: BeforeReleaseClaim;
|
|
56
|
+
removeDirectory?: RemoveLockDirectory;
|
|
57
|
+
sleep?: Sleep;
|
|
58
|
+
startHeartbeat?: StartHeartbeat;
|
|
59
|
+
}): Promise<OpenClawCrablineSmokeRunLock>;
|
|
60
|
+
export declare function releaseOpenClawCrablineSmokeRunLock(lock: Pick<OpenClawCrablineSmokeRunLock, "release">, dependencies?: {
|
|
61
|
+
sleep?: Sleep;
|
|
62
|
+
}): Promise<void>;
|
|
63
|
+
export {};
|