@openclaw/crabline 0.1.12 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +38 -11
  2. package/dist/src/cli/program.js +17 -2
  3. package/dist/src/cli/program.js.map +1 -1
  4. package/dist/src/index.d.ts +12 -10
  5. package/dist/src/index.js +6 -5
  6. package/dist/src/index.js.map +1 -1
  7. package/dist/src/openclaw/artifact-generation.d.ts +5 -9
  8. package/dist/src/openclaw/artifact-generation.js +41 -69
  9. package/dist/src/openclaw/artifact-generation.js.map +1 -1
  10. package/dist/src/openclaw/bridges/discord.d.ts +1 -0
  11. package/dist/src/openclaw/bridges/discord.js +149 -0
  12. package/dist/src/openclaw/bridges/discord.js.map +1 -0
  13. package/dist/src/openclaw/bridges/matrix.js +1 -1
  14. package/dist/src/openclaw/bridges/matrix.js.map +1 -1
  15. package/dist/src/openclaw/bridges/mattermost.js +1 -1
  16. package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
  17. package/dist/src/openclaw/bridges/signal.js +1 -1
  18. package/dist/src/openclaw/bridges/signal.js.map +1 -1
  19. package/dist/src/openclaw/bridges/slack.js +1 -1
  20. package/dist/src/openclaw/bridges/slack.js.map +1 -1
  21. package/dist/src/openclaw/bridges/telegram.js +1 -1
  22. package/dist/src/openclaw/bridges/telegram.js.map +1 -1
  23. package/dist/src/openclaw/bridges/whatsapp.js +1 -1
  24. package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
  25. package/dist/src/openclaw/bridges/zalo.js +1 -1
  26. package/dist/src/openclaw/bridges/zalo.js.map +1 -1
  27. package/dist/src/openclaw/outbound-contract.js +3 -0
  28. package/dist/src/openclaw/outbound-contract.js.map +1 -1
  29. package/dist/src/openclaw/{smoke-lock.d.ts → provider-readiness-lock.d.ts} +7 -7
  30. package/dist/src/openclaw/{smoke-lock.js → provider-readiness-lock.js} +122 -260
  31. package/dist/src/openclaw/provider-readiness-lock.js.map +1 -0
  32. package/dist/src/openclaw/shared.d.ts +9 -17
  33. package/dist/src/openclaw/shared.js +5 -6
  34. package/dist/src/openclaw/shared.js.map +1 -1
  35. package/dist/src/openclaw.d.ts +3 -5
  36. package/dist/src/openclaw.js +22 -20
  37. package/dist/src/openclaw.js.map +1 -1
  38. package/dist/src/servers/discord.d.ts +40 -0
  39. package/dist/src/servers/discord.js +842 -0
  40. package/dist/src/servers/discord.js.map +1 -0
  41. package/dist/src/servers/index.d.ts +10 -4
  42. package/dist/src/servers/index.js +4 -0
  43. package/dist/src/servers/index.js.map +1 -1
  44. package/dist/src/servers/slack.js +11 -3
  45. package/dist/src/servers/slack.js.map +1 -1
  46. package/dist/src/servers/telegram.js +51 -2
  47. package/dist/src/servers/telegram.js.map +1 -1
  48. package/dist/src/servers/whatsapp.d.ts +0 -1
  49. package/dist/src/servers/whatsapp.js +0 -1
  50. package/dist/src/servers/whatsapp.js.map +1 -1
  51. package/docs/channel-setup.md +66 -21
  52. package/package.json +1 -1
  53. 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. It can run fixture-level local mocks, and it can also serve local
9
- provider APIs that OpenClaw live adapters can target during deterministic QA.
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 live-adapter smoke tests for Mattermost, Matrix,
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. They let OpenClaw run its
26
- normal channel adapter code against a local provider-shaped API. Release lanes
27
- still need the `live` driver and real provider credentials.
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-shaped HTTP APIs for OpenClaw live adapters. This is the
147
- preferred Smoke CI path because OpenClaw still uses its normal channel adapter,
148
- but the provider endpoint is local and deterministic.
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
 
@@ -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"]}
@@ -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, startSlackServer as startSlackFakeServer } from "./servers/slack.js";
7
- export { startTelegramServer, startTelegramServer as startTelegramFakeServer, } from "./servers/telegram.js";
8
- export { startWhatsAppServer, startWhatsAppServer as startWhatsAppFakeServer, } from "./servers/whatsapp.js";
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, CRABLINE_SERVER_CHANNELS as CRABLINE_FAKE_PROVIDER_CHANNELS, isCrablineServerChannel, isCrablineServerChannel as isCrablineFakeProviderChannel, startCrablineServer, startCrablineServer as startCrablineFakeProviderServer, } from "./servers/index.js";
11
- export { createOpenClawCrablineAgentDelivery, createOpenClawCrablineChannelReportNotes, createOpenClawCrablineProviderBinding as createOpenClawCrablineFakeProviderBinding, createOpenClawCrablineProviderBinding, createOpenClawCrablineInbound, createOpenClawCrablineOutboundFromRecorderEvent, OPENCLAW_CRABLINE_ARTIFACT_POINTER_PATH, OPENCLAW_CRABLINE_ARTIFACT_STORE_DIRECTORY, OPENCLAW_CRABLINE_CHANNEL_CAPABILITY_MATRIX_PATH, OPENCLAW_CRABLINE_CHANNEL_SMOKE_PATH, OPENCLAW_CRABLINE_PROVIDER_READINESS_PATH, OPENCLAW_CRABLINE_DEFAULT_CHANNEL, OPENCLAW_CRABLINE_MANIFEST_PATH, probeOpenClawCrablineProvider as probeOpenClawCrablineFakeProvider, probeOpenClawCrablineProvider, resolveOpenClawCrablineChannel, resolveOpenClawCrablineChannelDriverSelection, runOpenClawCrablineProviderReadiness, runOpenClawCrablineChannelDriverSmoke, startOpenClawCrablineAdapter, } from "./openclaw.js";
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 as SlackFakeServerManifest, SlackServerManifest, StartedSlackServer as StartedSlackFakeServer, StartedSlackServer, StartSlackServerParams as StartSlackFakeServerParams, StartSlackServerParams, } from "./servers/slack.js";
25
- export type { StartedTelegramServer as StartedTelegramFakeServer, StartedTelegramServer, StartTelegramServerParams as StartTelegramFakeServerParams, StartTelegramServerParams, TelegramServerManifest as TelegramFakeServerManifest, TelegramServerManifest, } from "./servers/telegram.js";
26
- export type { StartedWhatsAppServer as StartedWhatsAppFakeServer, StartedWhatsAppServer, StartWhatsAppServerParams as StartWhatsAppFakeServerParams, StartWhatsAppServerParams, WhatsAppBaileysMessage, WhatsAppServerManifest as WhatsAppFakeServerManifest, WhatsAppServerManifest, } from "./servers/whatsapp.js";
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 as CrablineFakeProviderChannel, CrablineServerChannel, CrablineServerManifest as CrablineFakeProviderManifest, CrablineServerManifest, StartedCrablineServer as StartedCrablineFakeProviderServer, StartedCrablineServer, StartCrablineServerParams as StartCrablineFakeProviderServerParams, StartCrablineServerParams, } from "./servers/index.js";
29
- export type { OpenClawCrablineAgentDelivery, OpenClawCrablineChannelDriverSelection, OpenClawCrablineChannelDriverSmokeResult, OpenClawCrablineProviderReadinessResult, OpenClawCrablineConversation, OpenClawCrablineGatewayBinding, OpenClawCrablineInbound, OpenClawCrablineInboundInput, OpenClawCrablineOutboundMessage, StartedOpenClawCrablineAdapter, StartOpenClawCrablineAdapterParams, } from "./openclaw.js";
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";