@openclaw/crabline 0.1.12 → 0.1.14
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 +38 -11
- package/dist/src/cli/program.js +17 -2
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/index.d.ts +12 -10
- package/dist/src/index.js +6 -5
- package/dist/src/index.js.map +1 -1
- package/dist/src/openclaw/artifact-generation.d.ts +5 -9
- package/dist/src/openclaw/artifact-generation.js +41 -69
- package/dist/src/openclaw/artifact-generation.js.map +1 -1
- package/dist/src/openclaw/bridges/discord.d.ts +1 -0
- package/dist/src/openclaw/bridges/discord.js +149 -0
- package/dist/src/openclaw/bridges/discord.js.map +1 -0
- package/dist/src/openclaw/bridges/matrix.js +1 -1
- package/dist/src/openclaw/bridges/matrix.js.map +1 -1
- package/dist/src/openclaw/bridges/mattermost.js +1 -1
- package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
- package/dist/src/openclaw/bridges/signal.js +1 -1
- package/dist/src/openclaw/bridges/signal.js.map +1 -1
- package/dist/src/openclaw/bridges/slack.js +1 -1
- package/dist/src/openclaw/bridges/slack.js.map +1 -1
- package/dist/src/openclaw/bridges/telegram.js +1 -1
- package/dist/src/openclaw/bridges/telegram.js.map +1 -1
- package/dist/src/openclaw/bridges/whatsapp.js +1 -1
- package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
- package/dist/src/openclaw/bridges/zalo.js +1 -1
- package/dist/src/openclaw/bridges/zalo.js.map +1 -1
- package/dist/src/openclaw/outbound-contract.js +3 -0
- package/dist/src/openclaw/outbound-contract.js.map +1 -1
- package/dist/src/openclaw/{smoke-lock.d.ts → provider-readiness-lock.d.ts} +7 -7
- package/dist/src/openclaw/{smoke-lock.js → provider-readiness-lock.js} +122 -260
- package/dist/src/openclaw/provider-readiness-lock.js.map +1 -0
- package/dist/src/openclaw/shared.d.ts +9 -17
- package/dist/src/openclaw/shared.js +5 -6
- package/dist/src/openclaw/shared.js.map +1 -1
- package/dist/src/openclaw.d.ts +3 -5
- package/dist/src/openclaw.js +22 -20
- package/dist/src/openclaw.js.map +1 -1
- package/dist/src/servers/discord.d.ts +40 -0
- package/dist/src/servers/discord.js +842 -0
- package/dist/src/servers/discord.js.map +1 -0
- package/dist/src/servers/index.d.ts +10 -4
- package/dist/src/servers/index.js +4 -0
- package/dist/src/servers/index.js.map +1 -1
- package/dist/src/servers/slack.js +11 -3
- package/dist/src/servers/slack.js.map +1 -1
- package/dist/src/servers/telegram.js +51 -2
- package/dist/src/servers/telegram.js.map +1 -1
- package/dist/src/servers/whatsapp-baileys-websocket.js +7 -0
- package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/binary-node.js +12 -0
- package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
- package/dist/src/servers/whatsapp.d.ts +0 -1
- package/dist/src/servers/whatsapp.js +0 -1
- package/dist/src/servers/whatsapp.js.map +1 -1
- package/docs/channel-setup.md +66 -21
- package/package.json +1 -1
- package/dist/src/openclaw/smoke-lock.js.map +0 -1
package/README.md
CHANGED
|
@@ -5,8 +5,10 @@
|
|
|
5
5
|
Deterministic local messaging-channel mocks for OpenClaw QA.
|
|
6
6
|
|
|
7
7
|
`crabline` is config-driven, CI-friendly, and deliberately has no `openclaw`
|
|
8
|
-
dependency.
|
|
9
|
-
|
|
8
|
+
dependency. A fixture-level **local mock provider** is a Crabline adapter used
|
|
9
|
+
directly by fixture commands. A **local provider server** is a separate process
|
|
10
|
+
that the Crabline channel driver starts so a real OpenClaw channel plugin can
|
|
11
|
+
exercise its normal provider protocol during deterministic QA.
|
|
10
12
|
|
|
11
13
|
## What It Provides
|
|
12
14
|
|
|
@@ -15,16 +17,17 @@ provider APIs that OpenClaw live adapters can target during deterministic QA.
|
|
|
15
17
|
`whatsapp`, and `zalo`
|
|
16
18
|
- a `script` bridge for channels that are still exercised by external commands
|
|
17
19
|
- per-provider local webhook endpoints for inbound events
|
|
18
|
-
- local provider servers for
|
|
19
|
-
Signal, Slack, Telegram, WhatsApp, and Zalo
|
|
20
|
+
- local provider servers for Crabline channel-driver tests for Discord,
|
|
21
|
+
Mattermost, Matrix, Signal, Slack, Telegram, WhatsApp, and Zalo
|
|
20
22
|
- JSONL recorder files for deterministic wait/watch behavior
|
|
21
23
|
- nonce-based `send`, `roundtrip`, `agent`, `probe`, `run`, `watch`, and
|
|
22
24
|
`doctor` commands
|
|
23
25
|
- text output by default and stable `--json` output for automation
|
|
24
26
|
|
|
25
|
-
Crabline local servers are not live-provider coverage
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
Crabline local provider servers are not live-provider coverage and are not the
|
|
28
|
+
fixture-level local mock provider feature. They let the real OpenClaw channel
|
|
29
|
+
plugin run against a local provider-shaped API. Release lanes still need the
|
|
30
|
+
`live` driver and real provider credentials.
|
|
28
31
|
|
|
29
32
|
## Install
|
|
30
33
|
|
|
@@ -143,9 +146,10 @@ them only from sources you trust and review changes before use.
|
|
|
143
146
|
|
|
144
147
|
## Local Provider Servers
|
|
145
148
|
|
|
146
|
-
`serve` starts provider
|
|
147
|
-
preferred
|
|
148
|
-
|
|
149
|
+
`serve` starts local provider servers for real OpenClaw channel plugins. This is
|
|
150
|
+
the preferred Crabline channel-driver path because the plugin still uses its
|
|
151
|
+
normal provider protocol while the provider endpoint is local and
|
|
152
|
+
deterministic. It does not use Crabline's fixture-level local mock provider.
|
|
149
153
|
|
|
150
154
|
Commands in this section use the installed-package form. In a source checkout,
|
|
151
155
|
replace `crabline` with `pnpm dev`.
|
|
@@ -195,6 +199,30 @@ lock identities omit device numbers so containers that mount the same inode
|
|
|
195
199
|
under different device IDs still coordinate. Otherwise, Unix writers coordinate
|
|
196
200
|
through the OS account's `~/.cache/crabline/locks/server-recorder` namespace.
|
|
197
201
|
|
|
202
|
+
Discord:
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
crabline --json serve discord --ready-file .crabline/discord-server.json
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
The manifest contains the bot/application identity, bot token, REST API root,
|
|
209
|
+
Gateway metadata endpoint, Gateway WebSocket URL, authenticated admin ingress,
|
|
210
|
+
and recorder path. The server implements the Discord REST v10 and Gateway
|
|
211
|
+
subset used by the real OpenClaw Discord plugin: bot identity, `/gateway/bot`,
|
|
212
|
+
JSON Gateway HELLO/IDENTIFY/READY/heartbeat/resume, DM and guild text channels,
|
|
213
|
+
message sends and replies, typing, basic guild/member lookups, and application
|
|
214
|
+
command registration. Admin ingress turns an injected user message into a
|
|
215
|
+
normal `MESSAGE_CREATE` Gateway dispatch.
|
|
216
|
+
|
|
217
|
+
This local provider server is separate from the fixture-level Discord local
|
|
218
|
+
mock provider listed under Built-In Mock Channels. The fixture adapter models
|
|
219
|
+
Discord interactions directly for Crabline commands; the server lets a real
|
|
220
|
+
Discord client exercise provider-native REST and Gateway boundaries.
|
|
221
|
+
|
|
222
|
+
The supported Gateway is v10 JSON with one shard. Transport compression,
|
|
223
|
+
voice, interactions, attachments/multipart uploads, audit logs, and Discord's
|
|
224
|
+
distributed permission and rate-limit systems are outside the current subset.
|
|
225
|
+
|
|
198
226
|
Mattermost:
|
|
199
227
|
|
|
200
228
|
```bash
|
|
@@ -347,7 +375,6 @@ The JSON manifest contains:
|
|
|
347
375
|
- `endpoints.adminInboundUrl`: authenticated POST endpoint for test user
|
|
348
376
|
messages using the WhatsApp Business webhook payload shape
|
|
349
377
|
- `endpoints.messagesUrl`: provider-native Cloud API message and status endpoint
|
|
350
|
-
- `endpoints.statusUrl`: alias for the same provider-native status endpoint
|
|
351
378
|
- `recorderPath`: JSONL file of local provider API/admin traffic and Baileys
|
|
352
379
|
WebSocket stanzas
|
|
353
380
|
|
package/dist/src/cli/program.js
CHANGED
|
@@ -24,6 +24,13 @@ const SERVE_CREDENTIAL_ENV = [
|
|
|
24
24
|
["signingSecret", "CRABLINE_SIGNING_SECRET"],
|
|
25
25
|
];
|
|
26
26
|
const SERVE_PARAM_FACTORIES = {
|
|
27
|
+
discord: (shared, commandOptions) => ({
|
|
28
|
+
...shared,
|
|
29
|
+
adminToken: commandOptions.adminToken,
|
|
30
|
+
botToken: commandOptions.botToken,
|
|
31
|
+
botUsername: commandOptions.botUsername,
|
|
32
|
+
channel: "discord",
|
|
33
|
+
}),
|
|
27
34
|
mattermost: (shared, commandOptions) => ({
|
|
28
35
|
...shared,
|
|
29
36
|
adminToken: commandOptions.adminToken,
|
|
@@ -499,7 +506,7 @@ export function createProgram(setExitCode = (code) => {
|
|
|
499
506
|
.option("--host <host>", "Bind host", "127.0.0.1")
|
|
500
507
|
.option("--port <port>", "Bind port", "0")
|
|
501
508
|
.option("--account <number>", "Signal account number")
|
|
502
|
-
.option("--bot-username <username>", "Mattermost, Telegram, or Zalo bot username", "crabline_bot")
|
|
509
|
+
.option("--bot-username <username>", "Discord, Mattermost, Telegram, or Zalo bot username", "crabline_bot")
|
|
503
510
|
.option("--credentials-fd <fd>", "Read JSON credentials from fd 0 or an inherited fd; values override CRABLINE_* env")
|
|
504
511
|
.option("--recorder <path>", "JSONL recorder path")
|
|
505
512
|
.option("--ready-file <path>", "Write the server runtime manifest to this path")
|
|
@@ -943,6 +950,15 @@ function renderServeText(manifest, showSecrets) {
|
|
|
943
950
|
}
|
|
944
951
|
function renderServeProviderFields(manifest, showSecrets) {
|
|
945
952
|
const secret = (value) => (showSecrets ? value : "<redacted>");
|
|
953
|
+
if (manifest.provider === "discord") {
|
|
954
|
+
return [
|
|
955
|
+
` adminToken: ${secret(manifest.adminToken)}`,
|
|
956
|
+
` botToken: ${secret(manifest.botToken)}`,
|
|
957
|
+
` applicationId: ${manifest.applicationId}`,
|
|
958
|
+
` botUserId: ${manifest.botUserId}`,
|
|
959
|
+
` gateway: ${manifest.endpoints.gatewayUrl}`,
|
|
960
|
+
];
|
|
961
|
+
}
|
|
946
962
|
if (manifest.provider === "mattermost") {
|
|
947
963
|
return [
|
|
948
964
|
` adminToken: ${secret(manifest.adminToken)}`,
|
|
@@ -984,7 +1000,6 @@ function renderServeProviderFields(manifest, showSecrets) {
|
|
|
984
1000
|
` baileysWebSocket: ${baileysWebSocketUrl}`,
|
|
985
1001
|
` messages: ${manifest.endpoints.messagesUrl}`,
|
|
986
1002
|
` phoneNumber: ${manifest.endpoints.phoneNumberUrl}`,
|
|
987
|
-
` status: ${manifest.endpoints.statusUrl}`,
|
|
988
1003
|
` selfJid: ${manifest.selfJid}`,
|
|
989
1004
|
];
|
|
990
1005
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"program.js","sourceRoot":"","sources":["../../../src/cli/program.ts"],"names":[],"mappings":"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","sourcesContent":["import { Command, CommanderError, Option } from \"commander\";\nimport { randomUUID } from \"node:crypto\";\nimport { constants as fsConstants, createReadStream } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport nodePath from \"node:path\";\nimport { finished } from \"node:stream/promises\";\nimport { lock } from \"proper-lockfile\";\nimport { loadManifest } from \"../config/load.js\";\nimport { EXIT_CODES } from \"../core/exit-codes.js\";\nimport { createRegistry } from \"../providers/registry.js\";\nimport {\n formatJson,\n formatJsonResult,\n formatRunResultText,\n sanitizeTerminalText,\n} from \"../core/reporters.js\";\nimport {\n assertScriptStdinPayloadSize,\n computeExitCode,\n runFixtureCommand,\n runSuite,\n} from \"../core/run.js\";\nimport { CrablineError, ensureErrorMessage } from \"../core/errors.js\";\nimport {\n isCrablineServerChannel,\n startCrablineServer,\n type CrablineServerChannel,\n type CrablineServerManifest,\n type StartCrablineServerParams,\n type StartedCrablineServer,\n} from \"../servers/index.js\";\n\ntype GlobalOptions = {\n config?: string;\n json?: boolean;\n};\n\ntype SetExitCode = (code: number) => void;\n\nexport type ReadyFileIdentity = {\n birthtimeNs: bigint;\n ctimeNs: bigint;\n dev: bigint;\n ino: bigint;\n size: bigint;\n};\n\ntype ProgramDependencies = {\n acquireReadyFileLease?: (filePath: string) => Promise<() => Promise<void>>;\n createRegistry?: typeof createRegistry;\n publishReadyFile?: (filePath: string, contents: string) => Promise<ReadyFileIdentity>;\n removeReadyFile?: (\n filePath: string,\n expectedContents: string,\n expectedIdentity: ReadyFileIdentity,\n ) => Promise<void>;\n startServer?: (params: StartCrablineServerParams) => Promise<StartedCrablineServer>;\n};\n\ntype RunCliOptions = {\n dependencies?: ProgramDependencies;\n forceExit?: (code: number) => never;\n};\n\ntype ServeSharedOptions = {\n host: string;\n port: number;\n recorderPath?: string | undefined;\n};\n\ntype ServeCommandOptions = {\n account?: string | undefined;\n accessToken?: string | undefined;\n adminToken?: string | undefined;\n botToken?: string | undefined;\n botUsername?: string | undefined;\n credentialsFd?: string | undefined;\n host: string;\n once?: boolean | undefined;\n port: string;\n readyFile?: string | undefined;\n recorder?: string | undefined;\n selfJid?: string | undefined;\n showSecrets?: boolean | undefined;\n signingSecret?: string | undefined;\n};\n\ntype ServeParamFactory = (\n shared: ServeSharedOptions,\n commandOptions: ServeCommandOptions,\n) => StartCrablineServerParams;\n\nconst READY_FILE_LEASE_STALE_MS = 60_000;\nconst READY_FILE_LEASE_UPDATE_MS = 1_000;\nconst MAX_SERVE_CREDENTIALS_BYTES = 64 * 1024;\nconst WATCH_SHUTDOWN_GRACE_MS = 250;\nconst WATCH_SHUTDOWN_REACHED = Symbol(\"watch shutdown reached\");\n\nconst SERVE_CREDENTIAL_ENV = [\n [\"accessToken\", \"CRABLINE_ACCESS_TOKEN\"],\n [\"adminToken\", \"CRABLINE_ADMIN_TOKEN\"],\n [\"botToken\", \"CRABLINE_BOT_TOKEN\"],\n [\"signingSecret\", \"CRABLINE_SIGNING_SECRET\"],\n] as const;\n\ntype ServeCredentialName = (typeof SERVE_CREDENTIAL_ENV)[number][0];\ntype ServeCredentials = Partial<Record<ServeCredentialName, string>>;\n\nconst SERVE_PARAM_FACTORIES = {\n mattermost: (shared, commandOptions) => ({\n ...shared,\n adminToken: commandOptions.adminToken,\n botToken: commandOptions.botToken,\n botUsername: commandOptions.botUsername,\n channel: \"mattermost\",\n }),\n matrix: (shared, commandOptions) => ({\n ...shared,\n accessToken: commandOptions.accessToken,\n adminToken: commandOptions.adminToken,\n channel: \"matrix\",\n }),\n signal: (shared, commandOptions) => ({\n ...shared,\n account: commandOptions.account,\n adminToken: commandOptions.adminToken,\n channel: \"signal\",\n }),\n slack: (shared, commandOptions) => ({\n ...shared,\n adminToken: commandOptions.adminToken,\n botToken: commandOptions.botToken,\n channel: \"slack\",\n signingSecret: commandOptions.signingSecret,\n }),\n telegram: (shared, commandOptions) => ({\n ...shared,\n adminToken: commandOptions.adminToken,\n botToken: commandOptions.botToken,\n botUsername: commandOptions.botUsername,\n channel: \"telegram\",\n }),\n whatsapp: (shared, commandOptions) => ({\n ...shared,\n accessToken: commandOptions.accessToken,\n adminToken: commandOptions.adminToken,\n channel: \"whatsapp\",\n selfJid: commandOptions.selfJid,\n }),\n zalo: (shared, commandOptions) => ({\n ...shared,\n adminToken: commandOptions.adminToken,\n botToken: commandOptions.botToken,\n botName: commandOptions.botUsername,\n channel: \"zalo\",\n }),\n} satisfies Record<CrablineServerChannel, ServeParamFactory>;\n\nfunction isClosedPipeError(error: unknown): boolean {\n const code = (error as NodeJS.ErrnoException).code;\n return code === \"EPIPE\" || code === \"ERR_STREAM_DESTROYED\";\n}\n\nasync function writeOutput(stream: NodeJS.WriteStream, value: string): Promise<boolean> {\n try {\n await new Promise<void>((resolve, reject) => {\n let drained = false;\n let written = false;\n const cleanup = () => {\n stream.off(\"drain\", onDrain);\n stream.off(\"error\", onError);\n };\n const finish = () => {\n if (drained && written) {\n cleanup();\n resolve();\n }\n };\n const onDrain = () => {\n drained = true;\n finish();\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n stream.once(\"error\", onError);\n let hasCapacity: boolean;\n try {\n hasCapacity = stream.write(value, (error) => {\n if (error) {\n stream.once(\"error\", () => undefined);\n onError(error);\n return;\n }\n written = true;\n finish();\n });\n } catch (error) {\n cleanup();\n reject(error);\n return;\n }\n if (hasCapacity) {\n drained = true;\n finish();\n } else {\n stream.once(\"drain\", onDrain);\n }\n });\n return true;\n } catch (error) {\n if (isClosedPipeError(error)) {\n return false;\n }\n throw error;\n }\n}\n\nasync function print(value: string): Promise<boolean> {\n return await writeOutput(process.stdout, `${value}\\n`);\n}\n\nclass WatchShutdownDeadlineError extends CrablineError {}\n\nfunction createWatchShutdownDeadline(): {\n race<T>(operation: PromiseLike<T>, operationName: string): Promise<T>;\n start(): void;\n} {\n let deadlineAt: number | undefined;\n const controller = new AbortController();\n return {\n async race<T>(operation: PromiseLike<T>, operationName: string): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n let removeStartListener: (() => void) | undefined;\n const deadline = new Promise<never>((_, reject) => {\n const arm = () => {\n timer = setTimeout(\n () => {\n reject(\n new WatchShutdownDeadlineError(\n `Provider ${operationName} did not settle within ${WATCH_SHUTDOWN_GRACE_MS}ms during watch shutdown.`,\n { kind: \"timeout\" },\n ),\n );\n },\n Math.max(0, deadlineAt! - Date.now()),\n );\n };\n if (controller.signal.aborted) {\n arm();\n return;\n }\n controller.signal.addEventListener(\"abort\", arm, { once: true });\n removeStartListener = () => controller.signal.removeEventListener(\"abort\", arm);\n });\n try {\n return await Promise.race([Promise.resolve(operation), deadline]);\n } finally {\n removeStartListener?.();\n if (timer) {\n clearTimeout(timer);\n }\n }\n },\n start() {\n if (deadlineAt !== undefined) {\n return;\n }\n deadlineAt = Date.now() + WATCH_SHUTDOWN_GRACE_MS;\n controller.abort();\n },\n };\n}\n\nfunction containsWatchShutdownDeadline(error: unknown, seen = new Set<object>()): boolean {\n if (error instanceof WatchShutdownDeadlineError) {\n return true;\n }\n if (!error || typeof error !== \"object\" || seen.has(error)) {\n return false;\n }\n seen.add(error);\n if (error instanceof AggregateError) {\n return error.errors.some((entry) => containsWatchShutdownDeadline(entry, seen));\n }\n return \"cause\" in error && containsWatchShutdownDeadline(error.cause, seen);\n}\n\nasync function withManifest<T>(\n options: GlobalOptions,\n action: (context: Awaited<ReturnType<typeof loadManifest>>) => Promise<T>,\n): Promise<T> {\n return action(await loadManifest(options.config));\n}\n\nfunction rejectedSecretOption(flags: string, optionName: string, envName: string): Option {\n return new Option(flags).hideHelp().argParser(() => {\n throw new CrablineError(\n `${optionName} no longer accepts credential values in command-line arguments. Use ${envName} or --credentials-fd.`,\n { kind: \"config\" },\n );\n });\n}\n\nfunction parseCredentialsFd(value: string): number {\n if (!/^[0-9]+$/u.test(value)) {\n throw new CrablineError(\n \"Serve credentials file descriptor must be 0 or an integer greater than 2.\",\n { kind: \"config\" },\n );\n }\n const fd = Number(value);\n if (!Number.isSafeInteger(fd) || fd === 1 || fd === 2 || fd > 2_147_483_647) {\n throw new CrablineError(\n \"Serve credentials file descriptor must be 0 or an integer greater than 2.\",\n { kind: \"config\" },\n );\n }\n return fd;\n}\n\nasync function readBoundedFileDescriptor(fd: number): Promise<string> {\n const stream = createReadStream(\"\", { autoClose: fd !== 0, fd });\n const chunks: Buffer[] = [];\n let totalBytes = 0;\n try {\n for await (const chunk of stream) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n totalBytes += buffer.byteLength;\n if (totalBytes > MAX_SERVE_CREDENTIALS_BYTES) {\n throw new CrablineError(\n `Serve credentials JSON exceeds ${MAX_SERVE_CREDENTIALS_BYTES} bytes.`,\n { kind: \"config\" },\n );\n }\n chunks.push(buffer);\n }\n } catch (error) {\n stream.destroy();\n if (error instanceof CrablineError) {\n throw error;\n }\n throw new CrablineError(`Unable to read serve credentials from file descriptor ${fd}.`, {\n cause: error,\n kind: \"config\",\n });\n } finally {\n if (fd !== 0 && !stream.closed) {\n stream.destroy();\n await finished(stream).catch(() => undefined);\n }\n }\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n\nfunction parseServeCredentialsJson(input: string): ServeCredentials {\n let parsed: unknown;\n try {\n parsed = JSON.parse(input);\n } catch (error) {\n throw new CrablineError(\"Serve credentials input must be valid JSON.\", {\n cause: error,\n kind: \"config\",\n });\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new CrablineError(\"Serve credentials JSON must be an object.\", { kind: \"config\" });\n }\n\n const values: ServeCredentials = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (!SERVE_CREDENTIAL_ENV.some(([name]) => name === key)) {\n throw new CrablineError(\"Serve credentials JSON contains unsupported fields.\", {\n kind: \"config\",\n });\n }\n if (typeof value !== \"string\") {\n throw new CrablineError(\"Serve credentials JSON values must be strings.\", {\n kind: \"config\",\n });\n }\n values[key as ServeCredentialName] = value;\n }\n return values;\n}\n\nasync function resolveServeCredentials(credentialsFd?: string): Promise<ServeCredentials> {\n const overrides =\n credentialsFd === undefined\n ? {}\n : parseServeCredentialsJson(\n await readBoundedFileDescriptor(parseCredentialsFd(credentialsFd)),\n );\n return Object.fromEntries(\n SERVE_CREDENTIAL_ENV.flatMap(([name, envName]) => {\n const override = overrides[name];\n const value = override ?? process.env[envName];\n return value === undefined ? [] : [[name, value]];\n }),\n ) as ServeCredentials;\n}\n\nexport function createProgram(\n setExitCode: SetExitCode = (code) => {\n process.exitCode = code;\n },\n dependencies: ProgramDependencies = {},\n): Command {\n const program = new Command();\n const acquireReadyLease = dependencies.acquireReadyFileLease ?? acquireReadyFileLease;\n const registryFactory = dependencies.createRegistry ?? createRegistry;\n const publish = dependencies.publishReadyFile ?? publishReadyFileUnlocked;\n const removeReady = dependencies.removeReadyFile ?? removeReadyFileIfOwned;\n const startServer = dependencies.startServer ?? startCrablineServer;\n const formatCliJson = (value: unknown): string => {\n const formatted = formatJsonResult(value);\n if (!formatted.ok) {\n setExitCode(EXIT_CODES.FAILURE);\n }\n return formatted.output;\n };\n\n program\n .exitOverride()\n .name(\"crabline\")\n .description(\"Deterministic CLI harness for messaging provider E2E tests\")\n .option(\"-c, --config <path>\", \"Config file path\")\n .option(\"--json\", \"Machine-readable output\", false)\n .showHelpAfterError();\n\n program\n .command(\"providers\")\n .description(\"List configured providers and provider catalog coverage\")\n .action(async () => {\n const options = program.opts() as GlobalOptions;\n const { manifest, path } = await loadManifest(options.config);\n const registry = registryFactory(manifest, path);\n const payload = {\n configured: Object.entries(manifest.providers).map(([id, config]) => ({\n adapter: config.adapter,\n capabilities: config.capabilities,\n id,\n platform: config.platform,\n status: config.status,\n })),\n support: registry.catalog,\n };\n await print(options.json ? formatCliJson(payload) : renderProvidersText(payload));\n });\n\n program\n .command(\"fixtures\")\n .description(\"List fixtures\")\n .action(async () => {\n const options = program.opts() as GlobalOptions;\n const { manifest } = await loadManifest(options.config);\n await print(\n options.json\n ? formatCliJson(manifest.fixtures)\n : manifest.fixtures\n .map(\n (fixture) =>\n `${sanitizeTerminalText(fixture.id, true)} ${sanitizeTerminalText(fixture.mode, true)} provider=${sanitizeTerminalText(fixture.provider, true)} target=${sanitizeTerminalText(fixture.target.id, true)}`,\n )\n .join(\"\\n\"),\n );\n });\n\n program\n .command(\"probe <fixtureId>\")\n .description(\"Probe provider readiness using a fixture\")\n .action(async (fixtureId) => {\n const options = program.opts() as GlobalOptions;\n const { manifest, path } = await loadManifest(options.config);\n const fixture = manifest.fixtures.find((entry) => entry.id === fixtureId);\n if (!fixture) {\n throw new CrablineError(`Unknown fixture: ${fixtureId}`, { kind: \"config\" });\n }\n const registry = registryFactory(manifest, path);\n const result = await runFixtureCommand({\n fixtureId: fixture.id,\n manifest,\n manifestPath: path,\n modeOverride: \"probe\",\n registry,\n });\n setExitCode(computeExitCode(result));\n await print(options.json ? formatCliJson(result) : formatRunResultText(result));\n });\n\n for (const mode of [\"send\", \"roundtrip\", \"agent\"] as const) {\n program\n .command(`${mode} <fixtureId>`)\n .description(`${mode} a fixture`)\n .action(async (fixtureId) => {\n const options = program.opts() as GlobalOptions;\n const { manifest, path } = await loadManifest(options.config);\n const registry = registryFactory(manifest, path);\n const result = await runFixtureCommand({\n fixtureId,\n manifest,\n manifestPath: path,\n modeOverride: mode,\n registry,\n });\n setExitCode(computeExitCode(result));\n await print(options.json ? formatCliJson(result) : formatRunResultText(result));\n });\n }\n\n program\n .command(\"run <fixtureIds...>\")\n .description(\"Run one or more fixtures as a suite\")\n .action(async (fixtureIds) => {\n const options = program.opts() as GlobalOptions;\n const { manifest, path } = await loadManifest(options.config);\n const registry = registryFactory(manifest, path);\n const result = await runSuite({\n fixtureIds,\n manifest,\n manifestPath: path,\n registry,\n });\n setExitCode(computeExitCode(result));\n await print(options.json ? formatCliJson(result) : formatRunResultText(result));\n });\n\n program\n .command(\"watch <fixtureId>\")\n .alias(\"webhook\")\n .description(\"Watch inbound messages for one fixture using provider webhook/recorder mode\")\n .action(async (fixtureId) => {\n const options = program.opts() as GlobalOptions;\n await withManifest(options, async ({ manifest, path }) => {\n const fixture = manifest.fixtures.find((entry) => entry.id === fixtureId);\n if (!fixture) {\n throw new CrablineError(`Unknown fixture: ${fixtureId}`, { kind: \"config\" });\n }\n\n const provider = registryFactory(manifest, path).resolve(fixture.provider, fixture.id);\n if (!provider.watch) {\n throw new CrablineError(`Provider \"${fixture.provider}\" does not implement watch.`, {\n kind: \"config\",\n });\n }\n\n const controller = new AbortController();\n const shutdownDeadline = createWatchShutdownDeadline();\n let iterator:\n | AsyncIterator<NonNullable<Awaited<ReturnType<typeof provider.waitForInbound>>>>\n | undefined;\n const stopWatch = onceAsync(async () => {\n shutdownDeadline.start();\n controller.abort();\n const returnResult = iterator?.return?.();\n if (returnResult) {\n await shutdownDeadline.race(returnResult, \"watch iterator return\");\n }\n });\n const shutdown = installShutdownHandler(stopWatch);\n const shutdownSettled = shutdown.wait().then(() => WATCH_SHUTDOWN_REACHED);\n const lifecycleErrors: unknown[] = [];\n try {\n const watchContext = {\n config: manifest.providers[fixture.provider]!,\n fixture,\n manifestPath: path,\n providerId: fixture.provider,\n signal: controller.signal,\n userName: manifest.userName,\n };\n if (watchContext.config.adapter === \"script\") {\n assertScriptStdinPayloadSize({\n fixture,\n provider: {\n config: watchContext.config,\n id: fixture.provider,\n manifestPath: path,\n },\n watch: {\n target: fixture.target,\n },\n });\n }\n const watch = provider.watch(watchContext);\n iterator = watch[Symbol.asyncIterator]();\n while (true) {\n const result = await Promise.race([iterator.next(), shutdownSettled]);\n if (typeof result === \"symbol\") {\n break;\n }\n if (result.done) {\n break;\n }\n const message = result.value;\n const written = await shutdownDeadline.race(\n print(\n options.json\n ? formatCliJson(message)\n : `${sanitizeTerminalText(message.sentAt, true)} ${sanitizeTerminalText(message.author, true)} ${sanitizeTerminalText(message.text, true)}`,\n ),\n \"watch output write\",\n );\n if (!written) {\n break;\n }\n }\n } catch (error) {\n lifecycleErrors.push(error);\n }\n try {\n await stopWatch();\n } catch (error) {\n if (!lifecycleErrors.includes(error)) {\n lifecycleErrors.push(error);\n }\n }\n try {\n const cleanup = provider.cleanup?.();\n if (cleanup) {\n await shutdownDeadline.race(cleanup, \"cleanup\");\n }\n } catch (error) {\n if (!lifecycleErrors.includes(error)) {\n lifecycleErrors.push(error);\n }\n } finally {\n shutdown.dispose();\n }\n if (lifecycleErrors.length > 0) {\n throw combineLifecycleErrors(lifecycleErrors, \"Crabline watch lifecycle failed.\");\n }\n });\n });\n\n program\n .command(\"serve <provider>\")\n .description(\"Start a local provider server that OpenClaw live adapters can target\")\n .option(\"--host <host>\", \"Bind host\", \"127.0.0.1\")\n .option(\"--port <port>\", \"Bind port\", \"0\")\n .option(\"--account <number>\", \"Signal account number\")\n .option(\n \"--bot-username <username>\",\n \"Mattermost, Telegram, or Zalo bot username\",\n \"crabline_bot\",\n )\n .option(\n \"--credentials-fd <fd>\",\n \"Read JSON credentials from fd 0 or an inherited fd; values override CRABLINE_* env\",\n )\n .option(\"--recorder <path>\", \"JSONL recorder path\")\n .option(\"--ready-file <path>\", \"Write the server runtime manifest to this path\")\n .option(\"--self-jid <jid>\", \"WhatsApp self JID\")\n .option(\"--show-secrets\", \"Print provider credentials in text output\", false)\n .option(\"--once\", \"Start, print the runtime manifest, and stop immediately\", false)\n .addOption(\n rejectedSecretOption(\"--access-token <token>\", \"--access-token\", \"CRABLINE_ACCESS_TOKEN\"),\n )\n .addOption(\n rejectedSecretOption(\"--admin-token <token>\", \"--admin-token\", \"CRABLINE_ADMIN_TOKEN\"),\n )\n .addOption(rejectedSecretOption(\"--bot-token <token>\", \"--bot-token\", \"CRABLINE_BOT_TOKEN\"))\n .addOption(\n rejectedSecretOption(\n \"--signing-secret <secret>\",\n \"--signing-secret\",\n \"CRABLINE_SIGNING_SECRET\",\n ),\n )\n .addHelpText(\n \"after\",\n [\n \"\",\n \"Credential JSON fields: accessToken, adminToken, botToken, signingSecret\",\n \"Environment fallbacks: CRABLINE_ACCESS_TOKEN, CRABLINE_ADMIN_TOKEN,\",\n \" CRABLINE_BOT_TOKEN, CRABLINE_SIGNING_SECRET\",\n ].join(\"\\n\"),\n )\n .action(async (provider, commandOptions: ServeCommandOptions) => {\n const options = program.opts() as GlobalOptions;\n if (!isCrablineServerChannel(provider)) {\n throw new CrablineError(`Unsupported server channel: ${provider}`, {\n kind: \"config\",\n });\n }\n if (!/^[0-9]+$/u.test(commandOptions.port)) {\n throw new CrablineError(`Invalid local server port: ${commandOptions.port}`, {\n kind: \"config\",\n });\n }\n const port = Number(commandOptions.port);\n if (!Number.isInteger(port) || port < 0 || port > 65_535) {\n throw new CrablineError(`Invalid local server port: ${commandOptions.port}`, {\n kind: \"config\",\n });\n }\n const factory = SERVE_PARAM_FACTORIES[provider];\n if (!factory) {\n throw new CrablineError(`Unsupported server channel: ${provider}`, {\n kind: \"config\",\n });\n }\n const credentials = await resolveServeCredentials(commandOptions.credentialsFd);\n commandOptions.accessToken = credentials.accessToken;\n commandOptions.adminToken = credentials.adminToken;\n commandOptions.botToken = credentials.botToken;\n commandOptions.signingSecret = credentials.signingSecret;\n let server: StartedCrablineServer | undefined;\n let startupSettled = false;\n let settleStartup: (() => void) | undefined;\n const startup = new Promise<void>((resolve) => {\n settleStartup = resolve;\n });\n const finishStartup = () => {\n if (!startupSettled) {\n startupSettled = true;\n settleStartup?.();\n }\n };\n let publicationSettled = false;\n let settlePublication: (() => void) | undefined;\n const publication = new Promise<void>((resolve) => {\n settlePublication = resolve;\n });\n const finishPublication = () => {\n if (!publicationSettled) {\n publicationSettled = true;\n settlePublication?.();\n }\n };\n let releaseReadyLease: (() => Promise<void>) | undefined;\n let publishedReady: { contents: string; identity: ReadyFileIdentity } | undefined;\n const close = onceAsync(async () => {\n await startup;\n await publication;\n const lifecycleErrors: unknown[] = [];\n if (commandOptions.readyFile && publishedReady) {\n try {\n await removeReady(\n commandOptions.readyFile,\n publishedReady.contents,\n publishedReady.identity,\n );\n } catch (error) {\n lifecycleErrors.push(error);\n }\n }\n let serverClosed = false;\n try {\n await server?.close();\n serverClosed = true;\n } catch (error) {\n lifecycleErrors.push(error);\n }\n if (serverClosed && releaseReadyLease) {\n try {\n await releaseReadyLease();\n } catch (error) {\n lifecycleErrors.push(error);\n }\n }\n if (lifecycleErrors.length > 0) {\n throw combineLifecycleErrors(lifecycleErrors, \"Crabline server shutdown failed.\");\n }\n });\n const shutdown = installShutdownHandler(close);\n let actionFailed = false;\n let actionError: unknown;\n try {\n if (commandOptions.readyFile) {\n releaseReadyLease = await acquireReadyLease(commandOptions.readyFile);\n }\n if (shutdown.requested()) {\n finishStartup();\n finishPublication();\n await shutdown.wait();\n } else {\n try {\n server = await startServer(\n factory(\n {\n host: commandOptions.host,\n port,\n recorderPath: commandOptions.recorder,\n },\n commandOptions,\n ),\n );\n } finally {\n finishStartup();\n }\n if (shutdown.requested()) {\n finishPublication();\n await shutdown.wait();\n } else {\n let outputWritten = true;\n try {\n const formatted = formatJsonResult(server.manifest);\n if (!formatted.ok) {\n throw new Error(\"Unable to serialize server manifest.\");\n }\n const payload = formatted.output;\n if (commandOptions.readyFile) {\n const readyContents = `${payload}\\n`;\n publishedReady = {\n contents: readyContents,\n identity: await publish(commandOptions.readyFile, readyContents),\n };\n }\n if (shutdown.requested()) {\n outputWritten = false;\n finishPublication();\n await shutdown.wait();\n } else {\n outputWritten = await print(\n options.json\n ? payload\n : renderServeText(server.manifest, commandOptions.showSecrets === true),\n );\n if (!outputWritten) {\n finishPublication();\n await close();\n }\n }\n } finally {\n finishPublication();\n }\n if (outputWritten && (shutdown.requested() || !commandOptions.once)) {\n await shutdown.wait();\n }\n }\n }\n } catch (error) {\n actionFailed = true;\n actionError = error;\n }\n finishStartup();\n finishPublication();\n const cleanupErrors: unknown[] = [];\n try {\n await close();\n } catch (error) {\n if (!actionFailed || error !== actionError) {\n cleanupErrors.push(error);\n }\n }\n shutdown.dispose();\n if (actionFailed || cleanupErrors.length > 0) {\n throw combineLifecycleErrors(\n actionFailed ? [actionError, ...cleanupErrors] : cleanupErrors,\n \"Crabline server lifecycle failed.\",\n );\n }\n });\n\n program\n .command(\"doctor\")\n .description(\"Diagnose common setup problems\")\n .action(async () => {\n const options = program.opts() as GlobalOptions;\n const { manifest } = await loadManifest(options.config);\n const findings = diagnose(manifest);\n const ok = findings.length === 0;\n const payload = { findings, ok };\n setExitCode(ok ? 0 : 10);\n await print(options.json ? formatCliJson(payload) : ok ? \"doctor ok\" : findings.join(\"\\n\"));\n });\n\n return program;\n}\n\ntype ShutdownSignal = \"SIGINT\" | \"SIGTERM\";\n\ntype SignalTarget = {\n on(event: ShutdownSignal, listener: () => void): unknown;\n removeListener(event: ShutdownSignal, listener: () => void): unknown;\n};\n\nfunction onceAsync(action: () => Promise<void>): () => Promise<void> {\n let result: Promise<void> | undefined;\n return () => (result ??= Promise.resolve().then(action));\n}\n\nasync function readReadyFileIdentity(filePath: string): Promise<ReadyFileIdentity> {\n const stats = await fs.stat(filePath, { bigint: true });\n return {\n birthtimeNs: stats.birthtimeNs,\n ctimeNs: stats.ctimeNs,\n dev: stats.dev,\n ino: stats.ino,\n size: stats.size,\n };\n}\n\nfunction sameReadyFileIdentity(left: ReadyFileIdentity, right: ReadyFileIdentity): boolean {\n return (\n left.birthtimeNs === right.birthtimeNs &&\n left.ctimeNs === right.ctimeNs &&\n left.dev === right.dev &&\n left.ino === right.ino &&\n left.size === right.size\n );\n}\n\nfunction sameReadyFileObject(left: ReadyFileIdentity, right: ReadyFileIdentity): boolean {\n return (\n left.birthtimeNs === right.birthtimeNs &&\n left.dev === right.dev &&\n left.ino === right.ino &&\n left.size === right.size\n );\n}\n\nasync function withReadyFileLock<T>(filePath: string, action: () => Promise<T>): Promise<T> {\n const release = await acquireReadyFileLease(filePath);\n let actionFailed = false;\n let actionError: unknown;\n let result: T | undefined;\n try {\n result = await action();\n } catch (error) {\n actionFailed = true;\n actionError = error;\n }\n try {\n await release();\n } catch (releaseError) {\n if (actionFailed) {\n throw combineLifecycleErrors(\n [actionError, releaseError],\n `Ready-file action and lock release both failed for \"${filePath}\".`,\n );\n }\n throw releaseError;\n }\n if (actionFailed) {\n throw actionError;\n }\n return result as T;\n}\n\nasync function acquireReadyFileLease(filePath: string): Promise<() => Promise<void>> {\n await fs.mkdir(nodePath.dirname(filePath), { recursive: true });\n return await lock(filePath, {\n realpath: false,\n retries: {\n factor: 1,\n maxTimeout: 10,\n minTimeout: 10,\n retries: 100,\n },\n stale: READY_FILE_LEASE_STALE_MS,\n update: READY_FILE_LEASE_UPDATE_MS,\n });\n}\n\nexport async function publishReadyFile(\n filePath: string,\n contents: string,\n): Promise<ReadyFileIdentity> {\n let publishedIdentity: ReadyFileIdentity | undefined;\n try {\n return await withReadyFileLock(filePath, async () => {\n publishedIdentity = await publishReadyFileUnlocked(filePath, contents);\n return publishedIdentity;\n });\n } catch (error) {\n if (publishedIdentity) {\n try {\n await removeReadyFileIfOwned(filePath, contents, publishedIdentity);\n } catch (cleanupError) {\n const aggregateError = new AggregateError(\n [error, cleanupError],\n `Ready-file publication and compensation both failed for \"${filePath}\".`,\n );\n aggregateError.cause = error;\n throw aggregateError;\n }\n }\n throw error;\n }\n}\n\nasync function publishReadyFileUnlocked(\n filePath: string,\n contents: string,\n): Promise<ReadyFileIdentity> {\n const suffix = `${process.pid}.${randomUUID()}.tmp`;\n const temporaryPath = nodePath.join(\n nodePath.dirname(filePath),\n `.${nodePath.basename(filePath)}.${suffix}`,\n );\n const backupPath = `${temporaryPath}.backup`;\n let manifestPublished = false;\n let destinationBackedUp = false;\n try {\n await fs.writeFile(temporaryPath, contents, {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n });\n destinationBackedUp = await backupReadyFile(filePath, backupPath);\n await fs.rename(temporaryPath, filePath);\n manifestPublished = true;\n const identity = await readReadyFileIdentity(filePath);\n if (destinationBackedUp) {\n await fs.rm(backupPath);\n destinationBackedUp = false;\n }\n return identity;\n } catch (error) {\n const recoveryErrors: unknown[] = [];\n if (manifestPublished && !destinationBackedUp) {\n await fs.rm(filePath, { force: true }).catch((cleanupError: unknown) => {\n recoveryErrors.push(cleanupError);\n });\n }\n if (destinationBackedUp) {\n await fs.rename(backupPath, filePath).catch((restoreError: unknown) => {\n recoveryErrors.push(restoreError);\n });\n }\n if (recoveryErrors.length > 0) {\n const aggregateError = new AggregateError(\n [error, ...recoveryErrors],\n `Ready-file replacement and recovery both failed for \"${filePath}\".`,\n );\n aggregateError.cause = error;\n throw aggregateError;\n }\n throw error;\n } finally {\n await fs.rm(temporaryPath, { force: true }).catch(() => undefined);\n }\n}\n\nasync function backupReadyFile(filePath: string, backupPath: string): Promise<boolean> {\n try {\n await fs.copyFile(filePath, backupPath, fsConstants.COPYFILE_EXCL);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nasync function removeReadyFileIfOwned(\n filePath: string,\n expectedContents: string,\n expectedIdentity: ReadyFileIdentity,\n): Promise<void> {\n const tombstonePath = nodePath.join(\n nodePath.dirname(filePath),\n `.${nodePath.basename(filePath)}.${process.pid}.${randomUUID()}.remove`,\n );\n try {\n if (\n (await fs.readFile(filePath, \"utf8\")) !== expectedContents ||\n !sameReadyFileIdentity(await readReadyFileIdentity(filePath), expectedIdentity)\n ) {\n return;\n }\n await fs.rename(filePath, tombstonePath);\n if (\n (await fs.readFile(tombstonePath, \"utf8\")) === expectedContents &&\n sameReadyFileObject(await readReadyFileIdentity(tombstonePath), expectedIdentity)\n ) {\n await fs.rm(tombstonePath);\n return;\n }\n try {\n await fs.link(tombstonePath, filePath);\n await fs.rm(tombstonePath);\n } catch (restoreError) {\n throw new Error(\n `Ready-file path changed while removing \"${filePath}\"; the moved file remains at \"${tombstonePath}\".`,\n { cause: restoreError },\n );\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n}\n\nexport async function removeReadyFile(\n filePath: string,\n expectedContents: string,\n expectedIdentity: ReadyFileIdentity,\n): Promise<void> {\n await withReadyFileLock(filePath, async () => {\n await removeReadyFileIfOwned(filePath, expectedContents, expectedIdentity);\n });\n}\n\nexport function waitForShutdown(\n close: () => Promise<void>,\n signalTarget: SignalTarget = process,\n): Promise<void> {\n return installShutdownHandler(close, signalTarget).wait();\n}\n\nfunction installShutdownHandler(\n close: () => Promise<void>,\n signalTarget: SignalTarget = process,\n): {\n dispose(): void;\n requested(): boolean;\n wait(): Promise<void>;\n} {\n let shutdownPromise: Promise<void> | undefined;\n let resolveWait: (() => void) | undefined;\n let rejectWait: ((error: unknown) => void) | undefined;\n const wait = new Promise<void>((resolve, reject) => {\n resolveWait = resolve;\n rejectWait = reject;\n });\n void wait.catch(() => undefined);\n const removeListeners = () => {\n signalTarget.removeListener(\"SIGINT\", shutdown);\n signalTarget.removeListener(\"SIGTERM\", shutdown);\n };\n const shutdown = () => {\n if (shutdownPromise) {\n return;\n }\n shutdownPromise = Promise.resolve().then(close);\n void shutdownPromise.then(\n () => {\n removeListeners();\n resolveWait?.();\n },\n (error: unknown) => {\n removeListeners();\n rejectWait?.(error);\n },\n );\n };\n signalTarget.on(\"SIGINT\", shutdown);\n signalTarget.on(\"SIGTERM\", shutdown);\n return {\n dispose: removeListeners,\n requested: () => shutdownPromise !== undefined,\n wait: () => wait,\n };\n}\n\nfunction combineLifecycleErrors(errors: unknown[], message: string): unknown {\n if (errors.length === 1) {\n return errors[0];\n }\n const aggregateError = new AggregateError(errors, message);\n aggregateError.cause = errors[0];\n return aggregateError;\n}\n\nfunction renderServeText(manifest: CrablineServerManifest, showSecrets: boolean) {\n const lines = [\n `${manifest.provider} local server ready`,\n ` apiRoot: ${manifest.provider === \"matrix\" ? manifest.endpoints.clientApiRoot : manifest.endpoints.apiRoot}`,\n ` inbound: ${manifest.endpoints.adminInboundUrl}`,\n ` recorder: ${manifest.recorderPath}`,\n ];\n const providerFields = renderServeProviderFields(manifest, showSecrets);\n if (!providerFields) {\n throw new CrablineError(`Unsupported server manifest provider: ${String(manifest.provider)}`, {\n kind: \"config\",\n });\n }\n lines.splice(2, 0, ...providerFields);\n return lines.join(\"\\n\");\n}\n\nfunction renderServeProviderFields(\n manifest: CrablineServerManifest,\n showSecrets: boolean,\n): string[] | undefined {\n const secret = (value: string) => (showSecrets ? value : \"<redacted>\");\n if (manifest.provider === \"mattermost\") {\n return [\n ` adminToken: ${secret(manifest.adminToken)}`,\n ` botToken: ${secret(manifest.botToken)}`,\n ` websocket: ${manifest.endpoints.websocketUrl}`,\n ];\n }\n if (manifest.provider === \"matrix\") {\n return [\n ` adminToken: ${secret(manifest.adminToken)}`,\n ` accessToken: ${secret(manifest.accessToken)}`,\n ` botUserId: ${manifest.botUserId}`,\n ` sync: ${manifest.endpoints.syncUrl}`,\n ];\n }\n if (manifest.provider === \"signal\") {\n return [` adminToken: ${secret(manifest.adminToken)}`, ` account: ${manifest.account}`];\n }\n if (manifest.provider === \"slack\") {\n return [\n ` adminToken: ${secret(manifest.adminToken)}`,\n ` botToken: ${secret(manifest.botToken)}`,\n ` signingSecret: ${secret(manifest.signingSecret)}`,\n ];\n }\n if (manifest.provider === \"telegram\") {\n return [\n ` adminToken: ${secret(manifest.adminToken)}`,\n ` botToken: ${secret(manifest.botToken)}`,\n ];\n }\n if (manifest.provider === \"whatsapp\") {\n const baileysWebSocketUrl = showSecrets\n ? manifest.endpoints.baileysWebSocketUrl\n : `${manifest.endpoints.baileysWebSocketUrl.split(\"?\")[0]}?access_token=<redacted>`;\n return [\n ` adminToken: ${secret(manifest.adminToken)}`,\n ` accessToken: ${secret(manifest.accessToken)}`,\n ` baileysWebSocket: ${baileysWebSocketUrl}`,\n ` messages: ${manifest.endpoints.messagesUrl}`,\n ` phoneNumber: ${manifest.endpoints.phoneNumberUrl}`,\n ` status: ${manifest.endpoints.statusUrl}`,\n ` selfJid: ${manifest.selfJid}`,\n ];\n }\n if (manifest.provider === \"zalo\") {\n return [\n ` adminToken: ${secret(manifest.adminToken)}`,\n ` botToken: ${secret(manifest.botToken)}`,\n ` botId: ${manifest.botId}`,\n ];\n }\n return undefined;\n}\n\nfunction renderProvidersText(payload: {\n configured: Array<{\n adapter: string;\n capabilities: string[];\n id: string;\n platform: string;\n status: string;\n }>;\n support: ReadonlyArray<{\n notes: string;\n platform: string;\n status: string;\n supports: readonly string[];\n }>;\n}): string {\n const lines = [\"configured providers:\"];\n if (payload.configured.length === 0) {\n lines.push(\" none\");\n } else {\n for (const provider of payload.configured) {\n lines.push(\n ` ${provider.id} platform=${provider.platform} adapter=${provider.adapter} status=${provider.status} supports=${provider.capabilities.join(\",\")}`,\n );\n }\n }\n\n lines.push(\"support catalog:\");\n for (const entry of payload.support) {\n lines.push(\n ` ${entry.platform} status=${entry.status} supports=${entry.supports.join(\",\")} ${entry.notes}`,\n );\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction diagnose(manifest: Awaited<ReturnType<typeof loadManifest>>[\"manifest\"]): string[] {\n const findings: string[] = [];\n const seen = new Set<string>();\n\n for (const fixture of manifest.fixtures) {\n if (seen.has(fixture.id)) {\n findings.push(`duplicate fixture id: ${fixture.id}`);\n }\n seen.add(fixture.id);\n\n if (!manifest.providers[fixture.provider]) {\n findings.push(`fixture ${fixture.id} references unknown provider ${fixture.provider}`);\n }\n\n for (const envName of fixture.env) {\n if (!process.env[envName]) {\n findings.push(`fixture ${fixture.id} missing env ${envName}`);\n }\n }\n }\n\n for (const [providerId, provider] of Object.entries(manifest.providers)) {\n for (const envName of provider.env) {\n if (!process.env[envName]) {\n findings.push(`provider ${providerId} missing env ${envName}`);\n }\n }\n\n if (provider.adapter === \"script\" && provider.status === \"active\") {\n const commands = provider.script?.commands;\n if (provider.capabilities.includes(\"probe\") && !commands?.probe) {\n findings.push(`provider ${providerId} missing script.commands.probe`);\n }\n if (\n provider.capabilities.some((capability) =>\n [\"agent\", \"roundtrip\", \"send\"].includes(capability),\n ) &&\n !commands?.send\n ) {\n findings.push(`provider ${providerId} missing script.commands.send`);\n }\n if (\n provider.capabilities.some((capability) => [\"agent\", \"roundtrip\"].includes(capability)) &&\n !commands?.waitForInbound\n ) {\n findings.push(`provider ${providerId} missing script.commands.waitForInbound`);\n }\n }\n }\n\n return findings;\n}\n\nexport async function runCli(argv: string[], options: RunCliOptions = {}): Promise<number> {\n let exitCode = 0;\n const program = createProgram((code) => {\n exitCode = code;\n }, options.dependencies);\n const parserErrors: string[] = [];\n const parserOutput: string[] = [];\n const bufferParserErrors = (command: Command): void => {\n command.configureOutput({\n writeErr: (message) => parserErrors.push(message),\n writeOut: (message) => parserOutput.push(message),\n });\n for (const child of command.commands) {\n bufferParserErrors(child);\n }\n };\n bufferParserErrors(program);\n try {\n await program.parseAsync(argv);\n await writeOutput(process.stdout, parserOutput.join(\"\"));\n return exitCode;\n } catch (error) {\n const errorExitCode =\n error instanceof CommanderError\n ? error.code === \"commander.help\" && error.exitCode !== 0\n ? 1\n : error.exitCode\n : error instanceof CrablineError\n ? error.exitCode\n : 1;\n if (error instanceof CommanderError && errorExitCode === 0) {\n await writeOutput(process.stdout, parserOutput.join(\"\"));\n return 0;\n }\n const json = program.opts().json === true;\n if (json) {\n await writeOutput(\n process.stderr,\n `${formatJson({\n error: {\n ...(error instanceof CommanderError ? { code: error.code } : {}),\n exitCode: errorExitCode,\n ...(error instanceof CrablineError && error.kind ? { kind: error.kind } : {}),\n message:\n error instanceof CommanderError && error.code === \"commander.help\"\n ? \"No command specified.\"\n : ensureErrorMessage(error),\n },\n ok: false,\n })}\\n`,\n );\n } else if (error instanceof CommanderError) {\n await writeOutput(process.stderr, parserErrors.join(\"\"));\n } else {\n await writeOutput(process.stderr, `${ensureErrorMessage(error)}\\n`);\n }\n if (options.forceExit && containsWatchShutdownDeadline(error)) {\n options.forceExit(errorExitCode);\n }\n return errorExitCode;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"program.js","sourceRoot":"","sources":["../../../src/cli/program.ts"],"names":[],"mappings":"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","sourcesContent":["import { Command, CommanderError, Option } from \"commander\";\nimport { randomUUID } from \"node:crypto\";\nimport { constants as fsConstants, createReadStream } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport nodePath from \"node:path\";\nimport { finished } from \"node:stream/promises\";\nimport { lock } from \"proper-lockfile\";\nimport { loadManifest } from \"../config/load.js\";\nimport { EXIT_CODES } from \"../core/exit-codes.js\";\nimport { createRegistry } from \"../providers/registry.js\";\nimport {\n formatJson,\n formatJsonResult,\n formatRunResultText,\n sanitizeTerminalText,\n} from \"../core/reporters.js\";\nimport {\n assertScriptStdinPayloadSize,\n computeExitCode,\n runFixtureCommand,\n runSuite,\n} from \"../core/run.js\";\nimport { CrablineError, ensureErrorMessage } from \"../core/errors.js\";\nimport {\n isCrablineServerChannel,\n startCrablineServer,\n type CrablineServerChannel,\n type CrablineServerManifest,\n type StartCrablineServerParams,\n type StartedCrablineServer,\n} from \"../servers/index.js\";\n\ntype GlobalOptions = {\n config?: string;\n json?: boolean;\n};\n\ntype SetExitCode = (code: number) => void;\n\nexport type ReadyFileIdentity = {\n birthtimeNs: bigint;\n ctimeNs: bigint;\n dev: bigint;\n ino: bigint;\n size: bigint;\n};\n\ntype ProgramDependencies = {\n acquireReadyFileLease?: (filePath: string) => Promise<() => Promise<void>>;\n createRegistry?: typeof createRegistry;\n publishReadyFile?: (filePath: string, contents: string) => Promise<ReadyFileIdentity>;\n removeReadyFile?: (\n filePath: string,\n expectedContents: string,\n expectedIdentity: ReadyFileIdentity,\n ) => Promise<void>;\n startServer?: (params: StartCrablineServerParams) => Promise<StartedCrablineServer>;\n};\n\ntype RunCliOptions = {\n dependencies?: ProgramDependencies;\n forceExit?: (code: number) => never;\n};\n\ntype ServeSharedOptions = {\n host: string;\n port: number;\n recorderPath?: string | undefined;\n};\n\ntype ServeCommandOptions = {\n account?: string | undefined;\n accessToken?: string | undefined;\n adminToken?: string | undefined;\n botToken?: string | undefined;\n botUsername?: string | undefined;\n credentialsFd?: string | undefined;\n host: string;\n once?: boolean | undefined;\n port: string;\n readyFile?: string | undefined;\n recorder?: string | undefined;\n selfJid?: string | undefined;\n showSecrets?: boolean | undefined;\n signingSecret?: string | undefined;\n};\n\ntype ServeParamFactory = (\n shared: ServeSharedOptions,\n commandOptions: ServeCommandOptions,\n) => StartCrablineServerParams;\n\nconst READY_FILE_LEASE_STALE_MS = 60_000;\nconst READY_FILE_LEASE_UPDATE_MS = 1_000;\nconst MAX_SERVE_CREDENTIALS_BYTES = 64 * 1024;\nconst WATCH_SHUTDOWN_GRACE_MS = 250;\nconst WATCH_SHUTDOWN_REACHED = Symbol(\"watch shutdown reached\");\n\nconst SERVE_CREDENTIAL_ENV = [\n [\"accessToken\", \"CRABLINE_ACCESS_TOKEN\"],\n [\"adminToken\", \"CRABLINE_ADMIN_TOKEN\"],\n [\"botToken\", \"CRABLINE_BOT_TOKEN\"],\n [\"signingSecret\", \"CRABLINE_SIGNING_SECRET\"],\n] as const;\n\ntype ServeCredentialName = (typeof SERVE_CREDENTIAL_ENV)[number][0];\ntype ServeCredentials = Partial<Record<ServeCredentialName, string>>;\n\nconst SERVE_PARAM_FACTORIES = {\n discord: (shared, commandOptions) => ({\n ...shared,\n adminToken: commandOptions.adminToken,\n botToken: commandOptions.botToken,\n botUsername: commandOptions.botUsername,\n channel: \"discord\",\n }),\n mattermost: (shared, commandOptions) => ({\n ...shared,\n adminToken: commandOptions.adminToken,\n botToken: commandOptions.botToken,\n botUsername: commandOptions.botUsername,\n channel: \"mattermost\",\n }),\n matrix: (shared, commandOptions) => ({\n ...shared,\n accessToken: commandOptions.accessToken,\n adminToken: commandOptions.adminToken,\n channel: \"matrix\",\n }),\n signal: (shared, commandOptions) => ({\n ...shared,\n account: commandOptions.account,\n adminToken: commandOptions.adminToken,\n channel: \"signal\",\n }),\n slack: (shared, commandOptions) => ({\n ...shared,\n adminToken: commandOptions.adminToken,\n botToken: commandOptions.botToken,\n channel: \"slack\",\n signingSecret: commandOptions.signingSecret,\n }),\n telegram: (shared, commandOptions) => ({\n ...shared,\n adminToken: commandOptions.adminToken,\n botToken: commandOptions.botToken,\n botUsername: commandOptions.botUsername,\n channel: \"telegram\",\n }),\n whatsapp: (shared, commandOptions) => ({\n ...shared,\n accessToken: commandOptions.accessToken,\n adminToken: commandOptions.adminToken,\n channel: \"whatsapp\",\n selfJid: commandOptions.selfJid,\n }),\n zalo: (shared, commandOptions) => ({\n ...shared,\n adminToken: commandOptions.adminToken,\n botToken: commandOptions.botToken,\n botName: commandOptions.botUsername,\n channel: \"zalo\",\n }),\n} satisfies Record<CrablineServerChannel, ServeParamFactory>;\n\nfunction isClosedPipeError(error: unknown): boolean {\n const code = (error as NodeJS.ErrnoException).code;\n return code === \"EPIPE\" || code === \"ERR_STREAM_DESTROYED\";\n}\n\nasync function writeOutput(stream: NodeJS.WriteStream, value: string): Promise<boolean> {\n try {\n await new Promise<void>((resolve, reject) => {\n let drained = false;\n let written = false;\n const cleanup = () => {\n stream.off(\"drain\", onDrain);\n stream.off(\"error\", onError);\n };\n const finish = () => {\n if (drained && written) {\n cleanup();\n resolve();\n }\n };\n const onDrain = () => {\n drained = true;\n finish();\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n stream.once(\"error\", onError);\n let hasCapacity: boolean;\n try {\n hasCapacity = stream.write(value, (error) => {\n if (error) {\n stream.once(\"error\", () => undefined);\n onError(error);\n return;\n }\n written = true;\n finish();\n });\n } catch (error) {\n cleanup();\n reject(error);\n return;\n }\n if (hasCapacity) {\n drained = true;\n finish();\n } else {\n stream.once(\"drain\", onDrain);\n }\n });\n return true;\n } catch (error) {\n if (isClosedPipeError(error)) {\n return false;\n }\n throw error;\n }\n}\n\nasync function print(value: string): Promise<boolean> {\n return await writeOutput(process.stdout, `${value}\\n`);\n}\n\nclass WatchShutdownDeadlineError extends CrablineError {}\n\nfunction createWatchShutdownDeadline(): {\n race<T>(operation: PromiseLike<T>, operationName: string): Promise<T>;\n start(): void;\n} {\n let deadlineAt: number | undefined;\n const controller = new AbortController();\n return {\n async race<T>(operation: PromiseLike<T>, operationName: string): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n let removeStartListener: (() => void) | undefined;\n const deadline = new Promise<never>((_, reject) => {\n const arm = () => {\n timer = setTimeout(\n () => {\n reject(\n new WatchShutdownDeadlineError(\n `Provider ${operationName} did not settle within ${WATCH_SHUTDOWN_GRACE_MS}ms during watch shutdown.`,\n { kind: \"timeout\" },\n ),\n );\n },\n Math.max(0, deadlineAt! - Date.now()),\n );\n };\n if (controller.signal.aborted) {\n arm();\n return;\n }\n controller.signal.addEventListener(\"abort\", arm, { once: true });\n removeStartListener = () => controller.signal.removeEventListener(\"abort\", arm);\n });\n try {\n return await Promise.race([Promise.resolve(operation), deadline]);\n } finally {\n removeStartListener?.();\n if (timer) {\n clearTimeout(timer);\n }\n }\n },\n start() {\n if (deadlineAt !== undefined) {\n return;\n }\n deadlineAt = Date.now() + WATCH_SHUTDOWN_GRACE_MS;\n controller.abort();\n },\n };\n}\n\nfunction containsWatchShutdownDeadline(error: unknown, seen = new Set<object>()): boolean {\n if (error instanceof WatchShutdownDeadlineError) {\n return true;\n }\n if (!error || typeof error !== \"object\" || seen.has(error)) {\n return false;\n }\n seen.add(error);\n if (error instanceof AggregateError) {\n return error.errors.some((entry) => containsWatchShutdownDeadline(entry, seen));\n }\n return \"cause\" in error && containsWatchShutdownDeadline(error.cause, seen);\n}\n\nasync function withManifest<T>(\n options: GlobalOptions,\n action: (context: Awaited<ReturnType<typeof loadManifest>>) => Promise<T>,\n): Promise<T> {\n return action(await loadManifest(options.config));\n}\n\nfunction rejectedSecretOption(flags: string, optionName: string, envName: string): Option {\n return new Option(flags).hideHelp().argParser(() => {\n throw new CrablineError(\n `${optionName} no longer accepts credential values in command-line arguments. Use ${envName} or --credentials-fd.`,\n { kind: \"config\" },\n );\n });\n}\n\nfunction parseCredentialsFd(value: string): number {\n if (!/^[0-9]+$/u.test(value)) {\n throw new CrablineError(\n \"Serve credentials file descriptor must be 0 or an integer greater than 2.\",\n { kind: \"config\" },\n );\n }\n const fd = Number(value);\n if (!Number.isSafeInteger(fd) || fd === 1 || fd === 2 || fd > 2_147_483_647) {\n throw new CrablineError(\n \"Serve credentials file descriptor must be 0 or an integer greater than 2.\",\n { kind: \"config\" },\n );\n }\n return fd;\n}\n\nasync function readBoundedFileDescriptor(fd: number): Promise<string> {\n const stream = createReadStream(\"\", { autoClose: fd !== 0, fd });\n const chunks: Buffer[] = [];\n let totalBytes = 0;\n try {\n for await (const chunk of stream) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n totalBytes += buffer.byteLength;\n if (totalBytes > MAX_SERVE_CREDENTIALS_BYTES) {\n throw new CrablineError(\n `Serve credentials JSON exceeds ${MAX_SERVE_CREDENTIALS_BYTES} bytes.`,\n { kind: \"config\" },\n );\n }\n chunks.push(buffer);\n }\n } catch (error) {\n stream.destroy();\n if (error instanceof CrablineError) {\n throw error;\n }\n throw new CrablineError(`Unable to read serve credentials from file descriptor ${fd}.`, {\n cause: error,\n kind: \"config\",\n });\n } finally {\n if (fd !== 0 && !stream.closed) {\n stream.destroy();\n await finished(stream).catch(() => undefined);\n }\n }\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n\nfunction parseServeCredentialsJson(input: string): ServeCredentials {\n let parsed: unknown;\n try {\n parsed = JSON.parse(input);\n } catch (error) {\n throw new CrablineError(\"Serve credentials input must be valid JSON.\", {\n cause: error,\n kind: \"config\",\n });\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new CrablineError(\"Serve credentials JSON must be an object.\", { kind: \"config\" });\n }\n\n const values: ServeCredentials = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (!SERVE_CREDENTIAL_ENV.some(([name]) => name === key)) {\n throw new CrablineError(\"Serve credentials JSON contains unsupported fields.\", {\n kind: \"config\",\n });\n }\n if (typeof value !== \"string\") {\n throw new CrablineError(\"Serve credentials JSON values must be strings.\", {\n kind: \"config\",\n });\n }\n values[key as ServeCredentialName] = value;\n }\n return values;\n}\n\nasync function resolveServeCredentials(credentialsFd?: string): Promise<ServeCredentials> {\n const overrides =\n credentialsFd === undefined\n ? {}\n : parseServeCredentialsJson(\n await readBoundedFileDescriptor(parseCredentialsFd(credentialsFd)),\n );\n return Object.fromEntries(\n SERVE_CREDENTIAL_ENV.flatMap(([name, envName]) => {\n const override = overrides[name];\n const value = override ?? process.env[envName];\n return value === undefined ? [] : [[name, value]];\n }),\n ) as ServeCredentials;\n}\n\nexport function createProgram(\n setExitCode: SetExitCode = (code) => {\n process.exitCode = code;\n },\n dependencies: ProgramDependencies = {},\n): Command {\n const program = new Command();\n const acquireReadyLease = dependencies.acquireReadyFileLease ?? acquireReadyFileLease;\n const registryFactory = dependencies.createRegistry ?? createRegistry;\n const publish = dependencies.publishReadyFile ?? publishReadyFileUnlocked;\n const removeReady = dependencies.removeReadyFile ?? removeReadyFileIfOwned;\n const startServer = dependencies.startServer ?? startCrablineServer;\n const formatCliJson = (value: unknown): string => {\n const formatted = formatJsonResult(value);\n if (!formatted.ok) {\n setExitCode(EXIT_CODES.FAILURE);\n }\n return formatted.output;\n };\n\n program\n .exitOverride()\n .name(\"crabline\")\n .description(\"Deterministic CLI harness for messaging provider E2E tests\")\n .option(\"-c, --config <path>\", \"Config file path\")\n .option(\"--json\", \"Machine-readable output\", false)\n .showHelpAfterError();\n\n program\n .command(\"providers\")\n .description(\"List configured providers and provider catalog coverage\")\n .action(async () => {\n const options = program.opts() as GlobalOptions;\n const { manifest, path } = await loadManifest(options.config);\n const registry = registryFactory(manifest, path);\n const payload = {\n configured: Object.entries(manifest.providers).map(([id, config]) => ({\n adapter: config.adapter,\n capabilities: config.capabilities,\n id,\n platform: config.platform,\n status: config.status,\n })),\n support: registry.catalog,\n };\n await print(options.json ? formatCliJson(payload) : renderProvidersText(payload));\n });\n\n program\n .command(\"fixtures\")\n .description(\"List fixtures\")\n .action(async () => {\n const options = program.opts() as GlobalOptions;\n const { manifest } = await loadManifest(options.config);\n await print(\n options.json\n ? formatCliJson(manifest.fixtures)\n : manifest.fixtures\n .map(\n (fixture) =>\n `${sanitizeTerminalText(fixture.id, true)} ${sanitizeTerminalText(fixture.mode, true)} provider=${sanitizeTerminalText(fixture.provider, true)} target=${sanitizeTerminalText(fixture.target.id, true)}`,\n )\n .join(\"\\n\"),\n );\n });\n\n program\n .command(\"probe <fixtureId>\")\n .description(\"Probe provider readiness using a fixture\")\n .action(async (fixtureId) => {\n const options = program.opts() as GlobalOptions;\n const { manifest, path } = await loadManifest(options.config);\n const fixture = manifest.fixtures.find((entry) => entry.id === fixtureId);\n if (!fixture) {\n throw new CrablineError(`Unknown fixture: ${fixtureId}`, { kind: \"config\" });\n }\n const registry = registryFactory(manifest, path);\n const result = await runFixtureCommand({\n fixtureId: fixture.id,\n manifest,\n manifestPath: path,\n modeOverride: \"probe\",\n registry,\n });\n setExitCode(computeExitCode(result));\n await print(options.json ? formatCliJson(result) : formatRunResultText(result));\n });\n\n for (const mode of [\"send\", \"roundtrip\", \"agent\"] as const) {\n program\n .command(`${mode} <fixtureId>`)\n .description(`${mode} a fixture`)\n .action(async (fixtureId) => {\n const options = program.opts() as GlobalOptions;\n const { manifest, path } = await loadManifest(options.config);\n const registry = registryFactory(manifest, path);\n const result = await runFixtureCommand({\n fixtureId,\n manifest,\n manifestPath: path,\n modeOverride: mode,\n registry,\n });\n setExitCode(computeExitCode(result));\n await print(options.json ? formatCliJson(result) : formatRunResultText(result));\n });\n }\n\n program\n .command(\"run <fixtureIds...>\")\n .description(\"Run one or more fixtures as a suite\")\n .action(async (fixtureIds) => {\n const options = program.opts() as GlobalOptions;\n const { manifest, path } = await loadManifest(options.config);\n const registry = registryFactory(manifest, path);\n const result = await runSuite({\n fixtureIds,\n manifest,\n manifestPath: path,\n registry,\n });\n setExitCode(computeExitCode(result));\n await print(options.json ? formatCliJson(result) : formatRunResultText(result));\n });\n\n program\n .command(\"watch <fixtureId>\")\n .alias(\"webhook\")\n .description(\"Watch inbound messages for one fixture using provider webhook/recorder mode\")\n .action(async (fixtureId) => {\n const options = program.opts() as GlobalOptions;\n await withManifest(options, async ({ manifest, path }) => {\n const fixture = manifest.fixtures.find((entry) => entry.id === fixtureId);\n if (!fixture) {\n throw new CrablineError(`Unknown fixture: ${fixtureId}`, { kind: \"config\" });\n }\n\n const provider = registryFactory(manifest, path).resolve(fixture.provider, fixture.id);\n if (!provider.watch) {\n throw new CrablineError(`Provider \"${fixture.provider}\" does not implement watch.`, {\n kind: \"config\",\n });\n }\n\n const controller = new AbortController();\n const shutdownDeadline = createWatchShutdownDeadline();\n let iterator:\n | AsyncIterator<NonNullable<Awaited<ReturnType<typeof provider.waitForInbound>>>>\n | undefined;\n const stopWatch = onceAsync(async () => {\n shutdownDeadline.start();\n controller.abort();\n const returnResult = iterator?.return?.();\n if (returnResult) {\n await shutdownDeadline.race(returnResult, \"watch iterator return\");\n }\n });\n const shutdown = installShutdownHandler(stopWatch);\n const shutdownSettled = shutdown.wait().then(() => WATCH_SHUTDOWN_REACHED);\n const lifecycleErrors: unknown[] = [];\n try {\n const watchContext = {\n config: manifest.providers[fixture.provider]!,\n fixture,\n manifestPath: path,\n providerId: fixture.provider,\n signal: controller.signal,\n userName: manifest.userName,\n };\n if (watchContext.config.adapter === \"script\") {\n assertScriptStdinPayloadSize({\n fixture,\n provider: {\n config: watchContext.config,\n id: fixture.provider,\n manifestPath: path,\n },\n watch: {\n target: fixture.target,\n },\n });\n }\n const watch = provider.watch(watchContext);\n iterator = watch[Symbol.asyncIterator]();\n while (true) {\n const result = await Promise.race([iterator.next(), shutdownSettled]);\n if (typeof result === \"symbol\") {\n break;\n }\n if (result.done) {\n break;\n }\n const message = result.value;\n const written = await shutdownDeadline.race(\n print(\n options.json\n ? formatCliJson(message)\n : `${sanitizeTerminalText(message.sentAt, true)} ${sanitizeTerminalText(message.author, true)} ${sanitizeTerminalText(message.text, true)}`,\n ),\n \"watch output write\",\n );\n if (!written) {\n break;\n }\n }\n } catch (error) {\n lifecycleErrors.push(error);\n }\n try {\n await stopWatch();\n } catch (error) {\n if (!lifecycleErrors.includes(error)) {\n lifecycleErrors.push(error);\n }\n }\n try {\n const cleanup = provider.cleanup?.();\n if (cleanup) {\n await shutdownDeadline.race(cleanup, \"cleanup\");\n }\n } catch (error) {\n if (!lifecycleErrors.includes(error)) {\n lifecycleErrors.push(error);\n }\n } finally {\n shutdown.dispose();\n }\n if (lifecycleErrors.length > 0) {\n throw combineLifecycleErrors(lifecycleErrors, \"Crabline watch lifecycle failed.\");\n }\n });\n });\n\n program\n .command(\"serve <provider>\")\n .description(\"Start a local provider server that OpenClaw live adapters can target\")\n .option(\"--host <host>\", \"Bind host\", \"127.0.0.1\")\n .option(\"--port <port>\", \"Bind port\", \"0\")\n .option(\"--account <number>\", \"Signal account number\")\n .option(\n \"--bot-username <username>\",\n \"Discord, Mattermost, Telegram, or Zalo bot username\",\n \"crabline_bot\",\n )\n .option(\n \"--credentials-fd <fd>\",\n \"Read JSON credentials from fd 0 or an inherited fd; values override CRABLINE_* env\",\n )\n .option(\"--recorder <path>\", \"JSONL recorder path\")\n .option(\"--ready-file <path>\", \"Write the server runtime manifest to this path\")\n .option(\"--self-jid <jid>\", \"WhatsApp self JID\")\n .option(\"--show-secrets\", \"Print provider credentials in text output\", false)\n .option(\"--once\", \"Start, print the runtime manifest, and stop immediately\", false)\n .addOption(\n rejectedSecretOption(\"--access-token <token>\", \"--access-token\", \"CRABLINE_ACCESS_TOKEN\"),\n )\n .addOption(\n rejectedSecretOption(\"--admin-token <token>\", \"--admin-token\", \"CRABLINE_ADMIN_TOKEN\"),\n )\n .addOption(rejectedSecretOption(\"--bot-token <token>\", \"--bot-token\", \"CRABLINE_BOT_TOKEN\"))\n .addOption(\n rejectedSecretOption(\n \"--signing-secret <secret>\",\n \"--signing-secret\",\n \"CRABLINE_SIGNING_SECRET\",\n ),\n )\n .addHelpText(\n \"after\",\n [\n \"\",\n \"Credential JSON fields: accessToken, adminToken, botToken, signingSecret\",\n \"Environment fallbacks: CRABLINE_ACCESS_TOKEN, CRABLINE_ADMIN_TOKEN,\",\n \" CRABLINE_BOT_TOKEN, CRABLINE_SIGNING_SECRET\",\n ].join(\"\\n\"),\n )\n .action(async (provider, commandOptions: ServeCommandOptions) => {\n const options = program.opts() as GlobalOptions;\n if (!isCrablineServerChannel(provider)) {\n throw new CrablineError(`Unsupported server channel: ${provider}`, {\n kind: \"config\",\n });\n }\n if (!/^[0-9]+$/u.test(commandOptions.port)) {\n throw new CrablineError(`Invalid local server port: ${commandOptions.port}`, {\n kind: \"config\",\n });\n }\n const port = Number(commandOptions.port);\n if (!Number.isInteger(port) || port < 0 || port > 65_535) {\n throw new CrablineError(`Invalid local server port: ${commandOptions.port}`, {\n kind: \"config\",\n });\n }\n const factory = SERVE_PARAM_FACTORIES[provider];\n if (!factory) {\n throw new CrablineError(`Unsupported server channel: ${provider}`, {\n kind: \"config\",\n });\n }\n const credentials = await resolveServeCredentials(commandOptions.credentialsFd);\n commandOptions.accessToken = credentials.accessToken;\n commandOptions.adminToken = credentials.adminToken;\n commandOptions.botToken = credentials.botToken;\n commandOptions.signingSecret = credentials.signingSecret;\n let server: StartedCrablineServer | undefined;\n let startupSettled = false;\n let settleStartup: (() => void) | undefined;\n const startup = new Promise<void>((resolve) => {\n settleStartup = resolve;\n });\n const finishStartup = () => {\n if (!startupSettled) {\n startupSettled = true;\n settleStartup?.();\n }\n };\n let publicationSettled = false;\n let settlePublication: (() => void) | undefined;\n const publication = new Promise<void>((resolve) => {\n settlePublication = resolve;\n });\n const finishPublication = () => {\n if (!publicationSettled) {\n publicationSettled = true;\n settlePublication?.();\n }\n };\n let releaseReadyLease: (() => Promise<void>) | undefined;\n let publishedReady: { contents: string; identity: ReadyFileIdentity } | undefined;\n const close = onceAsync(async () => {\n await startup;\n await publication;\n const lifecycleErrors: unknown[] = [];\n if (commandOptions.readyFile && publishedReady) {\n try {\n await removeReady(\n commandOptions.readyFile,\n publishedReady.contents,\n publishedReady.identity,\n );\n } catch (error) {\n lifecycleErrors.push(error);\n }\n }\n let serverClosed = false;\n try {\n await server?.close();\n serverClosed = true;\n } catch (error) {\n lifecycleErrors.push(error);\n }\n if (serverClosed && releaseReadyLease) {\n try {\n await releaseReadyLease();\n } catch (error) {\n lifecycleErrors.push(error);\n }\n }\n if (lifecycleErrors.length > 0) {\n throw combineLifecycleErrors(lifecycleErrors, \"Crabline server shutdown failed.\");\n }\n });\n const shutdown = installShutdownHandler(close);\n let actionFailed = false;\n let actionError: unknown;\n try {\n if (commandOptions.readyFile) {\n releaseReadyLease = await acquireReadyLease(commandOptions.readyFile);\n }\n if (shutdown.requested()) {\n finishStartup();\n finishPublication();\n await shutdown.wait();\n } else {\n try {\n server = await startServer(\n factory(\n {\n host: commandOptions.host,\n port,\n recorderPath: commandOptions.recorder,\n },\n commandOptions,\n ),\n );\n } finally {\n finishStartup();\n }\n if (shutdown.requested()) {\n finishPublication();\n await shutdown.wait();\n } else {\n let outputWritten = true;\n try {\n const formatted = formatJsonResult(server.manifest);\n if (!formatted.ok) {\n throw new Error(\"Unable to serialize server manifest.\");\n }\n const payload = formatted.output;\n if (commandOptions.readyFile) {\n const readyContents = `${payload}\\n`;\n publishedReady = {\n contents: readyContents,\n identity: await publish(commandOptions.readyFile, readyContents),\n };\n }\n if (shutdown.requested()) {\n outputWritten = false;\n finishPublication();\n await shutdown.wait();\n } else {\n outputWritten = await print(\n options.json\n ? payload\n : renderServeText(server.manifest, commandOptions.showSecrets === true),\n );\n if (!outputWritten) {\n finishPublication();\n await close();\n }\n }\n } finally {\n finishPublication();\n }\n if (outputWritten && (shutdown.requested() || !commandOptions.once)) {\n await shutdown.wait();\n }\n }\n }\n } catch (error) {\n actionFailed = true;\n actionError = error;\n }\n finishStartup();\n finishPublication();\n const cleanupErrors: unknown[] = [];\n try {\n await close();\n } catch (error) {\n if (!actionFailed || error !== actionError) {\n cleanupErrors.push(error);\n }\n }\n shutdown.dispose();\n if (actionFailed || cleanupErrors.length > 0) {\n throw combineLifecycleErrors(\n actionFailed ? [actionError, ...cleanupErrors] : cleanupErrors,\n \"Crabline server lifecycle failed.\",\n );\n }\n });\n\n program\n .command(\"doctor\")\n .description(\"Diagnose common setup problems\")\n .action(async () => {\n const options = program.opts() as GlobalOptions;\n const { manifest } = await loadManifest(options.config);\n const findings = diagnose(manifest);\n const ok = findings.length === 0;\n const payload = { findings, ok };\n setExitCode(ok ? 0 : 10);\n await print(options.json ? formatCliJson(payload) : ok ? \"doctor ok\" : findings.join(\"\\n\"));\n });\n\n return program;\n}\n\ntype ShutdownSignal = \"SIGINT\" | \"SIGTERM\";\n\ntype SignalTarget = {\n on(event: ShutdownSignal, listener: () => void): unknown;\n removeListener(event: ShutdownSignal, listener: () => void): unknown;\n};\n\nfunction onceAsync(action: () => Promise<void>): () => Promise<void> {\n let result: Promise<void> | undefined;\n return () => (result ??= Promise.resolve().then(action));\n}\n\nasync function readReadyFileIdentity(filePath: string): Promise<ReadyFileIdentity> {\n const stats = await fs.stat(filePath, { bigint: true });\n return {\n birthtimeNs: stats.birthtimeNs,\n ctimeNs: stats.ctimeNs,\n dev: stats.dev,\n ino: stats.ino,\n size: stats.size,\n };\n}\n\nfunction sameReadyFileIdentity(left: ReadyFileIdentity, right: ReadyFileIdentity): boolean {\n return (\n left.birthtimeNs === right.birthtimeNs &&\n left.ctimeNs === right.ctimeNs &&\n left.dev === right.dev &&\n left.ino === right.ino &&\n left.size === right.size\n );\n}\n\nfunction sameReadyFileObject(left: ReadyFileIdentity, right: ReadyFileIdentity): boolean {\n return (\n left.birthtimeNs === right.birthtimeNs &&\n left.dev === right.dev &&\n left.ino === right.ino &&\n left.size === right.size\n );\n}\n\nasync function withReadyFileLock<T>(filePath: string, action: () => Promise<T>): Promise<T> {\n const release = await acquireReadyFileLease(filePath);\n let actionFailed = false;\n let actionError: unknown;\n let result: T | undefined;\n try {\n result = await action();\n } catch (error) {\n actionFailed = true;\n actionError = error;\n }\n try {\n await release();\n } catch (releaseError) {\n if (actionFailed) {\n throw combineLifecycleErrors(\n [actionError, releaseError],\n `Ready-file action and lock release both failed for \"${filePath}\".`,\n );\n }\n throw releaseError;\n }\n if (actionFailed) {\n throw actionError;\n }\n return result as T;\n}\n\nasync function acquireReadyFileLease(filePath: string): Promise<() => Promise<void>> {\n await fs.mkdir(nodePath.dirname(filePath), { recursive: true });\n return await lock(filePath, {\n realpath: false,\n retries: {\n factor: 1,\n maxTimeout: 10,\n minTimeout: 10,\n retries: 100,\n },\n stale: READY_FILE_LEASE_STALE_MS,\n update: READY_FILE_LEASE_UPDATE_MS,\n });\n}\n\nexport async function publishReadyFile(\n filePath: string,\n contents: string,\n): Promise<ReadyFileIdentity> {\n let publishedIdentity: ReadyFileIdentity | undefined;\n try {\n return await withReadyFileLock(filePath, async () => {\n publishedIdentity = await publishReadyFileUnlocked(filePath, contents);\n return publishedIdentity;\n });\n } catch (error) {\n if (publishedIdentity) {\n try {\n await removeReadyFileIfOwned(filePath, contents, publishedIdentity);\n } catch (cleanupError) {\n const aggregateError = new AggregateError(\n [error, cleanupError],\n `Ready-file publication and compensation both failed for \"${filePath}\".`,\n );\n aggregateError.cause = error;\n throw aggregateError;\n }\n }\n throw error;\n }\n}\n\nasync function publishReadyFileUnlocked(\n filePath: string,\n contents: string,\n): Promise<ReadyFileIdentity> {\n const suffix = `${process.pid}.${randomUUID()}.tmp`;\n const temporaryPath = nodePath.join(\n nodePath.dirname(filePath),\n `.${nodePath.basename(filePath)}.${suffix}`,\n );\n const backupPath = `${temporaryPath}.backup`;\n let manifestPublished = false;\n let destinationBackedUp = false;\n try {\n await fs.writeFile(temporaryPath, contents, {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n });\n destinationBackedUp = await backupReadyFile(filePath, backupPath);\n await fs.rename(temporaryPath, filePath);\n manifestPublished = true;\n const identity = await readReadyFileIdentity(filePath);\n if (destinationBackedUp) {\n await fs.rm(backupPath);\n destinationBackedUp = false;\n }\n return identity;\n } catch (error) {\n const recoveryErrors: unknown[] = [];\n if (manifestPublished && !destinationBackedUp) {\n await fs.rm(filePath, { force: true }).catch((cleanupError: unknown) => {\n recoveryErrors.push(cleanupError);\n });\n }\n if (destinationBackedUp) {\n await fs.rename(backupPath, filePath).catch((restoreError: unknown) => {\n recoveryErrors.push(restoreError);\n });\n }\n if (recoveryErrors.length > 0) {\n const aggregateError = new AggregateError(\n [error, ...recoveryErrors],\n `Ready-file replacement and recovery both failed for \"${filePath}\".`,\n );\n aggregateError.cause = error;\n throw aggregateError;\n }\n throw error;\n } finally {\n await fs.rm(temporaryPath, { force: true }).catch(() => undefined);\n }\n}\n\nasync function backupReadyFile(filePath: string, backupPath: string): Promise<boolean> {\n try {\n await fs.copyFile(filePath, backupPath, fsConstants.COPYFILE_EXCL);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nasync function removeReadyFileIfOwned(\n filePath: string,\n expectedContents: string,\n expectedIdentity: ReadyFileIdentity,\n): Promise<void> {\n const tombstonePath = nodePath.join(\n nodePath.dirname(filePath),\n `.${nodePath.basename(filePath)}.${process.pid}.${randomUUID()}.remove`,\n );\n try {\n if (\n (await fs.readFile(filePath, \"utf8\")) !== expectedContents ||\n !sameReadyFileIdentity(await readReadyFileIdentity(filePath), expectedIdentity)\n ) {\n return;\n }\n await fs.rename(filePath, tombstonePath);\n if (\n (await fs.readFile(tombstonePath, \"utf8\")) === expectedContents &&\n sameReadyFileObject(await readReadyFileIdentity(tombstonePath), expectedIdentity)\n ) {\n await fs.rm(tombstonePath);\n return;\n }\n try {\n await fs.link(tombstonePath, filePath);\n await fs.rm(tombstonePath);\n } catch (restoreError) {\n throw new Error(\n `Ready-file path changed while removing \"${filePath}\"; the moved file remains at \"${tombstonePath}\".`,\n { cause: restoreError },\n );\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n}\n\nexport async function removeReadyFile(\n filePath: string,\n expectedContents: string,\n expectedIdentity: ReadyFileIdentity,\n): Promise<void> {\n await withReadyFileLock(filePath, async () => {\n await removeReadyFileIfOwned(filePath, expectedContents, expectedIdentity);\n });\n}\n\nexport function waitForShutdown(\n close: () => Promise<void>,\n signalTarget: SignalTarget = process,\n): Promise<void> {\n return installShutdownHandler(close, signalTarget).wait();\n}\n\nfunction installShutdownHandler(\n close: () => Promise<void>,\n signalTarget: SignalTarget = process,\n): {\n dispose(): void;\n requested(): boolean;\n wait(): Promise<void>;\n} {\n let shutdownPromise: Promise<void> | undefined;\n let resolveWait: (() => void) | undefined;\n let rejectWait: ((error: unknown) => void) | undefined;\n const wait = new Promise<void>((resolve, reject) => {\n resolveWait = resolve;\n rejectWait = reject;\n });\n void wait.catch(() => undefined);\n const removeListeners = () => {\n signalTarget.removeListener(\"SIGINT\", shutdown);\n signalTarget.removeListener(\"SIGTERM\", shutdown);\n };\n const shutdown = () => {\n if (shutdownPromise) {\n return;\n }\n shutdownPromise = Promise.resolve().then(close);\n void shutdownPromise.then(\n () => {\n removeListeners();\n resolveWait?.();\n },\n (error: unknown) => {\n removeListeners();\n rejectWait?.(error);\n },\n );\n };\n signalTarget.on(\"SIGINT\", shutdown);\n signalTarget.on(\"SIGTERM\", shutdown);\n return {\n dispose: removeListeners,\n requested: () => shutdownPromise !== undefined,\n wait: () => wait,\n };\n}\n\nfunction combineLifecycleErrors(errors: unknown[], message: string): unknown {\n if (errors.length === 1) {\n return errors[0];\n }\n const aggregateError = new AggregateError(errors, message);\n aggregateError.cause = errors[0];\n return aggregateError;\n}\n\nfunction renderServeText(manifest: CrablineServerManifest, showSecrets: boolean) {\n const lines = [\n `${manifest.provider} local server ready`,\n ` apiRoot: ${manifest.provider === \"matrix\" ? manifest.endpoints.clientApiRoot : manifest.endpoints.apiRoot}`,\n ` inbound: ${manifest.endpoints.adminInboundUrl}`,\n ` recorder: ${manifest.recorderPath}`,\n ];\n const providerFields = renderServeProviderFields(manifest, showSecrets);\n if (!providerFields) {\n throw new CrablineError(`Unsupported server manifest provider: ${String(manifest.provider)}`, {\n kind: \"config\",\n });\n }\n lines.splice(2, 0, ...providerFields);\n return lines.join(\"\\n\");\n}\n\nfunction renderServeProviderFields(\n manifest: CrablineServerManifest,\n showSecrets: boolean,\n): string[] | undefined {\n const secret = (value: string) => (showSecrets ? value : \"<redacted>\");\n if (manifest.provider === \"discord\") {\n return [\n ` adminToken: ${secret(manifest.adminToken)}`,\n ` botToken: ${secret(manifest.botToken)}`,\n ` applicationId: ${manifest.applicationId}`,\n ` botUserId: ${manifest.botUserId}`,\n ` gateway: ${manifest.endpoints.gatewayUrl}`,\n ];\n }\n if (manifest.provider === \"mattermost\") {\n return [\n ` adminToken: ${secret(manifest.adminToken)}`,\n ` botToken: ${secret(manifest.botToken)}`,\n ` websocket: ${manifest.endpoints.websocketUrl}`,\n ];\n }\n if (manifest.provider === \"matrix\") {\n return [\n ` adminToken: ${secret(manifest.adminToken)}`,\n ` accessToken: ${secret(manifest.accessToken)}`,\n ` botUserId: ${manifest.botUserId}`,\n ` sync: ${manifest.endpoints.syncUrl}`,\n ];\n }\n if (manifest.provider === \"signal\") {\n return [` adminToken: ${secret(manifest.adminToken)}`, ` account: ${manifest.account}`];\n }\n if (manifest.provider === \"slack\") {\n return [\n ` adminToken: ${secret(manifest.adminToken)}`,\n ` botToken: ${secret(manifest.botToken)}`,\n ` signingSecret: ${secret(manifest.signingSecret)}`,\n ];\n }\n if (manifest.provider === \"telegram\") {\n return [\n ` adminToken: ${secret(manifest.adminToken)}`,\n ` botToken: ${secret(manifest.botToken)}`,\n ];\n }\n if (manifest.provider === \"whatsapp\") {\n const baileysWebSocketUrl = showSecrets\n ? manifest.endpoints.baileysWebSocketUrl\n : `${manifest.endpoints.baileysWebSocketUrl.split(\"?\")[0]}?access_token=<redacted>`;\n return [\n ` adminToken: ${secret(manifest.adminToken)}`,\n ` accessToken: ${secret(manifest.accessToken)}`,\n ` baileysWebSocket: ${baileysWebSocketUrl}`,\n ` messages: ${manifest.endpoints.messagesUrl}`,\n ` phoneNumber: ${manifest.endpoints.phoneNumberUrl}`,\n ` selfJid: ${manifest.selfJid}`,\n ];\n }\n if (manifest.provider === \"zalo\") {\n return [\n ` adminToken: ${secret(manifest.adminToken)}`,\n ` botToken: ${secret(manifest.botToken)}`,\n ` botId: ${manifest.botId}`,\n ];\n }\n return undefined;\n}\n\nfunction renderProvidersText(payload: {\n configured: Array<{\n adapter: string;\n capabilities: string[];\n id: string;\n platform: string;\n status: string;\n }>;\n support: ReadonlyArray<{\n notes: string;\n platform: string;\n status: string;\n supports: readonly string[];\n }>;\n}): string {\n const lines = [\"configured providers:\"];\n if (payload.configured.length === 0) {\n lines.push(\" none\");\n } else {\n for (const provider of payload.configured) {\n lines.push(\n ` ${provider.id} platform=${provider.platform} adapter=${provider.adapter} status=${provider.status} supports=${provider.capabilities.join(\",\")}`,\n );\n }\n }\n\n lines.push(\"support catalog:\");\n for (const entry of payload.support) {\n lines.push(\n ` ${entry.platform} status=${entry.status} supports=${entry.supports.join(\",\")} ${entry.notes}`,\n );\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction diagnose(manifest: Awaited<ReturnType<typeof loadManifest>>[\"manifest\"]): string[] {\n const findings: string[] = [];\n const seen = new Set<string>();\n\n for (const fixture of manifest.fixtures) {\n if (seen.has(fixture.id)) {\n findings.push(`duplicate fixture id: ${fixture.id}`);\n }\n seen.add(fixture.id);\n\n if (!manifest.providers[fixture.provider]) {\n findings.push(`fixture ${fixture.id} references unknown provider ${fixture.provider}`);\n }\n\n for (const envName of fixture.env) {\n if (!process.env[envName]) {\n findings.push(`fixture ${fixture.id} missing env ${envName}`);\n }\n }\n }\n\n for (const [providerId, provider] of Object.entries(manifest.providers)) {\n for (const envName of provider.env) {\n if (!process.env[envName]) {\n findings.push(`provider ${providerId} missing env ${envName}`);\n }\n }\n\n if (provider.adapter === \"script\" && provider.status === \"active\") {\n const commands = provider.script?.commands;\n if (provider.capabilities.includes(\"probe\") && !commands?.probe) {\n findings.push(`provider ${providerId} missing script.commands.probe`);\n }\n if (\n provider.capabilities.some((capability) =>\n [\"agent\", \"roundtrip\", \"send\"].includes(capability),\n ) &&\n !commands?.send\n ) {\n findings.push(`provider ${providerId} missing script.commands.send`);\n }\n if (\n provider.capabilities.some((capability) => [\"agent\", \"roundtrip\"].includes(capability)) &&\n !commands?.waitForInbound\n ) {\n findings.push(`provider ${providerId} missing script.commands.waitForInbound`);\n }\n }\n }\n\n return findings;\n}\n\nexport async function runCli(argv: string[], options: RunCliOptions = {}): Promise<number> {\n let exitCode = 0;\n const program = createProgram((code) => {\n exitCode = code;\n }, options.dependencies);\n const parserErrors: string[] = [];\n const parserOutput: string[] = [];\n const bufferParserErrors = (command: Command): void => {\n command.configureOutput({\n writeErr: (message) => parserErrors.push(message),\n writeOut: (message) => parserOutput.push(message),\n });\n for (const child of command.commands) {\n bufferParserErrors(child);\n }\n };\n bufferParserErrors(program);\n try {\n await program.parseAsync(argv);\n await writeOutput(process.stdout, parserOutput.join(\"\"));\n return exitCode;\n } catch (error) {\n const errorExitCode =\n error instanceof CommanderError\n ? error.code === \"commander.help\" && error.exitCode !== 0\n ? 1\n : error.exitCode\n : error instanceof CrablineError\n ? error.exitCode\n : 1;\n if (error instanceof CommanderError && errorExitCode === 0) {\n await writeOutput(process.stdout, parserOutput.join(\"\"));\n return 0;\n }\n const json = program.opts().json === true;\n if (json) {\n await writeOutput(\n process.stderr,\n `${formatJson({\n error: {\n ...(error instanceof CommanderError ? { code: error.code } : {}),\n exitCode: errorExitCode,\n ...(error instanceof CrablineError && error.kind ? { kind: error.kind } : {}),\n message:\n error instanceof CommanderError && error.code === \"commander.help\"\n ? \"No command specified.\"\n : ensureErrorMessage(error),\n },\n ok: false,\n })}\\n`,\n );\n } else if (error instanceof CommanderError) {\n await writeOutput(process.stderr, parserErrors.join(\"\"));\n } else {\n await writeOutput(process.stderr, `${ensureErrorMessage(error)}\\n`);\n }\n if (options.forceExit && containsWatchShutdownDeadline(error)) {\n options.forceExit(errorExitCode);\n }\n return errorExitCode;\n }\n}\n"]}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
export { resolveTelegramAdapterConfig } from "./providers/builtin/telegram.js";
|
|
2
2
|
export { resolveWhatsAppAdapterConfig } from "./providers/builtin/whatsapp.js";
|
|
3
|
+
export { startDiscordServer } from "./servers/discord.js";
|
|
3
4
|
export { startMattermostServer } from "./servers/mattermost.js";
|
|
4
5
|
export { startMatrixServer } from "./servers/matrix.js";
|
|
5
6
|
export { startSignalServer } from "./servers/signal.js";
|
|
6
|
-
export { startSlackServer
|
|
7
|
-
export { startTelegramServer
|
|
8
|
-
export { startWhatsAppServer
|
|
7
|
+
export { startSlackServer } from "./servers/slack.js";
|
|
8
|
+
export { startTelegramServer } from "./servers/telegram.js";
|
|
9
|
+
export { startWhatsAppServer } from "./servers/whatsapp.js";
|
|
9
10
|
export { startZaloServer } from "./servers/zalo.js";
|
|
10
|
-
export { CRABLINE_SERVER_CHANNELS,
|
|
11
|
-
export { createOpenClawCrablineAgentDelivery, createOpenClawCrablineChannelReportNotes, createOpenClawCrablineProviderBinding
|
|
11
|
+
export { CRABLINE_SERVER_CHANNELS, isCrablineServerChannel, startCrablineServer, } from "./servers/index.js";
|
|
12
|
+
export { createOpenClawCrablineAgentDelivery, createOpenClawCrablineChannelReportNotes, createOpenClawCrablineProviderBinding, createOpenClawCrablineInbound, createOpenClawCrablineOutboundFromRecorderEvent, OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH, OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY, OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH, OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH, OPENCLAW_CRABLINE_DEFAULT_CHANNEL, OPENCLAW_CRABLINE_MANIFEST_PATH, probeOpenClawCrablineProvider, resolveOpenClawCrablineChannel, resolveOpenClawCrablineChannelDriverSelection, runOpenClawCrablineProviderReadiness, startOpenClawCrablineAdapter, } from "./openclaw.js";
|
|
12
13
|
export { BUILTIN_ADAPTERS, FIXTURE_MODES, INBOUND_AUTHORS, INBOUND_NONCE_MODES, INBOUND_STRATEGIES, ManifestSchema, PROVIDER_PLATFORMS, ProviderConfigSchema, } from "./config/schema.js";
|
|
13
14
|
export { OPENCLAW_SUPPORT_CATALOG } from "./providers/catalog.js";
|
|
14
15
|
export { createRegistry } from "./providers/registry.js";
|
|
@@ -16,14 +17,15 @@ export type { CatalogEntry } from "./providers/catalog.js";
|
|
|
16
17
|
export type { Registry } from "./providers/registry.js";
|
|
17
18
|
export type { ServerRequestEvent } from "./servers/http.js";
|
|
18
19
|
export type { ServerEventObserver } from "./servers/recorder.js";
|
|
20
|
+
export type { DiscordServerManifest, StartedDiscordServer, StartDiscordServerParams, } from "./servers/discord.js";
|
|
19
21
|
export type { BuiltinAdapterId, FixtureDefinition, FixtureMode, ManifestDefinition, ProviderConfig, ProviderPlatform, } from "./config/schema.js";
|
|
20
22
|
export type { InboundEnvelope, NormalizedTarget, ProbeResult, ProviderAdapter, ProviderContext, ProviderSupportStatus, SendContext, SendResult, WaitContext, WatchContext, } from "./providers/types.js";
|
|
21
23
|
export type { MattermostServerManifest, StartedMattermostServer, StartMattermostServerParams, } from "./servers/mattermost.js";
|
|
22
24
|
export type { MatrixServerManifest, StartedMatrixServer, StartMatrixServerParams, } from "./servers/matrix.js";
|
|
23
25
|
export type { SignalServerManifest, StartedSignalServer, StartSignalServerParams, } from "./servers/signal.js";
|
|
24
|
-
export type { SlackServerManifest
|
|
25
|
-
export type { StartedTelegramServer
|
|
26
|
-
export type { StartedWhatsAppServer
|
|
26
|
+
export type { SlackServerManifest, StartedSlackServer, StartSlackServerParams, } from "./servers/slack.js";
|
|
27
|
+
export type { StartedTelegramServer, StartTelegramServerParams, TelegramServerManifest, } from "./servers/telegram.js";
|
|
28
|
+
export type { StartedWhatsAppServer, StartWhatsAppServerParams, WhatsAppBaileysMessage, WhatsAppServerManifest, } from "./servers/whatsapp.js";
|
|
27
29
|
export type { StartedZaloServer, StartZaloServerParams, ZaloServerManifest, } from "./servers/zalo.js";
|
|
28
|
-
export type { CrablineServerChannel
|
|
29
|
-
export type { OpenClawCrablineAgentDelivery, OpenClawCrablineChannelDriverSelection,
|
|
30
|
+
export type { CrablineServerChannel, CrablineServerManifest, StartedCrablineServer, StartCrablineServerParams, } from "./servers/index.js";
|
|
31
|
+
export type { OpenClawCrablineAgentDelivery, OpenClawCrablineChannelDriverSelection, OpenClawCrablineProviderReadinessResult, OpenClawCrablineConversation, OpenClawCrablineGatewayBinding, OpenClawCrablineInbound, OpenClawCrablineInboundInput, OpenClawCrablineOutboundMessage, StartedOpenClawCrablineAdapter, StartOpenClawCrablineAdapterParams, } from "./openclaw.js";
|