@openclaw/crabline 0.1.11 → 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 (214) hide show
  1. package/README.md +137 -23
  2. package/dist/src/bin/crabline.js +3 -1
  3. package/dist/src/bin/crabline.js.map +1 -1
  4. package/dist/src/cli/program.d.ts +5 -1
  5. package/dist/src/cli/program.js +281 -52
  6. package/dist/src/cli/program.js.map +1 -1
  7. package/dist/src/config/load.js +39 -3
  8. package/dist/src/config/load.js.map +1 -1
  9. package/dist/src/config/schema.d.ts +20 -0
  10. package/dist/src/config/schema.js +163 -35
  11. package/dist/src/config/schema.js.map +1 -1
  12. package/dist/src/core/errors.d.ts +1 -0
  13. package/dist/src/core/errors.js +6 -3
  14. package/dist/src/core/errors.js.map +1 -1
  15. package/dist/src/core/http-path.d.ts +1 -0
  16. package/dist/src/core/http-path.js +14 -0
  17. package/dist/src/core/http-path.js.map +1 -0
  18. package/dist/src/core/matcher.d.ts +3 -1
  19. package/dist/src/core/matcher.js +58 -2
  20. package/dist/src/core/matcher.js.map +1 -1
  21. package/dist/src/core/nonces.d.ts +2 -0
  22. package/dist/src/core/nonces.js +11 -1
  23. package/dist/src/core/nonces.js.map +1 -1
  24. package/dist/src/core/reporters.d.ts +5 -0
  25. package/dist/src/core/reporters.js +26 -2
  26. package/dist/src/core/reporters.js.map +1 -1
  27. package/dist/src/core/run.d.ts +3 -1
  28. package/dist/src/core/run.js +178 -66
  29. package/dist/src/core/run.js.map +1 -1
  30. package/dist/src/index.d.ts +12 -10
  31. package/dist/src/index.js +6 -5
  32. package/dist/src/index.js.map +1 -1
  33. package/dist/src/matrix-ids.d.ts +5 -0
  34. package/dist/src/matrix-ids.js +83 -0
  35. package/dist/src/matrix-ids.js.map +1 -0
  36. package/dist/src/openclaw/artifact-generation.d.ts +7 -6
  37. package/dist/src/openclaw/artifact-generation.js +385 -41
  38. package/dist/src/openclaw/artifact-generation.js.map +1 -1
  39. package/dist/src/openclaw/bridges/discord.d.ts +1 -0
  40. package/dist/src/openclaw/bridges/discord.js +149 -0
  41. package/dist/src/openclaw/bridges/discord.js.map +1 -0
  42. package/dist/src/openclaw/bridges/matrix.js +22 -5
  43. package/dist/src/openclaw/bridges/matrix.js.map +1 -1
  44. package/dist/src/openclaw/bridges/mattermost.js +14 -9
  45. package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
  46. package/dist/src/openclaw/bridges/probe-response.d.ts +1 -0
  47. package/dist/src/openclaw/bridges/probe-response.js +5 -0
  48. package/dist/src/openclaw/bridges/probe-response.js.map +1 -0
  49. package/dist/src/openclaw/bridges/signal.js +16 -7
  50. package/dist/src/openclaw/bridges/signal.js.map +1 -1
  51. package/dist/src/openclaw/bridges/slack.js +117 -24
  52. package/dist/src/openclaw/bridges/slack.js.map +1 -1
  53. package/dist/src/openclaw/bridges/telegram.js +46 -20
  54. package/dist/src/openclaw/bridges/telegram.js.map +1 -1
  55. package/dist/src/openclaw/bridges/whatsapp.js +33 -17
  56. package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
  57. package/dist/src/openclaw/bridges/zalo.js +9 -4
  58. package/dist/src/openclaw/bridges/zalo.js.map +1 -1
  59. package/dist/src/openclaw/outbound-contract.js +3 -0
  60. package/dist/src/openclaw/outbound-contract.js.map +1 -1
  61. package/dist/src/openclaw/private-file.d.ts +38 -3
  62. package/dist/src/openclaw/private-file.js +2008 -87
  63. package/dist/src/openclaw/private-file.js.map +1 -1
  64. package/dist/src/openclaw/{smoke-lock.d.ts → provider-readiness-lock.d.ts} +14 -5
  65. package/dist/src/openclaw/provider-readiness-lock.js +1320 -0
  66. package/dist/src/openclaw/provider-readiness-lock.js.map +1 -0
  67. package/dist/src/openclaw/shared.d.ts +10 -17
  68. package/dist/src/openclaw/shared.js +53 -19
  69. package/dist/src/openclaw/shared.js.map +1 -1
  70. package/dist/src/openclaw.d.ts +3 -5
  71. package/dist/src/openclaw.js +245 -60
  72. package/dist/src/openclaw.js.map +1 -1
  73. package/dist/src/platform/process-owned-lock.d.ts +11 -0
  74. package/dist/src/platform/process-owned-lock.js +1698 -0
  75. package/dist/src/platform/process-owned-lock.js.map +1 -0
  76. package/dist/src/platform/recorder-directory.d.ts +1 -0
  77. package/dist/src/platform/recorder-directory.js +14 -0
  78. package/dist/src/platform/recorder-directory.js.map +1 -0
  79. package/dist/src/platform/windows-acl.d.ts +18 -0
  80. package/dist/src/platform/windows-acl.js +1367 -0
  81. package/dist/src/platform/windows-acl.js.map +1 -0
  82. package/dist/src/platform/windows-lock-root.d.ts +13 -0
  83. package/dist/src/platform/windows-lock-root.js +98 -0
  84. package/dist/src/platform/windows-lock-root.js.map +1 -0
  85. package/dist/src/providers/builtin/discord.d.ts +4 -0
  86. package/dist/src/providers/builtin/discord.js +52 -9
  87. package/dist/src/providers/builtin/discord.js.map +1 -1
  88. package/dist/src/providers/builtin/external-webhook-auth.d.ts +1 -0
  89. package/dist/src/providers/builtin/external-webhook-auth.js +38 -1
  90. package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -1
  91. package/dist/src/providers/builtin/feishu.d.ts +1 -0
  92. package/dist/src/providers/builtin/feishu.js +96 -26
  93. package/dist/src/providers/builtin/feishu.js.map +1 -1
  94. package/dist/src/providers/builtin/googlechat.d.ts +1 -0
  95. package/dist/src/providers/builtin/googlechat.js +95 -26
  96. package/dist/src/providers/builtin/googlechat.js.map +1 -1
  97. package/dist/src/providers/builtin/imessage.js +60 -17
  98. package/dist/src/providers/builtin/imessage.js.map +1 -1
  99. package/dist/src/providers/builtin/loopback.js +88 -35
  100. package/dist/src/providers/builtin/loopback.js.map +1 -1
  101. package/dist/src/providers/builtin/matrix.d.ts +2 -2
  102. package/dist/src/providers/builtin/matrix.js +78 -21
  103. package/dist/src/providers/builtin/matrix.js.map +1 -1
  104. package/dist/src/providers/builtin/mattermost.d.ts +11 -7
  105. package/dist/src/providers/builtin/mattermost.js +138 -24
  106. package/dist/src/providers/builtin/mattermost.js.map +1 -1
  107. package/dist/src/providers/builtin/msteams.d.ts +1 -0
  108. package/dist/src/providers/builtin/msteams.js +118 -38
  109. package/dist/src/providers/builtin/msteams.js.map +1 -1
  110. package/dist/src/providers/builtin/native-local-mock.js +4 -4
  111. package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
  112. package/dist/src/providers/builtin/script.js +1057 -146
  113. package/dist/src/providers/builtin/script.js.map +1 -1
  114. package/dist/src/providers/builtin/slack.d.ts +8 -1
  115. package/dist/src/providers/builtin/slack.js +327 -24
  116. package/dist/src/providers/builtin/slack.js.map +1 -1
  117. package/dist/src/providers/builtin/telegram.d.ts +1 -1
  118. package/dist/src/providers/builtin/telegram.js +55 -14
  119. package/dist/src/providers/builtin/telegram.js.map +1 -1
  120. package/dist/src/providers/builtin/whatsapp.d.ts +4 -3
  121. package/dist/src/providers/builtin/whatsapp.js +157 -29
  122. package/dist/src/providers/builtin/whatsapp.js.map +1 -1
  123. package/dist/src/providers/builtin/zalo.d.ts +5 -2
  124. package/dist/src/providers/builtin/zalo.js +31 -7
  125. package/dist/src/providers/builtin/zalo.js.map +1 -1
  126. package/dist/src/providers/catalog.d.ts +1 -1
  127. package/dist/src/providers/catalog.js +1 -1
  128. package/dist/src/providers/catalog.js.map +1 -1
  129. package/dist/src/providers/local-mock.d.ts +4 -0
  130. package/dist/src/providers/local-mock.js +162 -35
  131. package/dist/src/providers/local-mock.js.map +1 -1
  132. package/dist/src/providers/native-ids.d.ts +2 -0
  133. package/dist/src/providers/native-ids.js +3 -0
  134. package/dist/src/providers/native-ids.js.map +1 -1
  135. package/dist/src/providers/recorder.d.ts +14 -3
  136. package/dist/src/providers/recorder.js +521 -41
  137. package/dist/src/providers/recorder.js.map +1 -1
  138. package/dist/src/providers/registry.d.ts +1 -0
  139. package/dist/src/providers/registry.js +65 -20
  140. package/dist/src/providers/registry.js.map +1 -1
  141. package/dist/src/providers/signed-jwt.d.ts +6 -1
  142. package/dist/src/providers/signed-jwt.js +241 -50
  143. package/dist/src/providers/signed-jwt.js.map +1 -1
  144. package/dist/src/providers/slack-ids.d.ts +1 -0
  145. package/dist/src/providers/slack-ids.js +5 -0
  146. package/dist/src/providers/slack-ids.js.map +1 -1
  147. package/dist/src/providers/target-normalizers.d.ts +9 -1
  148. package/dist/src/providers/target-normalizers.js +177 -58
  149. package/dist/src/providers/target-normalizers.js.map +1 -1
  150. package/dist/src/providers/webhook-server.d.ts +3 -0
  151. package/dist/src/providers/webhook-server.js +268 -47
  152. package/dist/src/providers/webhook-server.js.map +1 -1
  153. package/dist/src/servers/discord.d.ts +40 -0
  154. package/dist/src/servers/discord.js +842 -0
  155. package/dist/src/servers/discord.js.map +1 -0
  156. package/dist/src/servers/http.d.ts +14 -2
  157. package/dist/src/servers/http.js +229 -58
  158. package/dist/src/servers/http.js.map +1 -1
  159. package/dist/src/servers/index.d.ts +10 -4
  160. package/dist/src/servers/index.js +4 -0
  161. package/dist/src/servers/index.js.map +1 -1
  162. package/dist/src/servers/matrix.d.ts +3 -0
  163. package/dist/src/servers/matrix.js +268 -110
  164. package/dist/src/servers/matrix.js.map +1 -1
  165. package/dist/src/servers/mattermost.d.ts +5 -0
  166. package/dist/src/servers/mattermost.js +389 -91
  167. package/dist/src/servers/mattermost.js.map +1 -1
  168. package/dist/src/servers/recorder.d.ts +11 -0
  169. package/dist/src/servers/recorder.js +1072 -69
  170. package/dist/src/servers/recorder.js.map +1 -1
  171. package/dist/src/servers/signal.d.ts +1 -0
  172. package/dist/src/servers/signal.js +279 -44
  173. package/dist/src/servers/signal.js.map +1 -1
  174. package/dist/src/servers/slack.d.ts +15 -0
  175. package/dist/src/servers/slack.js +270 -54
  176. package/dist/src/servers/slack.js.map +1 -1
  177. package/dist/src/servers/telegram-identity.d.ts +6 -0
  178. package/dist/src/servers/telegram-identity.js +27 -0
  179. package/dist/src/servers/telegram-identity.js.map +1 -0
  180. package/dist/src/servers/telegram.d.ts +17 -6
  181. package/dist/src/servers/telegram.js +1218 -107
  182. package/dist/src/servers/telegram.js.map +1 -1
  183. package/dist/src/servers/webhook-target.d.ts +12 -4
  184. package/dist/src/servers/webhook-target.js +226 -28
  185. package/dist/src/servers/webhook-target.js.map +1 -1
  186. package/dist/src/servers/whatsapp-baileys-websocket.d.ts +60 -1
  187. package/dist/src/servers/whatsapp-baileys-websocket.js +782 -112
  188. package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
  189. package/dist/src/servers/whatsapp-jid.d.ts +1 -0
  190. package/dist/src/servers/whatsapp-jid.js +9 -5
  191. package/dist/src/servers/whatsapp-jid.js.map +1 -1
  192. package/dist/src/servers/whatsapp-wire/binary-node.d.ts +1 -0
  193. package/dist/src/servers/whatsapp-wire/binary-node.js +37 -13
  194. package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
  195. package/dist/src/servers/whatsapp-wire/crypto.d.ts +3 -0
  196. package/dist/src/servers/whatsapp-wire/crypto.js +23 -8
  197. package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
  198. package/dist/src/servers/whatsapp-wire/handshake.d.ts +9 -3
  199. package/dist/src/servers/whatsapp-wire/handshake.js +173 -12
  200. package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
  201. package/dist/src/servers/whatsapp-wire/signal.js +3 -3
  202. package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
  203. package/dist/src/servers/whatsapp.d.ts +7 -1
  204. package/dist/src/servers/whatsapp.js +149 -25
  205. package/dist/src/servers/whatsapp.js.map +1 -1
  206. package/dist/src/servers/zalo.d.ts +1 -0
  207. package/dist/src/servers/zalo.js +193 -82
  208. package/dist/src/servers/zalo.js.map +1 -1
  209. package/docs/channel-setup.md +251 -64
  210. package/fixtures/examples/crabline.example.yaml +3 -2
  211. package/package.json +18 -10
  212. package/dist/src/openclaw/smoke-lock.js +0 -1004
  213. package/dist/src/openclaw/smoke-lock.js.map +0 -1
  214. package/fixtures/examples/openclaw-bridge.yaml +0 -125
@@ -1 +1 @@
1
- {"version":3,"file":"program.js","sourceRoot":"","sources":["../../../src/cli/program.ts"],"names":[],"mappings":"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","sourcesContent":["import { Command, CommanderError } from \"commander\";\nimport { randomUUID } from \"node:crypto\";\nimport { constants as fsConstants } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport nodePath from \"node:path\";\nimport { lock } from \"proper-lockfile\";\nimport { loadManifest } from \"../config/load.js\";\nimport { createRegistry } from \"../providers/registry.js\";\nimport { formatJson, formatRunResultText, sanitizeTerminalText } 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 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 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;\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\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\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\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 ? formatJson(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 ? formatJson(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 await print(options.json ? formatJson(result) : formatRunResultText(result));\n setExitCode(computeExitCode(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 await print(options.json ? formatJson(result) : formatRunResultText(result));\n setExitCode(computeExitCode(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 await print(options.json ? formatJson(result) : formatRunResultText(result));\n setExitCode(computeExitCode(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 let iterator:\n | AsyncIterator<NonNullable<Awaited<ReturnType<typeof provider.waitForInbound>>>>\n | undefined;\n const stopWatch = onceAsync(async () => {\n controller.abort();\n await iterator?.return?.();\n });\n const shutdown = installShutdownHandler(stopWatch);\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 iterator.next();\n if (result.done) {\n break;\n }\n const message = result.value;\n const written = await print(\n options.json\n ? formatJson(message)\n : `${sanitizeTerminalText(message.sentAt, true)} ${sanitizeTerminalText(message.author, true)} ${sanitizeTerminalText(message.text, true)}`,\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 await provider.cleanup?.();\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(\n \"--admin-token <token>\",\n \"Admin token for inbound test messages (or CRABLINE_ADMIN_TOKEN)\",\n )\n .option(\"--account <number>\", \"Signal account number\")\n .option(\"--access-token <token>\", \"Matrix or WhatsApp access token (or CRABLINE_ACCESS_TOKEN)\")\n .option(\n \"--bot-token <token>\",\n \"Mattermost, Slack, Telegram, or Zalo bot token (or CRABLINE_BOT_TOKEN)\",\n )\n .option(\n \"--bot-username <username>\",\n \"Mattermost, Telegram, or Zalo bot username\",\n \"crabline_bot\",\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(\"--signing-secret <secret>\", \"Slack signing secret (or CRABLINE_SIGNING_SECRET)\")\n .option(\"--once\", \"Start, print the runtime manifest, and stop immediately\", false)\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 commandOptions.accessToken ??= process.env.CRABLINE_ACCESS_TOKEN;\n commandOptions.adminToken ??= process.env.CRABLINE_ADMIN_TOKEN;\n commandOptions.botToken ??= process.env.CRABLINE_BOT_TOKEN;\n commandOptions.signingSecret ??= process.env.CRABLINE_SIGNING_SECRET;\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 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 const close = onceAsync(async () => {\n await startup;\n await publication;\n await server?.close();\n });\n const shutdown = installShutdownHandler(close);\n let releaseReadyLease: (() => Promise<void>) | undefined;\n let publishedReady: { contents: string; identity: ReadyFileIdentity } | undefined;\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 try {\n const payload = formatJson(server.manifest);\n if (commandOptions.readyFile) {\n const readyContents = `${payload}\\n`;\n publishedReady = {\n contents: readyContents,\n identity: await publish(commandOptions.readyFile, readyContents),\n };\n }\n await print(\n options.json\n ? payload\n : renderServeText(server.manifest, commandOptions.showSecrets === true),\n );\n } finally {\n finishPublication();\n }\n if (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 const readyToRemove = publishedReady;\n for (const cleanup of [\n close,\n ...(commandOptions.readyFile && readyToRemove\n ? [\n () =>\n removeReady(\n commandOptions.readyFile!,\n readyToRemove.contents,\n readyToRemove.identity,\n ),\n ]\n : []),\n ...(releaseReadyLease ? [releaseReadyLease] : []),\n ]) {\n try {\n await cleanup();\n } catch (error) {\n if (!actionFailed || error !== actionError) {\n cleanupErrors.push(error);\n }\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 await print(options.json ? formatJson(payload) : ok ? \"doctor ok\" : findings.join(\"\\n\"));\n setExitCode(ok ? 0 : 10);\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[]): Promise<number> {\n let exitCode = 0;\n const program = createProgram((code) => {\n exitCode = code;\n });\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 return errorExitCode;\n }\n}\n"]}
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../../../src/cli/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,IAAI,WAAW,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,4BAA4B,EAC5B,eAAe,EACf,iBAAiB,EACjB,QAAQ,GACT,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EACL,uBAAuB,EACvB,mBAAmB,GAKpB,MAAM,qBAAqB,CAAC;AA8D7B,MAAM,yBAAyB,GAAG,MAAM,CAAC;AACzC,MAAM,0BAA0B,GAAG,KAAK,CAAC;AACzC,MAAM,2BAA2B,GAAG,EAAE,GAAG,IAAI,CAAC;AAC9C,MAAM,uBAAuB,GAAG,GAAG,CAAC;AACpC,MAAM,sBAAsB,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC;AAEhE,MAAM,oBAAoB,GAAG;IAC3B,CAAC,aAAa,EAAE,uBAAuB,CAAC;IACxC,CAAC,YAAY,EAAE,sBAAsB,CAAC;IACtC,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAClC,CAAC,eAAe,EAAE,yBAAyB,CAAC;CACpC,CAAC;AAKX,MAAM,qBAAqB,GAAG;IAC5B,OAAO,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;QACpC,GAAG,MAAM;QACT,UAAU,EAAE,cAAc,CAAC,UAAU;QACrC,QAAQ,EAAE,cAAc,CAAC,QAAQ;QACjC,WAAW,EAAE,cAAc,CAAC,WAAW;QACvC,OAAO,EAAE,SAAS;KACnB,CAAC;IACF,UAAU,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;QACvC,GAAG,MAAM;QACT,UAAU,EAAE,cAAc,CAAC,UAAU;QACrC,QAAQ,EAAE,cAAc,CAAC,QAAQ;QACjC,WAAW,EAAE,cAAc,CAAC,WAAW;QACvC,OAAO,EAAE,YAAY;KACtB,CAAC;IACF,MAAM,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;QACnC,GAAG,MAAM;QACT,WAAW,EAAE,cAAc,CAAC,WAAW;QACvC,UAAU,EAAE,cAAc,CAAC,UAAU;QACrC,OAAO,EAAE,QAAQ;KAClB,CAAC;IACF,MAAM,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;QACnC,GAAG,MAAM;QACT,OAAO,EAAE,cAAc,CAAC,OAAO;QAC/B,UAAU,EAAE,cAAc,CAAC,UAAU;QACrC,OAAO,EAAE,QAAQ;KAClB,CAAC;IACF,KAAK,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;QAClC,GAAG,MAAM;QACT,UAAU,EAAE,cAAc,CAAC,UAAU;QACrC,QAAQ,EAAE,cAAc,CAAC,QAAQ;QACjC,OAAO,EAAE,OAAO;QAChB,aAAa,EAAE,cAAc,CAAC,aAAa;KAC5C,CAAC;IACF,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;QACrC,GAAG,MAAM;QACT,UAAU,EAAE,cAAc,CAAC,UAAU;QACrC,QAAQ,EAAE,cAAc,CAAC,QAAQ;QACjC,WAAW,EAAE,cAAc,CAAC,WAAW;QACvC,OAAO,EAAE,UAAU;KACpB,CAAC;IACF,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;QACrC,GAAG,MAAM;QACT,WAAW,EAAE,cAAc,CAAC,WAAW;QACvC,UAAU,EAAE,cAAc,CAAC,UAAU;QACrC,OAAO,EAAE,UAAU;QACnB,OAAO,EAAE,cAAc,CAAC,OAAO;KAChC,CAAC;IACF,IAAI,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;QACjC,GAAG,MAAM;QACT,UAAU,EAAE,cAAc,CAAC,UAAU;QACrC,QAAQ,EAAE,cAAc,CAAC,QAAQ;QACjC,OAAO,EAAE,cAAc,CAAC,WAAW;QACnC,OAAO,EAAE,MAAM;KAChB,CAAC;CACwD,CAAC;AAE7D,SAAS,iBAAiB,CAAC,KAAc;IACvC,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;IACnD,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,sBAAsB,CAAC;AAC7D,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAA0B,EAAE,KAAa;IAClE,IAAI,CAAC;QACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC7B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/B,CAAC,CAAC;YACF,MAAM,MAAM,GAAG,GAAG,EAAE;gBAClB,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;oBACvB,OAAO,EAAE,CAAC;oBACV,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC;YACF,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,EAAE,CAAC;YACX,CAAC,CAAC;YACF,MAAM,OAAO,GAAG,CAAC,KAAY,EAAE,EAAE;gBAC/B,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9B,IAAI,WAAoB,CAAC;YACzB,IAAI,CAAC;gBACH,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBAC1C,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;wBACtC,OAAO,CAAC,KAAK,CAAC,CAAC;wBACf,OAAO;oBACT,CAAC;oBACD,OAAO,GAAG,IAAI,CAAC;oBACf,MAAM,EAAE,CAAC;gBACX,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YACD,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,EAAE,CAAC;YACX,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,KAAa;IAChC,OAAO,MAAM,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,0BAA2B,SAAQ,aAAa;CAAG;AAEzD,SAAS,2BAA2B;IAIlC,IAAI,UAA8B,CAAC;IACnC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,OAAO;QACL,KAAK,CAAC,IAAI,CAAI,SAAyB,EAAE,aAAqB;YAC5D,IAAI,KAAgD,CAAC;YACrD,IAAI,mBAA6C,CAAC;YAClD,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAChD,MAAM,GAAG,GAAG,GAAG,EAAE;oBACf,KAAK,GAAG,UAAU,CAChB,GAAG,EAAE;wBACH,MAAM,CACJ,IAAI,0BAA0B,CAC5B,YAAY,aAAa,0BAA0B,uBAAuB,2BAA2B,EACrG,EAAE,IAAI,EAAE,SAAS,EAAE,CACpB,CACF,CAAC;oBACJ,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CACtC,CAAC;gBACJ,CAAC,CAAC;gBACF,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBAC9B,GAAG,EAAE,CAAC;oBACN,OAAO;gBACT,CAAC;gBACD,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACjE,mBAAmB,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAClF,CAAC,CAAC,CAAC;YACH,IAAI,CAAC;gBACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;YACpE,CAAC;oBAAS,CAAC;gBACT,mBAAmB,EAAE,EAAE,CAAC;gBACxB,IAAI,KAAK,EAAE,CAAC;oBACV,YAAY,CAAC,KAAK,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;QACD,KAAK;YACH,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,OAAO;YACT,CAAC;YACD,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,uBAAuB,CAAC;YAClD,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,6BAA6B,CAAC,KAAc,EAAE,IAAI,GAAG,IAAI,GAAG,EAAU;IAC7E,IAAI,KAAK,YAAY,0BAA0B,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3D,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChB,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,6BAA6B,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,OAAO,IAAI,KAAK,IAAI,6BAA6B,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC9E,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,OAAsB,EACtB,MAAyE;IAEzE,OAAO,MAAM,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa,EAAE,UAAkB,EAAE,OAAe;IAC9E,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE;QACjD,MAAM,IAAI,aAAa,CACrB,GAAG,UAAU,uEAAuE,OAAO,uBAAuB,EAClH,EAAE,IAAI,EAAE,QAAQ,EAAE,CACnB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,aAAa,CACrB,2EAA2E,EAC3E,EAAE,IAAI,EAAE,QAAQ,EAAE,CACnB,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,aAAa,EAAE,CAAC;QAC5E,MAAM,IAAI,aAAa,CACrB,2EAA2E,EAC3E,EAAE,IAAI,EAAE,QAAQ,EAAE,CACnB,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,KAAK,UAAU,yBAAyB,CAAC,EAAU;IACjD,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACjE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnE,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC;YAChC,IAAI,UAAU,GAAG,2BAA2B,EAAE,CAAC;gBAC7C,MAAM,IAAI,aAAa,CACrB,kCAAkC,2BAA2B,SAAS,EACtE,EAAE,IAAI,EAAE,QAAQ,EAAE,CACnB,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;YACnC,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,IAAI,aAAa,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACtF,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC/B,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,yBAAyB,CAAC,KAAa;IAC9C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,aAAa,CAAC,6CAA6C,EAAE;YACrE,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,aAAa,CAAC,2CAA2C,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,aAAa,CAAC,qDAAqD,EAAE;gBAC7E,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,aAAa,CAAC,gDAAgD,EAAE;gBACxE,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC;QACD,MAAM,CAAC,GAA0B,CAAC,GAAG,KAAK,CAAC;IAC7C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,aAAsB;IAC3D,MAAM,SAAS,GACb,aAAa,KAAK,SAAS;QACzB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,yBAAyB,CACvB,MAAM,yBAAyB,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC,CACnE,CAAC;IACR,OAAO,MAAM,CAAC,WAAW,CACvB,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE;QAC/C,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/C,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CACiB,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,WAAW,GAAgB,CAAC,IAAI,EAAE,EAAE;IAClC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;AAC1B,CAAC,EACD,YAAY,GAAwB,EAAE;IAEtC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,MAAM,iBAAiB,GAAG,YAAY,CAAC,qBAAqB,IAAI,qBAAqB,CAAC;IACtF,MAAM,eAAe,GAAG,YAAY,CAAC,cAAc,IAAI,cAAc,CAAC;IACtE,MAAM,OAAO,GAAG,YAAY,CAAC,gBAAgB,IAAI,wBAAwB,CAAC;IAC1E,MAAM,WAAW,GAAG,YAAY,CAAC,eAAe,IAAI,sBAAsB,CAAC;IAC3E,MAAM,WAAW,GAAG,YAAY,CAAC,WAAW,IAAI,mBAAmB,CAAC;IACpE,MAAM,aAAa,GAAG,CAAC,KAAc,EAAU,EAAE;QAC/C,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;YAClB,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,SAAS,CAAC,MAAM,CAAC;IAC1B,CAAC,CAAC;IAEF,OAAO;SACJ,YAAY,EAAE;SACd,IAAI,CAAC,UAAU,CAAC;SAChB,WAAW,CAAC,4DAA4D,CAAC;SACzE,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;SACjD,MAAM,CAAC,QAAQ,EAAE,yBAAyB,EAAE,KAAK,CAAC;SAClD,kBAAkB,EAAE,CAAC;IAExB,OAAO;SACJ,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAmB,CAAC;QAChD,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG;YACd,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpE,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,EAAE;gBACF,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,MAAM,EAAE,MAAM,CAAC,MAAM;aACtB,CAAC,CAAC;YACH,OAAO,EAAE,QAAQ,CAAC,OAAO;SAC1B,CAAC;QACF,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,eAAe,CAAC;SAC5B,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAmB,CAAC;QAChD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,KAAK,CACT,OAAO,CAAC,IAAI;YACV,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAClC,CAAC,CAAC,QAAQ,CAAC,QAAQ;iBACd,GAAG,CACF,CAAC,OAAO,EAAE,EAAE,CACV,GAAG,oBAAoB,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,oBAAoB,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,oBAAoB,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAC3M;iBACA,IAAI,CAAC,IAAI,CAAC,CAClB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,0CAA0C,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;QAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAmB,CAAC;QAChD,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QAC1E,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,aAAa,CAAC,oBAAoB,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC;YACrC,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,QAAQ;YACR,YAAY,EAAE,IAAI;YAClB,YAAY,EAAE,OAAO;YACrB,QAAQ;SACT,CAAC,CAAC;QACH,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QACrC,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEL,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAU,EAAE,CAAC;QAC3D,OAAO;aACJ,OAAO,CAAC,GAAG,IAAI,cAAc,CAAC;aAC9B,WAAW,CAAC,GAAG,IAAI,YAAY,CAAC;aAChC,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;YAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAmB,CAAC;YAChD,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC9D,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC;gBACrC,SAAS;gBACT,QAAQ;gBACR,YAAY,EAAE,IAAI;gBAClB,YAAY,EAAE,IAAI;gBAClB,QAAQ;aACT,CAAC,CAAC;YACH,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;YACrC,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;IACP,CAAC;IAED,OAAO;SACJ,OAAO,CAAC,qBAAqB,CAAC;SAC9B,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;QAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAmB,CAAC;QAChD,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;YAC5B,UAAU;YACV,QAAQ;YACR,YAAY,EAAE,IAAI;YAClB,QAAQ;SACT,CAAC,CAAC;QACH,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QACrC,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,KAAK,CAAC,SAAS,CAAC;SAChB,WAAW,CAAC,6EAA6E,CAAC;SAC1F,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;QAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAmB,CAAC;QAChD,MAAM,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE;YACvD,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;YAC1E,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,aAAa,CAAC,oBAAoB,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC/E,CAAC;YAED,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YACvF,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACpB,MAAM,IAAI,aAAa,CAAC,aAAa,OAAO,CAAC,QAAQ,6BAA6B,EAAE;oBAClF,IAAI,EAAE,QAAQ;iBACf,CAAC,CAAC;YACL,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,gBAAgB,GAAG,2BAA2B,EAAE,CAAC;YACvD,IAAI,QAES,CAAC;YACd,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,IAAI,EAAE;gBACrC,gBAAgB,CAAC,KAAK,EAAE,CAAC;gBACzB,UAAU,CAAC,KAAK,EAAE,CAAC;gBACnB,MAAM,YAAY,GAAG,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC;gBAC1C,IAAI,YAAY,EAAE,CAAC;oBACjB,MAAM,gBAAgB,CAAC,IAAI,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAAC;gBACrE,CAAC;YACH,CAAC,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;YACnD,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,CAAC;YAC3E,MAAM,eAAe,GAAc,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG;oBACnB,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAE;oBAC7C,OAAO;oBACP,YAAY,EAAE,IAAI;oBAClB,UAAU,EAAE,OAAO,CAAC,QAAQ;oBAC5B,MAAM,EAAE,UAAU,CAAC,MAAM;oBACzB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;iBAC5B,CAAC;gBACF,IAAI,YAAY,CAAC,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;oBAC7C,4BAA4B,CAAC;wBAC3B,OAAO;wBACP,QAAQ,EAAE;4BACR,MAAM,EAAE,YAAY,CAAC,MAAM;4BAC3B,EAAE,EAAE,OAAO,CAAC,QAAQ;4BACpB,YAAY,EAAE,IAAI;yBACnB;wBACD,KAAK,EAAE;4BACL,MAAM,EAAE,OAAO,CAAC,MAAM;yBACvB;qBACF,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBAC3C,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;gBACzC,OAAO,IAAI,EAAE,CAAC;oBACZ,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;oBACtE,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;wBAC/B,MAAM;oBACR,CAAC;oBACD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;wBAChB,MAAM;oBACR,CAAC;oBACD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;oBAC7B,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,IAAI,CACzC,KAAK,CACH,OAAO,CAAC,IAAI;wBACV,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC;wBACxB,CAAC,CAAC,GAAG,oBAAoB,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,oBAAoB,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,oBAAoB,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAC9I,EACD,oBAAoB,CACrB,CAAC;oBACF,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,SAAS,EAAE,CAAC;YACpB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBACrC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;gBACrC,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBACrC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,CAAC;YACD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,sBAAsB,CAAC,eAAe,EAAE,kCAAkC,CAAC,CAAC;YACpF,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,sEAAsE,CAAC;SACnF,MAAM,CAAC,eAAe,EAAE,WAAW,EAAE,WAAW,CAAC;SACjD,MAAM,CAAC,eAAe,EAAE,WAAW,EAAE,GAAG,CAAC;SACzC,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC;SACrD,MAAM,CACL,2BAA2B,EAC3B,qDAAqD,EACrD,cAAc,CACf;SACA,MAAM,CACL,uBAAuB,EACvB,oFAAoF,CACrF;SACA,MAAM,CAAC,mBAAmB,EAAE,qBAAqB,CAAC;SAClD,MAAM,CAAC,qBAAqB,EAAE,gDAAgD,CAAC;SAC/E,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;SAC/C,MAAM,CAAC,gBAAgB,EAAE,2CAA2C,EAAE,KAAK,CAAC;SAC5E,MAAM,CAAC,QAAQ,EAAE,yDAAyD,EAAE,KAAK,CAAC;SAClF,SAAS,CACR,oBAAoB,CAAC,wBAAwB,EAAE,gBAAgB,EAAE,uBAAuB,CAAC,CAC1F;SACA,SAAS,CACR,oBAAoB,CAAC,uBAAuB,EAAE,eAAe,EAAE,sBAAsB,CAAC,CACvF;SACA,SAAS,CAAC,oBAAoB,CAAC,qBAAqB,EAAE,aAAa,EAAE,oBAAoB,CAAC,CAAC;SAC3F,SAAS,CACR,oBAAoB,CAClB,2BAA2B,EAC3B,kBAAkB,EAClB,yBAAyB,CAC1B,CACF;SACA,WAAW,CACV,OAAO,EACP;QACE,EAAE;QACF,0EAA0E;QAC1E,qEAAqE;QACrE,+CAA+C;KAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb;SACA,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,cAAmC,EAAE,EAAE;QAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAmB,CAAC;QAChD,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,aAAa,CAAC,+BAA+B,QAAQ,EAAE,EAAE;gBACjE,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,aAAa,CAAC,8BAA8B,cAAc,CAAC,IAAI,EAAE,EAAE;gBAC3E,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,MAAM,EAAE,CAAC;YACzD,MAAM,IAAI,aAAa,CAAC,8BAA8B,cAAc,CAAC,IAAI,EAAE,EAAE;gBAC3E,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC;QACD,MAAM,OAAO,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,aAAa,CAAC,+BAA+B,QAAQ,EAAE,EAAE;gBACjE,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,uBAAuB,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QAChF,cAAc,CAAC,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC;QACrD,cAAc,CAAC,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;QACnD,cAAc,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;QAC/C,cAAc,CAAC,aAAa,GAAG,WAAW,CAAC,aAAa,CAAC;QACzD,IAAI,MAAyC,CAAC;QAC9C,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,IAAI,aAAuC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC5C,aAAa,GAAG,OAAO,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,MAAM,aAAa,GAAG,GAAG,EAAE;YACzB,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,cAAc,GAAG,IAAI,CAAC;gBACtB,aAAa,EAAE,EAAE,CAAC;YACpB,CAAC;QACH,CAAC,CAAC;QACF,IAAI,kBAAkB,GAAG,KAAK,CAAC;QAC/B,IAAI,iBAA2C,CAAC;QAChD,MAAM,WAAW,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAChD,iBAAiB,GAAG,OAAO,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,MAAM,iBAAiB,GAAG,GAAG,EAAE;YAC7B,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACxB,kBAAkB,GAAG,IAAI,CAAC;gBAC1B,iBAAiB,EAAE,EAAE,CAAC;YACxB,CAAC;QACH,CAAC,CAAC;QACF,IAAI,iBAAoD,CAAC;QACzD,IAAI,cAA6E,CAAC;QAClF,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,IAAI,EAAE;YACjC,MAAM,OAAO,CAAC;YACd,MAAM,WAAW,CAAC;YAClB,MAAM,eAAe,GAAc,EAAE,CAAC;YACtC,IAAI,cAAc,CAAC,SAAS,IAAI,cAAc,EAAE,CAAC;gBAC/C,IAAI,CAAC;oBACH,MAAM,WAAW,CACf,cAAc,CAAC,SAAS,EACxB,cAAc,CAAC,QAAQ,EACvB,cAAc,CAAC,QAAQ,CACxB,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;YACD,IAAI,YAAY,GAAG,KAAK,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC;gBACtB,YAAY,GAAG,IAAI,CAAC;YACtB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;YACD,IAAI,YAAY,IAAI,iBAAiB,EAAE,CAAC;gBACtC,IAAI,CAAC;oBACH,MAAM,iBAAiB,EAAE,CAAC;gBAC5B,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;YACD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,sBAAsB,CAAC,eAAe,EAAE,kCAAkC,CAAC,CAAC;YACpF,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,WAAoB,CAAC;QACzB,IAAI,CAAC;YACH,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC;gBAC7B,iBAAiB,GAAG,MAAM,iBAAiB,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YACxE,CAAC;YACD,IAAI,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC;gBACzB,aAAa,EAAE,CAAC;gBAChB,iBAAiB,EAAE,CAAC;gBACpB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC;oBACH,MAAM,GAAG,MAAM,WAAW,CACxB,OAAO,CACL;wBACE,IAAI,EAAE,cAAc,CAAC,IAAI;wBACzB,IAAI;wBACJ,YAAY,EAAE,cAAc,CAAC,QAAQ;qBACtC,EACD,cAAc,CACf,CACF,CAAC;gBACJ,CAAC;wBAAS,CAAC;oBACT,aAAa,EAAE,CAAC;gBAClB,CAAC;gBACD,IAAI,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC;oBACzB,iBAAiB,EAAE,CAAC;oBACpB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxB,CAAC;qBAAM,CAAC;oBACN,IAAI,aAAa,GAAG,IAAI,CAAC;oBACzB,IAAI,CAAC;wBACH,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;wBACpD,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;4BAClB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;wBAC1D,CAAC;wBACD,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC;wBACjC,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC;4BAC7B,MAAM,aAAa,GAAG,GAAG,OAAO,IAAI,CAAC;4BACrC,cAAc,GAAG;gCACf,QAAQ,EAAE,aAAa;gCACvB,QAAQ,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,aAAa,CAAC;6BACjE,CAAC;wBACJ,CAAC;wBACD,IAAI,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC;4BACzB,aAAa,GAAG,KAAK,CAAC;4BACtB,iBAAiB,EAAE,CAAC;4BACpB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;wBACxB,CAAC;6BAAM,CAAC;4BACN,aAAa,GAAG,MAAM,KAAK,CACzB,OAAO,CAAC,IAAI;gCACV,CAAC,CAAC,OAAO;gCACT,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,WAAW,KAAK,IAAI,CAAC,CAC1E,CAAC;4BACF,IAAI,CAAC,aAAa,EAAE,CAAC;gCACnB,iBAAiB,EAAE,CAAC;gCACpB,MAAM,KAAK,EAAE,CAAC;4BAChB,CAAC;wBACH,CAAC;oBACH,CAAC;4BAAS,CAAC;wBACT,iBAAiB,EAAE,CAAC;oBACtB,CAAC;oBACD,IAAI,aAAa,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;wBACpE,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACxB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,GAAG,IAAI,CAAC;YACpB,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC;QACD,aAAa,EAAE,CAAC;QAChB,iBAAiB,EAAE,CAAC;QACpB,MAAM,aAAa,GAAc,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,KAAK,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,YAAY,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;gBAC3C,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,QAAQ,CAAC,OAAO,EAAE,CAAC;QACnB,IAAI,YAAY,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,MAAM,sBAAsB,CAC1B,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,EAC9D,mCAAmC,CACpC,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAmB,CAAC;QAChD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACjC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzB,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC;AASD,SAAS,SAAS,CAAC,MAA2B;IAC5C,IAAI,MAAiC,CAAC;IACtC,OAAO,GAAG,EAAE,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,QAAgB;IACnD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,OAAO;QACL,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,IAAI,EAAE,KAAK,CAAC,IAAI;KACjB,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAuB,EAAE,KAAwB;IAC9E,OAAO,CACL,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW;QACtC,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;QAC9B,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;QACtB,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;QACtB,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CACzB,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAuB,EAAE,KAAwB;IAC5E,OAAO,CACL,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW;QACtC,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;QACtB,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;QACtB,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CACzB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAI,QAAgB,EAAE,MAAwB;IAC5E,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACtD,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,WAAoB,CAAC;IACzB,IAAI,MAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,MAAM,EAAE,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,YAAY,GAAG,IAAI,CAAC;QACpB,WAAW,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC;IAAC,OAAO,YAAY,EAAE,CAAC;QACtB,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,sBAAsB,CAC1B,CAAC,WAAW,EAAE,YAAY,CAAC,EAC3B,uDAAuD,QAAQ,IAAI,CACpE,CAAC;QACJ,CAAC;QACD,MAAM,YAAY,CAAC;IACrB,CAAC;IACD,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,WAAW,CAAC;IACpB,CAAC;IACD,OAAO,MAAW,CAAC;AACrB,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,QAAgB;IACnD,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,OAAO,MAAM,IAAI,CAAC,QAAQ,EAAE;QAC1B,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE;YACP,MAAM,EAAE,CAAC;YACT,UAAU,EAAE,EAAE;YACd,UAAU,EAAE,EAAE;YACd,OAAO,EAAE,GAAG;SACb;QACD,KAAK,EAAE,yBAAyB;QAChC,MAAM,EAAE,0BAA0B;KACnC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,QAAgB;IAEhB,IAAI,iBAAgD,CAAC;IACrD,IAAI,CAAC;QACH,OAAO,MAAM,iBAAiB,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YAClD,iBAAiB,GAAG,MAAM,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACvE,OAAO,iBAAiB,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,iBAAiB,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC;YACtE,CAAC;YAAC,OAAO,YAAY,EAAE,CAAC;gBACtB,MAAM,cAAc,GAAG,IAAI,cAAc,CACvC,CAAC,KAAK,EAAE,YAAY,CAAC,EACrB,4DAA4D,QAAQ,IAAI,CACzE,CAAC;gBACF,cAAc,CAAC,KAAK,GAAG,KAAK,CAAC;gBAC7B,MAAM,cAAc,CAAC;YACvB,CAAC;QACH,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,wBAAwB,CACrC,QAAgB,EAChB,QAAgB;IAEhB,MAAM,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,MAAM,CAAC;IACpD,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CACjC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAC1B,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,MAAM,EAAE,CAC5C,CAAC;IACF,MAAM,UAAU,GAAG,GAAG,aAAa,SAAS,CAAC;IAC7C,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAC9B,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,QAAQ,EAAE;YAC1C,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QACH,mBAAmB,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAClE,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QACzC,iBAAiB,GAAG,IAAI,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,mBAAmB,EAAE,CAAC;YACxB,MAAM,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;YACxB,mBAAmB,GAAG,KAAK,CAAC;QAC9B,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,cAAc,GAAc,EAAE,CAAC;QACrC,IAAI,iBAAiB,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC9C,MAAM,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,YAAqB,EAAE,EAAE;gBACrE,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,mBAAmB,EAAE,CAAC;YACxB,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,YAAqB,EAAE,EAAE;gBACpE,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,cAAc,GAAG,IAAI,cAAc,CACvC,CAAC,KAAK,EAAE,GAAG,cAAc,CAAC,EAC1B,wDAAwD,QAAQ,IAAI,CACrE,CAAC;YACF,cAAc,CAAC,KAAK,GAAG,KAAK,CAAC;YAC7B,MAAM,cAAc,CAAC;QACvB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,UAAkB;IACjE,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,QAAgB,EAChB,gBAAwB,EACxB,gBAAmC;IAEnC,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CACjC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAC1B,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,SAAS,CACxE,CAAC;IACF,IAAI,CAAC;QACH,IACE,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,KAAK,gBAAgB;YAC1D,CAAC,qBAAqB,CAAC,MAAM,qBAAqB,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAC,EAC/E,CAAC;YACD,OAAO;QACT,CAAC;QACD,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACzC,IACE,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,KAAK,gBAAgB;YAC/D,mBAAmB,CAAC,MAAM,qBAAqB,CAAC,aAAa,CAAC,EAAE,gBAAgB,CAAC,EACjF,CAAC;YACD,MAAM,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;YACvC,MAAM,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,YAAY,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,2CAA2C,QAAQ,iCAAiC,aAAa,IAAI,EACrG,EAAE,KAAK,EAAE,YAAY,EAAE,CACxB,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,gBAAwB,EACxB,gBAAmC;IAEnC,MAAM,iBAAiB,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,sBAAsB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAA0B,EAC1B,YAAY,GAAiB,OAAO;IAEpC,OAAO,sBAAsB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5D,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAA0B,EAC1B,YAAY,GAAiB,OAAO;IAMpC,IAAI,eAA0C,CAAC;IAC/C,IAAI,WAAqC,CAAC;IAC1C,IAAI,UAAkD,CAAC;IACvD,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACjD,WAAW,GAAG,OAAO,CAAC;QACtB,UAAU,GAAG,MAAM,CAAC;IACtB,CAAC,CAAC,CAAC;IACH,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,YAAY,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAChD,YAAY,CAAC,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QACD,eAAe,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,KAAK,eAAe,CAAC,IAAI,CACvB,GAAG,EAAE;YACH,eAAe,EAAE,CAAC;YAClB,WAAW,EAAE,EAAE,CAAC;QAClB,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;YACjB,eAAe,EAAE,CAAC;YAClB,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CACF,CAAC;IACJ,CAAC,CAAC;IACF,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACpC,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACrC,OAAO;QACL,OAAO,EAAE,eAAe;QACxB,SAAS,EAAE,GAAG,EAAE,CAAC,eAAe,KAAK,SAAS;QAC9C,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI;KACjB,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAiB,EAAE,OAAe;IAChE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3D,cAAc,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACjC,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAS,eAAe,CAAC,QAAgC,EAAE,WAAoB;IAC7E,MAAM,KAAK,GAAG;QACZ,GAAG,QAAQ,CAAC,QAAQ,qBAAqB;QACzC,cAAc,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE;QAC9G,cAAc,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE;QAClD,eAAe,QAAQ,CAAC,YAAY,EAAE;KACvC,CAAC;IACF,MAAM,cAAc,GAAG,yBAAyB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACxE,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,aAAa,CAAC,yCAAyC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE;YAC5F,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,cAAc,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,yBAAyB,CAChC,QAAgC,EAChC,WAAoB;IAEpB,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IACvE,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO;YACL,iBAAiB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;YAC9C,eAAe,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;YAC1C,oBAAoB,QAAQ,CAAC,aAAa,EAAE;YAC5C,gBAAgB,QAAQ,CAAC,SAAS,EAAE;YACpC,cAAc,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE;SAC9C,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QACvC,OAAO;YACL,iBAAiB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;YAC9C,eAAe,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;YAC1C,gBAAgB,QAAQ,CAAC,SAAS,CAAC,YAAY,EAAE;SAClD,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO;YACL,iBAAiB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;YAC9C,kBAAkB,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;YAChD,gBAAgB,QAAQ,CAAC,SAAS,EAAE;YACpC,WAAW,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE;SACxC,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO,CAAC,iBAAiB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE,cAAc,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5F,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAClC,OAAO;YACL,iBAAiB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;YAC9C,eAAe,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;YAC1C,oBAAoB,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;SACrD,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QACrC,OAAO;YACL,iBAAiB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;YAC9C,eAAe,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;SAC3C,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QACrC,MAAM,mBAAmB,GAAG,WAAW;YACrC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,mBAAmB;YACxC,CAAC,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,0BAA0B,CAAC;QACtF,OAAO;YACL,iBAAiB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;YAC9C,kBAAkB,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;YAChD,uBAAuB,mBAAmB,EAAE;YAC5C,eAAe,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE;YAC/C,kBAAkB,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE;YACrD,cAAc,QAAQ,CAAC,OAAO,EAAE;SACjC,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QACjC,OAAO;YACL,iBAAiB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;YAC9C,eAAe,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;YAC1C,YAAY,QAAQ,CAAC,KAAK,EAAE;SAC7B,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,mBAAmB,CAAC,OAc5B;IACC,MAAM,KAAK,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACxC,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CACR,KAAK,QAAQ,CAAC,EAAE,aAAa,QAAQ,CAAC,QAAQ,YAAY,QAAQ,CAAC,OAAO,WAAW,QAAQ,CAAC,MAAM,aAAa,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CACnJ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CACR,KAAK,KAAK,CAAC,QAAQ,WAAW,KAAK,CAAC,MAAM,aAAa,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CACjG,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,QAAQ,CAAC,QAA8D;IAC9E,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YACzB,QAAQ,CAAC,IAAI,CAAC,yBAAyB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAErB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,EAAE,gCAAgC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzF,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1B,QAAQ,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,EAAE,gBAAgB,OAAO,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACxE,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC;YACnC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1B,QAAQ,CAAC,IAAI,CAAC,YAAY,UAAU,gBAAgB,OAAO,EAAE,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,CAAC,OAAO,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAClE,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;YAC3C,IAAI,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;gBAChE,QAAQ,CAAC,IAAI,CAAC,YAAY,UAAU,gCAAgC,CAAC,CAAC;YACxE,CAAC;YACD,IACE,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CACxC,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CACpD;gBACD,CAAC,QAAQ,EAAE,IAAI,EACf,CAAC;gBACD,QAAQ,CAAC,IAAI,CAAC,YAAY,UAAU,+BAA+B,CAAC,CAAC;YACvE,CAAC;YACD,IACE,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBACvF,CAAC,QAAQ,EAAE,cAAc,EACzB,CAAC;gBACD,QAAQ,CAAC,IAAI,CAAC,YAAY,UAAU,yCAAyC,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAc,EAAE,OAAO,GAAkB,EAAE;IACtE,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE;QACrC,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACzB,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,kBAAkB,GAAG,CAAC,OAAgB,EAAQ,EAAE;QACpD,OAAO,CAAC,eAAe,CAAC;YACtB,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;YACjD,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;SAClD,CAAC,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC;IACF,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACzD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,aAAa,GACjB,KAAK,YAAY,cAAc;YAC7B,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC;gBACvD,CAAC,CAAC,CAAC;gBACH,CAAC,CAAC,KAAK,CAAC,QAAQ;YAClB,CAAC,CAAC,KAAK,YAAY,aAAa;gBAC9B,CAAC,CAAC,KAAK,CAAC,QAAQ;gBAChB,CAAC,CAAC,CAAC,CAAC;QACV,IAAI,KAAK,YAAY,cAAc,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;YAC3D,MAAM,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;QAC1C,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,WAAW,CACf,OAAO,CAAC,MAAM,EACd,GAAG,UAAU,CAAC;gBACZ,KAAK,EAAE;oBACL,GAAG,CAAC,KAAK,YAAY,cAAc,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChE,QAAQ,EAAE,aAAa;oBACvB,GAAG,CAAC,KAAK,YAAY,aAAa,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7E,OAAO,EACL,KAAK,YAAY,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB;wBAChE,CAAC,CAAC,uBAAuB;wBACzB,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC;iBAChC;gBACD,EAAE,EAAE,KAAK;aACV,CAAC,IAAI,CACP,CAAC;QACJ,CAAC;aAAM,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;YAC3C,MAAM,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,OAAO,CAAC,SAAS,IAAI,6BAA6B,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9D,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;AACH,CAAC","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,9 +1,13 @@
1
- import { readFile, stat } from "node:fs/promises";
1
+ import { constants as fsConstants } from "node:fs";
2
+ import { open, stat } from "node:fs/promises";
2
3
  import path from "node:path";
4
+ import { TextDecoder } from "node:util";
3
5
  import YAML from "yaml";
4
6
  import { CrablineError, ensureErrorMessage } from "../core/errors.js";
5
7
  import { ManifestSchema } from "./schema.js";
6
8
  const DEFAULT_CONFIG_CANDIDATES = ["crabline.yaml", "crabline.yml", "crabline.json"];
9
+ const MAX_MANIFEST_BYTES = 1024 * 1024;
10
+ const UTF8_DECODER = new TextDecoder("utf-8", { fatal: true });
7
11
  class DuplicateJsonKeyError extends SyntaxError {
8
12
  }
9
13
  function configLoadError(resolvedPath, error, detail) {
@@ -42,8 +46,40 @@ function parseJson(raw) {
42
46
  }
43
47
  return parsed;
44
48
  }
49
+ async function readManifestFile(resolvedPath) {
50
+ let handle;
51
+ try {
52
+ handle = await open(resolvedPath, process.platform === "win32" ? "r" : fsConstants.O_RDONLY | fsConstants.O_NONBLOCK);
53
+ const stats = await handle.stat();
54
+ if (!stats.isFile()) {
55
+ throw new Error("Config path must be a regular file.");
56
+ }
57
+ if (stats.size > MAX_MANIFEST_BYTES) {
58
+ throw new Error(`Config file exceeds the ${MAX_MANIFEST_BYTES}-byte limit.`);
59
+ }
60
+ const buffer = Buffer.alloc(MAX_MANIFEST_BYTES + 1);
61
+ let offset = 0;
62
+ while (offset < buffer.length) {
63
+ const { bytesRead } = await handle.read(buffer, offset, buffer.length - offset, null);
64
+ if (bytesRead === 0) {
65
+ break;
66
+ }
67
+ offset += bytesRead;
68
+ }
69
+ if (offset > MAX_MANIFEST_BYTES) {
70
+ throw new Error(`Config file exceeds the ${MAX_MANIFEST_BYTES}-byte limit.`);
71
+ }
72
+ return UTF8_DECODER.decode(buffer.subarray(0, offset));
73
+ }
74
+ finally {
75
+ await handle?.close();
76
+ }
77
+ }
45
78
  export async function resolveConfigPath(explicitPath) {
46
- if (explicitPath) {
79
+ if (explicitPath !== undefined) {
80
+ if (explicitPath.trim().length === 0) {
81
+ throw new CrablineError("Config path must not be empty.", { kind: "config" });
82
+ }
47
83
  return path.resolve(explicitPath);
48
84
  }
49
85
  for (const candidate of DEFAULT_CONFIG_CANDIDATES) {
@@ -69,7 +105,7 @@ export async function loadManifest(configPath) {
69
105
  const resolvedPath = await resolveConfigPath(configPath);
70
106
  let raw;
71
107
  try {
72
- raw = await readFile(resolvedPath, "utf8");
108
+ raw = await readManifestFile(resolvedPath);
73
109
  }
74
110
  catch (error) {
75
111
  throw configLoadError(resolvedPath, error, ensureErrorMessage(error));
@@ -1 +1 @@
1
- {"version":3,"file":"load.js","sourceRoot":"","sources":["../../../src/config/load.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport YAML from \"yaml\";\nimport { CrablineError, ensureErrorMessage } from \"../core/errors.js\";\nimport { type ManifestDefinition, ManifestSchema } from \"./schema.js\";\n\nconst DEFAULT_CONFIG_CANDIDATES = [\"crabline.yaml\", \"crabline.yml\", \"crabline.json\"] as const;\n\nclass DuplicateJsonKeyError extends SyntaxError {}\n\nfunction configLoadError(resolvedPath: string, error: unknown, detail: string): CrablineError {\n return new CrablineError(`Unable to load config file \"${resolvedPath}\": ${detail}`, {\n cause: error,\n kind: \"config\",\n });\n}\n\nfunction formatYamlParseError(error: unknown): string {\n if (!(error instanceof Error) || error.name !== \"YAMLParseError\") {\n return \"YAML parse failed.\";\n }\n const yamlError = error as Error & {\n code?: unknown;\n linePos?: Array<{ col?: unknown; line?: unknown }>;\n };\n const code = typeof yamlError.code === \"string\" ? ` (${yamlError.code})` : \"\";\n const position = yamlError.linePos?.[0];\n const location =\n typeof position?.line === \"number\" && typeof position.col === \"number\"\n ? ` at line ${position.line}, column ${position.col}`\n : \"\";\n return `YAML parse error${code}${location}.`;\n}\n\nfunction formatJsonParseError(error: unknown): string {\n if (error instanceof DuplicateJsonKeyError) {\n return \"JSON parse error: duplicate object key.\";\n }\n if (!(error instanceof SyntaxError)) {\n return \"JSON parse failed.\";\n }\n const position = /\\bposition (\\d+)\\b/u.exec(error.message)?.[1];\n return position ? `JSON parse error at position ${position}.` : \"JSON parse error.\";\n}\n\nfunction parseJson(raw: string): unknown {\n const parsed: unknown = JSON.parse(raw);\n const document = YAML.parseDocument(raw, { schema: \"json\", uniqueKeys: true });\n if (document.errors.some((error) => error.code === \"DUPLICATE_KEY\")) {\n throw new DuplicateJsonKeyError(\"JSON contains a duplicate object key.\");\n }\n return parsed;\n}\n\nexport async function resolveConfigPath(explicitPath?: string): Promise<string> {\n if (explicitPath) {\n return path.resolve(explicitPath);\n }\n\n for (const candidate of DEFAULT_CONFIG_CANDIDATES) {\n const resolved = path.resolve(candidate);\n try {\n if ((await stat(resolved)).isFile()) {\n return resolved;\n }\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n ) {\n continue;\n }\n throw error;\n }\n }\n\n throw new CrablineError(\n \"No config file found. Create crabline.yaml, crabline.yml, or crabline.json.\",\n { kind: \"config\" },\n );\n}\n\nexport async function loadManifest(\n configPath?: string,\n): Promise<{ manifest: ManifestDefinition; path: string }> {\n const resolvedPath = await resolveConfigPath(configPath);\n let raw: string;\n try {\n raw = await readFile(resolvedPath, \"utf8\");\n } catch (error) {\n throw configLoadError(resolvedPath, error, ensureErrorMessage(error));\n }\n\n const isJson = path.extname(resolvedPath).toLowerCase() === \".json\";\n let parsed: unknown;\n try {\n parsed = isJson ? parseJson(raw) : YAML.parse(raw, { merge: true });\n } catch (error) {\n const detail = isJson ? formatJsonParseError(error) : formatYamlParseError(error);\n throw configLoadError(resolvedPath, new Error(detail), detail);\n }\n\n try {\n const manifest = ManifestSchema.parse(parsed);\n return { manifest, path: resolvedPath };\n } catch (error) {\n throw configLoadError(resolvedPath, error, ensureErrorMessage(error));\n }\n}\n"]}
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../../src/config/load.ts"],"names":[],"mappings":"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","sourcesContent":["import { constants as fsConstants } from \"node:fs\";\nimport { open, stat, type FileHandle } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { TextDecoder } from \"node:util\";\nimport YAML from \"yaml\";\nimport { CrablineError, ensureErrorMessage } from \"../core/errors.js\";\nimport { type ManifestDefinition, ManifestSchema } from \"./schema.js\";\n\nconst DEFAULT_CONFIG_CANDIDATES = [\"crabline.yaml\", \"crabline.yml\", \"crabline.json\"] as const;\nconst MAX_MANIFEST_BYTES = 1024 * 1024;\nconst UTF8_DECODER = new TextDecoder(\"utf-8\", { fatal: true });\n\nclass DuplicateJsonKeyError extends SyntaxError {}\n\nfunction configLoadError(resolvedPath: string, error: unknown, detail: string): CrablineError {\n return new CrablineError(`Unable to load config file \"${resolvedPath}\": ${detail}`, {\n cause: error,\n kind: \"config\",\n });\n}\n\nfunction formatYamlParseError(error: unknown): string {\n if (!(error instanceof Error) || error.name !== \"YAMLParseError\") {\n return \"YAML parse failed.\";\n }\n const yamlError = error as Error & {\n code?: unknown;\n linePos?: Array<{ col?: unknown; line?: unknown }>;\n };\n const code = typeof yamlError.code === \"string\" ? ` (${yamlError.code})` : \"\";\n const position = yamlError.linePos?.[0];\n const location =\n typeof position?.line === \"number\" && typeof position.col === \"number\"\n ? ` at line ${position.line}, column ${position.col}`\n : \"\";\n return `YAML parse error${code}${location}.`;\n}\n\nfunction formatJsonParseError(error: unknown): string {\n if (error instanceof DuplicateJsonKeyError) {\n return \"JSON parse error: duplicate object key.\";\n }\n if (!(error instanceof SyntaxError)) {\n return \"JSON parse failed.\";\n }\n const position = /\\bposition (\\d+)\\b/u.exec(error.message)?.[1];\n return position ? `JSON parse error at position ${position}.` : \"JSON parse error.\";\n}\n\nfunction parseJson(raw: string): unknown {\n const parsed: unknown = JSON.parse(raw);\n const document = YAML.parseDocument(raw, { schema: \"json\", uniqueKeys: true });\n if (document.errors.some((error) => error.code === \"DUPLICATE_KEY\")) {\n throw new DuplicateJsonKeyError(\"JSON contains a duplicate object key.\");\n }\n return parsed;\n}\n\nasync function readManifestFile(resolvedPath: string): Promise<string> {\n let handle: FileHandle | undefined;\n try {\n handle = await open(\n resolvedPath,\n process.platform === \"win32\" ? \"r\" : fsConstants.O_RDONLY | fsConstants.O_NONBLOCK,\n );\n const stats = await handle.stat();\n if (!stats.isFile()) {\n throw new Error(\"Config path must be a regular file.\");\n }\n if (stats.size > MAX_MANIFEST_BYTES) {\n throw new Error(`Config file exceeds the ${MAX_MANIFEST_BYTES}-byte limit.`);\n }\n\n const buffer = Buffer.alloc(MAX_MANIFEST_BYTES + 1);\n let offset = 0;\n while (offset < buffer.length) {\n const { bytesRead } = await handle.read(buffer, offset, buffer.length - offset, null);\n if (bytesRead === 0) {\n break;\n }\n offset += bytesRead;\n }\n if (offset > MAX_MANIFEST_BYTES) {\n throw new Error(`Config file exceeds the ${MAX_MANIFEST_BYTES}-byte limit.`);\n }\n return UTF8_DECODER.decode(buffer.subarray(0, offset));\n } finally {\n await handle?.close();\n }\n}\n\nexport async function resolveConfigPath(explicitPath?: string): Promise<string> {\n if (explicitPath !== undefined) {\n if (explicitPath.trim().length === 0) {\n throw new CrablineError(\"Config path must not be empty.\", { kind: \"config\" });\n }\n return path.resolve(explicitPath);\n }\n\n for (const candidate of DEFAULT_CONFIG_CANDIDATES) {\n const resolved = path.resolve(candidate);\n try {\n if ((await stat(resolved)).isFile()) {\n return resolved;\n }\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n ) {\n continue;\n }\n throw error;\n }\n }\n\n throw new CrablineError(\n \"No config file found. Create crabline.yaml, crabline.yml, or crabline.json.\",\n { kind: \"config\" },\n );\n}\n\nexport async function loadManifest(\n configPath?: string,\n): Promise<{ manifest: ManifestDefinition; path: string }> {\n const resolvedPath = await resolveConfigPath(configPath);\n let raw: string;\n try {\n raw = await readManifestFile(resolvedPath);\n } catch (error) {\n throw configLoadError(resolvedPath, error, ensureErrorMessage(error));\n }\n\n const isJson = path.extname(resolvedPath).toLowerCase() === \".json\";\n let parsed: unknown;\n try {\n parsed = isJson ? parseJson(raw) : YAML.parse(raw, { merge: true });\n } catch (error) {\n const detail = isJson ? formatJsonParseError(error) : formatYamlParseError(error);\n throw configLoadError(resolvedPath, new Error(detail), detail);\n }\n\n try {\n const manifest = ManifestSchema.parse(parsed);\n return { manifest, path: resolvedPath };\n } catch (error) {\n throw configLoadError(resolvedPath, error, ensureErrorMessage(error));\n }\n}\n"]}
@@ -7,6 +7,20 @@ export declare const BUILTIN_ADAPTERS: readonly ["discord", "feishu", "googlecha
7
7
  export declare const PROVIDER_PLATFORMS: readonly ["bluebubbles", "discord", "feishu", "googlechat", "imessage", "irc", "line", "loopback", "matrix", "mattermost", "msteams", "nextcloudtalk", "nostr", "signal", "slack", "synologychat", "telegram", "tlon", "twitch", "webchat", "whatsapp", "zalo", "zalouser"];
8
8
  type BuiltinAdapterName = (typeof BUILTIN_ADAPTERS)[number];
9
9
  type ProviderPlatformName = (typeof PROVIDER_PLATFORMS)[number];
10
+ type FixtureModeConstraintInput = {
11
+ inboundMatch: {
12
+ nonce: (typeof INBOUND_NONCE_MODES)[number];
13
+ pattern?: string | undefined;
14
+ strategy: (typeof INBOUND_STRATEGIES)[number];
15
+ };
16
+ mode: (typeof FIXTURE_MODES)[number];
17
+ retries: number;
18
+ };
19
+ type FixtureModeValidationIssue = {
20
+ message: string;
21
+ path: ["inboundMatch", "nonce" | "strategy"];
22
+ };
23
+ export declare function fixtureModeValidationIssue(value: FixtureModeConstraintInput): FixtureModeValidationIssue | undefined;
10
24
  export declare const ProviderConfigSchema: z.ZodPipe<z.ZodObject<{
11
25
  adapter: z.ZodEnum<{
12
26
  discord: "discord";
@@ -145,6 +159,7 @@ export declare const ProviderConfigSchema: z.ZodPipe<z.ZodObject<{
145
159
  port: z.ZodDefault<z.ZodNumber>;
146
160
  publicUrl: z.ZodOptional<z.ZodString>;
147
161
  }, z.core.$strict>>;
162
+ webhookToken: z.ZodOptional<z.ZodString>;
148
163
  websocket: z.ZodOptional<z.ZodObject<{
149
164
  enabled: z.ZodOptional<z.ZodBoolean>;
150
165
  maxReconnectDelayMs: z.ZodOptional<z.ZodNumber>;
@@ -409,6 +424,7 @@ export declare const ProviderConfigSchema: z.ZodPipe<z.ZodObject<{
409
424
  port: number;
410
425
  publicUrl?: string | undefined;
411
426
  };
427
+ webhookToken?: string | undefined;
412
428
  websocket?: {
413
429
  enabled?: boolean | undefined;
414
430
  maxReconnectDelayMs?: number | undefined;
@@ -638,6 +654,7 @@ export declare const ProviderConfigSchema: z.ZodPipe<z.ZodObject<{
638
654
  port: number;
639
655
  publicUrl?: string | undefined;
640
656
  };
657
+ webhookToken?: string | undefined;
641
658
  websocket?: {
642
659
  enabled?: boolean | undefined;
643
660
  maxReconnectDelayMs?: number | undefined;
@@ -980,6 +997,7 @@ export declare const ManifestSchema: z.ZodPreprocess<z.ZodObject<{
980
997
  port: z.ZodDefault<z.ZodNumber>;
981
998
  publicUrl: z.ZodOptional<z.ZodString>;
982
999
  }, z.core.$strict>>;
1000
+ webhookToken: z.ZodOptional<z.ZodString>;
983
1001
  websocket: z.ZodOptional<z.ZodObject<{
984
1002
  enabled: z.ZodOptional<z.ZodBoolean>;
985
1003
  maxReconnectDelayMs: z.ZodOptional<z.ZodNumber>;
@@ -1244,6 +1262,7 @@ export declare const ManifestSchema: z.ZodPreprocess<z.ZodObject<{
1244
1262
  port: number;
1245
1263
  publicUrl?: string | undefined;
1246
1264
  };
1265
+ webhookToken?: string | undefined;
1247
1266
  websocket?: {
1248
1267
  enabled?: boolean | undefined;
1249
1268
  maxReconnectDelayMs?: number | undefined;
@@ -1473,6 +1492,7 @@ export declare const ManifestSchema: z.ZodPreprocess<z.ZodObject<{
1473
1492
  port: number;
1474
1493
  publicUrl?: string | undefined;
1475
1494
  };
1495
+ webhookToken?: string | undefined;
1476
1496
  websocket?: {
1477
1497
  enabled?: boolean | undefined;
1478
1498
  maxReconnectDelayMs?: number | undefined;