@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,21 +1,14 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import type { NativeIdRule } from "../native-ids.js";
|
|
1
|
+
import { type NativeIdRule } from "../native-ids.js";
|
|
3
2
|
import type { InboundEnvelope } from "../types.js";
|
|
4
3
|
export type { NativeIdRule } from "../native-ids.js";
|
|
5
4
|
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
5
|
+
export declare function createSecretVerifier(expected: string): (candidate: string | null) => boolean;
|
|
6
6
|
export declare function optionalRecord(value: Record<string, unknown>, key: string): Record<string, unknown> | undefined;
|
|
7
7
|
export declare function optionalString(value: Record<string, unknown>, key: string): string | undefined;
|
|
8
8
|
export declare function optionalNumberString(value: Record<string, unknown>, key: string): string | undefined;
|
|
9
9
|
export declare function optionalStringish(value: Record<string, unknown>, key: string): string | undefined;
|
|
10
10
|
export declare function normalizeAuthor(value: unknown): "assistant" | "system" | "user" | undefined;
|
|
11
|
-
export declare function requireNativeId(value: string, rule: NativeIdRule, label: string): string;
|
|
12
11
|
export declare function requireNativeInboundId(value: string, rule: NativeIdRule, label: string): string;
|
|
13
|
-
export declare function createNativeTargetCodec(options: {
|
|
14
|
-
channel: NativeIdRule;
|
|
15
|
-
channelLabel?: string | undefined;
|
|
16
|
-
thread?: NativeIdRule | undefined;
|
|
17
|
-
threadLabel?: string | undefined;
|
|
18
|
-
}): LocalMockTargetCodec;
|
|
19
12
|
export declare function genericMockPayloadWithNativeThread(params: {
|
|
20
13
|
channelRule?: NativeIdRule | undefined;
|
|
21
14
|
payload: Record<string, unknown>;
|
|
@@ -1,7 +1,14 @@
|
|
|
1
|
+
import { createHash, timingSafeEqual } from "node:crypto";
|
|
1
2
|
import { CrablineError } from "../../core/errors.js";
|
|
3
|
+
import { numericNativeId } from "../native-ids.js";
|
|
2
4
|
export function isRecord(value) {
|
|
3
5
|
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
4
6
|
}
|
|
7
|
+
export function createSecretVerifier(expected) {
|
|
8
|
+
const expectedDigest = createHash("sha256").update(expected).digest();
|
|
9
|
+
return (candidate) => candidate !== null &&
|
|
10
|
+
timingSafeEqual(createHash("sha256").update(candidate).digest(), expectedDigest);
|
|
11
|
+
}
|
|
5
12
|
export function optionalRecord(value, key) {
|
|
6
13
|
const child = value[key];
|
|
7
14
|
return isRecord(child) ? child : undefined;
|
|
@@ -12,7 +19,9 @@ export function optionalString(value, key) {
|
|
|
12
19
|
}
|
|
13
20
|
export function optionalNumberString(value, key) {
|
|
14
21
|
const child = value[key];
|
|
15
|
-
return typeof child === "number" || typeof child === "bigint"
|
|
22
|
+
return typeof child === "number" || typeof child === "bigint"
|
|
23
|
+
? numericNativeId(child)
|
|
24
|
+
: undefined;
|
|
16
25
|
}
|
|
17
26
|
export function optionalStringish(value, key) {
|
|
18
27
|
return optionalString(value, key) ?? optionalNumberString(value, key);
|
|
@@ -20,14 +29,6 @@ export function optionalStringish(value, key) {
|
|
|
20
29
|
export function normalizeAuthor(value) {
|
|
21
30
|
return value === "assistant" || value === "system" || value === "user" ? value : undefined;
|
|
22
31
|
}
|
|
23
|
-
export function requireNativeId(value, rule, label) {
|
|
24
|
-
if (!rule.pattern.test(value)) {
|
|
25
|
-
throw new CrablineError(`${label} must be a native ${rule.name} such as ${rule.example}.`, {
|
|
26
|
-
kind: "config",
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
return value;
|
|
30
|
-
}
|
|
31
32
|
export function requireNativeInboundId(value, rule, label) {
|
|
32
33
|
if (!rule.pattern.test(value)) {
|
|
33
34
|
throw new CrablineError(`${label} must be a native ${rule.name} such as ${rule.example}.`, {
|
|
@@ -36,34 +37,10 @@ export function requireNativeInboundId(value, rule, label) {
|
|
|
36
37
|
}
|
|
37
38
|
return value;
|
|
38
39
|
}
|
|
39
|
-
export function createNativeTargetCodec(options) {
|
|
40
|
-
const channelLabel = options.channelLabel ?? "channelId";
|
|
41
|
-
const threadLabel = options.threadLabel ?? "threadId";
|
|
42
|
-
const threadRule = options.thread ?? options.channel;
|
|
43
|
-
return {
|
|
44
|
-
normalize(target) {
|
|
45
|
-
const channelId = requireNativeId(target.channelId ?? target.id, options.channel, channelLabel);
|
|
46
|
-
const normalized = {
|
|
47
|
-
channelId,
|
|
48
|
-
id: target.id,
|
|
49
|
-
metadata: target.metadata,
|
|
50
|
-
};
|
|
51
|
-
if (target.threadId) {
|
|
52
|
-
normalized.threadId = requireNativeId(target.threadId, threadRule, threadLabel);
|
|
53
|
-
}
|
|
54
|
-
return normalized;
|
|
55
|
-
},
|
|
56
|
-
resolveThreadId(target) {
|
|
57
|
-
const normalized = this.normalize(target);
|
|
58
|
-
return normalized.threadId ?? normalized.channelId ?? normalized.id;
|
|
59
|
-
},
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
40
|
export function genericMockPayloadWithNativeThread(params) {
|
|
63
41
|
const message = optionalRecord(params.payload, "message");
|
|
64
|
-
const threadId = message
|
|
65
|
-
|
|
66
|
-
: optionalString(params.payload, "threadId");
|
|
42
|
+
const threadId = (message ? optionalString(message, "threadId") : undefined) ??
|
|
43
|
+
optionalString(params.payload, "threadId");
|
|
67
44
|
if (!threadId) {
|
|
68
45
|
return {
|
|
69
46
|
...(normalizeAuthor(params.payload.author)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-local-mock.js","sourceRoot":"","sources":["../../../../src/providers/builtin/native-local-mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"native-local-mock.js","sourceRoot":"","sources":["../../../../src/providers/builtin/native-local-mock.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, timingSafeEqual } from \"node:crypto\";\nimport { CrablineError } from \"../../core/errors.js\";\nimport { numericNativeId, type NativeIdRule } from \"../native-ids.js\";\nimport type { InboundEnvelope } from \"../types.js\";\n\nexport type { NativeIdRule } from \"../native-ids.js\";\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function createSecretVerifier(expected: string): (candidate: string | null) => boolean {\n const expectedDigest = createHash(\"sha256\").update(expected).digest();\n return (candidate) =>\n candidate !== null &&\n timingSafeEqual(createHash(\"sha256\").update(candidate).digest(), expectedDigest);\n}\n\nexport function optionalRecord(\n value: Record<string, unknown>,\n key: string,\n): Record<string, unknown> | undefined {\n const child = value[key];\n return isRecord(child) ? child : undefined;\n}\n\nexport function optionalString(value: Record<string, unknown>, key: string): string | undefined {\n const child = value[key];\n return typeof child === \"string\" && child.length > 0 ? child : undefined;\n}\n\nexport function optionalNumberString(\n value: Record<string, unknown>,\n key: string,\n): string | undefined {\n const child = value[key];\n return typeof child === \"number\" || typeof child === \"bigint\"\n ? numericNativeId(child)\n : undefined;\n}\n\nexport function optionalStringish(value: Record<string, unknown>, key: string): string | undefined {\n return optionalString(value, key) ?? optionalNumberString(value, key);\n}\n\nexport function normalizeAuthor(value: unknown): \"assistant\" | \"system\" | \"user\" | undefined {\n return value === \"assistant\" || value === \"system\" || value === \"user\" ? value : undefined;\n}\n\nexport function requireNativeInboundId(value: string, rule: NativeIdRule, label: string): string {\n if (!rule.pattern.test(value)) {\n throw new CrablineError(`${label} must be a native ${rule.name} such as ${rule.example}.`, {\n kind: \"inbound\",\n });\n }\n return value;\n}\n\nexport function genericMockPayloadWithNativeThread(params: {\n channelRule?: NativeIdRule | undefined;\n payload: Record<string, unknown>;\n threadRule: NativeIdRule;\n}) {\n const message = optionalRecord(params.payload, \"message\");\n const threadId =\n (message ? optionalString(message, \"threadId\") : undefined) ??\n optionalString(params.payload, \"threadId\");\n if (!threadId) {\n return {\n ...(normalizeAuthor(params.payload.author)\n ? { author: normalizeAuthor(params.payload.author) }\n : {}),\n ...(typeof params.payload.authorIsBot === \"boolean\"\n ? { authorIsBot: params.payload.authorIsBot }\n : {}),\n ...(optionalString(params.payload, \"id\") ? { id: optionalString(params.payload, \"id\") } : {}),\n raw: params.payload.raw ?? params.payload,\n ...(optionalString(params.payload, \"text\")\n ? { text: optionalString(params.payload, \"text\") }\n : {}),\n };\n }\n\n const isValidThread = params.threadRule.pattern.test(threadId);\n const isValidChannel = params.channelRule?.pattern.test(threadId) ?? false;\n if (!isValidThread && !isValidChannel) {\n throw new CrablineError(\n `mock webhook threadId must be a native ${params.threadRule.name}${\n params.channelRule ? ` or ${params.channelRule.name}` : \"\"\n }.`,\n { kind: \"inbound\" },\n );\n }\n\n return {\n ...(normalizeAuthor(params.payload.author)\n ? { author: normalizeAuthor(params.payload.author) }\n : {}),\n ...(typeof params.payload.authorIsBot === \"boolean\"\n ? { authorIsBot: params.payload.authorIsBot }\n : {}),\n ...(optionalString(params.payload, \"id\") ? { id: optionalString(params.payload, \"id\") } : {}),\n ...(message\n ? {\n message: {\n ...(normalizeAuthor(message.author) ? { author: normalizeAuthor(message.author) } : {}),\n ...(typeof message.authorIsBot === \"boolean\"\n ? { authorIsBot: message.authorIsBot }\n : {}),\n ...(optionalString(message, \"id\") ? { id: optionalString(message, \"id\") } : {}),\n ...(message.raw !== undefined ? { raw: message.raw } : {}),\n ...(optionalString(message, \"text\") ? { text: optionalString(message, \"text\") } : {}),\n threadId,\n },\n }\n : {}),\n raw: params.payload.raw ?? params.payload,\n ...(optionalString(params.payload, \"text\")\n ? { text: optionalString(params.payload, \"text\") }\n : {}),\n threadId,\n };\n}\n\nexport function authorFromBotFlag(isBot: boolean | undefined): InboundEnvelope[\"author\"] {\n return isBot ? \"assistant\" : \"user\";\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { ProviderAdapter, ProviderContext, SendContext, WaitContext, WatchContext } from "../types.js";
|
|
2
|
-
type
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import type { InboundEnvelope, ProviderAdapter, ProviderContext, SendContext, WaitContext, WatchContext } from "../types.js";
|
|
2
|
+
type ScriptWatchIterator = AsyncIterableIterator<InboundEnvelope> & {
|
|
3
|
+
[Symbol.asyncIterator](): ScriptWatchIterator;
|
|
4
|
+
return(): Promise<IteratorResult<InboundEnvelope, undefined>>;
|
|
5
|
+
throw(error?: unknown): Promise<IteratorResult<InboundEnvelope, undefined>>;
|
|
6
6
|
};
|
|
7
7
|
export declare class ScriptProviderAdapter implements ProviderAdapter {
|
|
8
8
|
#private;
|
|
@@ -16,7 +16,11 @@ export declare class ScriptProviderAdapter implements ProviderAdapter {
|
|
|
16
16
|
details: string[];
|
|
17
17
|
healthy: boolean;
|
|
18
18
|
}>;
|
|
19
|
-
send(context: SendContext): Promise<
|
|
19
|
+
send(context: SendContext): Promise<{
|
|
20
|
+
accepted: boolean;
|
|
21
|
+
messageId: string;
|
|
22
|
+
threadId: string;
|
|
23
|
+
}>;
|
|
20
24
|
waitForInbound(context: WaitContext): Promise<{
|
|
21
25
|
author: "assistant" | "system" | "user";
|
|
22
26
|
id: string;
|
|
@@ -26,14 +30,6 @@ export declare class ScriptProviderAdapter implements ProviderAdapter {
|
|
|
26
30
|
threadId: string;
|
|
27
31
|
provider: string;
|
|
28
32
|
} | null>;
|
|
29
|
-
watch(context: WatchContext):
|
|
30
|
-
author: "assistant" | "system" | "user";
|
|
31
|
-
id: string;
|
|
32
|
-
raw?: unknown;
|
|
33
|
-
sentAt: string;
|
|
34
|
-
text: string;
|
|
35
|
-
threadId: string;
|
|
36
|
-
provider: string;
|
|
37
|
-
}, void, unknown>;
|
|
33
|
+
watch(context: WatchContext): ScriptWatchIterator;
|
|
38
34
|
}
|
|
39
35
|
export {};
|