@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":"schema.js","sourceRoot":"","sources":["../../../src/config/schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"zod\";\nimport { inboundRegexSafetyError } from \"../core/safe-regex.js\";\n\nexport const FIXTURE_MODES = [\"probe\", \"send\", \"roundtrip\", \"agent\"] as const;\nconst FIXTURE_ID_PATTERN = /^[a-z0-9-]+$/i;\nconst MAX_TIMER_MS = 2_147_483_647;\nexport const INBOUND_AUTHORS = [\"assistant\", \"user\", \"system\", \"any\"] as const;\nexport const INBOUND_STRATEGIES = [\"contains\", \"exact\", \"regex\"] as const;\nexport const INBOUND_NONCE_MODES = [\"contains\", \"exact\", \"ignore\"] as const;\nexport const BUILTIN_ADAPTERS = [\n \"discord\",\n \"feishu\",\n \"googlechat\",\n \"imessage\",\n \"loopback\",\n \"matrix\",\n \"mattermost\",\n \"msteams\",\n \"script\",\n \"slack\",\n \"telegram\",\n \"whatsapp\",\n \"zalo\",\n] as const;\nexport const PROVIDER_PLATFORMS = [\n \"bluebubbles\",\n \"discord\",\n \"feishu\",\n \"googlechat\",\n \"imessage\",\n \"irc\",\n \"line\",\n \"loopback\",\n \"matrix\",\n \"mattermost\",\n \"msteams\",\n \"nextcloudtalk\",\n \"nostr\",\n \"signal\",\n \"slack\",\n \"synologychat\",\n \"telegram\",\n \"tlon\",\n \"twitch\",\n \"webchat\",\n \"whatsapp\",\n \"zalo\",\n \"zalouser\",\n] as const;\n\ntype BuiltinAdapterName = (typeof BUILTIN_ADAPTERS)[number];\ntype ProviderPlatformName = (typeof PROVIDER_PLATFORMS)[number];\n\nconst HttpUrlSchema = z\n .string()\n .url()\n .refine((value) => {\n try {\n const protocol = new URL(value).protocol;\n return protocol === \"http:\" || protocol === \"https:\";\n } catch {\n return false;\n }\n }, \"URL must use http or https\");\n\nfunction inferProviderPlatform(adapter: BuiltinAdapterName): ProviderPlatformName | undefined {\n if (adapter === \"script\") {\n return undefined;\n }\n\n return adapter;\n}\n\nconst TargetSchema = z.strictObject({\n id: z.string().min(1),\n channelId: z.string().min(1).optional(),\n threadId: z.string().min(1).optional(),\n behavior: z.enum([\"agent\", \"echo\", \"sink\"]).optional(),\n metadata: z.record(z.string(), z.string()).default({}),\n});\n\nconst InboundMatchSchema = z\n .strictObject({\n author: z.enum(INBOUND_AUTHORS).default(\"assistant\"),\n nonce: z.enum(INBOUND_NONCE_MODES).default(\"contains\"),\n pattern: z.string().min(1).optional(),\n strategy: z.enum(INBOUND_STRATEGIES).default(\"contains\"),\n })\n .superRefine((value, ctx) => {\n if (value.strategy === \"exact\" && value.pattern && value.nonce !== \"ignore\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"inboundMatch.strategy=exact requires inboundMatch.nonce=ignore\",\n path: [\"nonce\"],\n });\n }\n if (value.strategy !== \"regex\" || !value.pattern) {\n return;\n }\n try {\n RegExp(value.pattern, \"u\");\n } catch {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"inboundMatch.pattern must be a valid Unicode regular expression\",\n path: [\"pattern\"],\n });\n return;\n }\n const safetyError = inboundRegexSafetyError(value.pattern);\n if (safetyError) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `inboundMatch.pattern ${safetyError}`,\n path: [\"pattern\"],\n });\n }\n });\n\nconst ScriptCommandSchema = z\n .string()\n .min(1)\n .refine((value) => value.trim().length > 0, \"script command must not be blank\");\n\nconst ScriptCommandsSchema = z.strictObject({\n probe: ScriptCommandSchema.optional(),\n send: ScriptCommandSchema.optional(),\n waitForInbound: ScriptCommandSchema.optional(),\n watch: ScriptCommandSchema.optional(),\n});\n\nconst LoopbackConfigSchema = z.strictObject({\n delayMs: z.number().int().min(0).max(MAX_TIMER_MS).default(25),\n});\n\nconst ScriptConfigSchema = z.strictObject({\n commands: ScriptCommandsSchema,\n cwd: z.string().min(1).optional(),\n shell: z.string().min(1).optional(),\n});\n\nconst SlackRecorderSchema = z.strictObject({\n path: z.string().min(1).optional(),\n});\n\nconst SlackWebhookSchema = z.strictObject({\n host: z.string().min(1).default(\"127.0.0.1\"),\n path: z.string().min(1).default(\"/slack/events\"),\n port: z.number().int().min(0).max(65_535).default(8787),\n publicUrl: HttpUrlSchema.optional(),\n});\n\nconst SlackConfigSchema = z.strictObject({\n recorder: SlackRecorderSchema.default({}),\n signingSecret: z.string().min(1).optional(),\n webhook: SlackWebhookSchema.default({\n host: \"127.0.0.1\",\n path: \"/slack/events\",\n port: 8787,\n }),\n});\n\nconst DiscordRecorderSchema = z.strictObject({\n path: z.string().min(1).optional(),\n});\n\nconst DiscordWebhookSchema = z.strictObject({\n host: z.string().min(1).default(\"127.0.0.1\"),\n path: z.string().min(1).default(\"/discord/interactions\"),\n port: z.number().int().min(0).max(65_535).default(8788),\n publicUrl: HttpUrlSchema.optional(),\n});\n\nconst DiscordConfigSchema = z.strictObject({\n applicationId: z.string().min(1).optional(),\n botToken: z.string().min(1).optional(),\n gatewayDurationMs: z.number().int().min(1000).default(180_000),\n mentionRoleIds: z.array(z.string().min(1)).optional(),\n publicKey: z.string().min(1).optional(),\n recorder: DiscordRecorderSchema.default({}),\n webhook: DiscordWebhookSchema.default({\n host: \"127.0.0.1\",\n path: \"/discord/interactions\",\n port: 8788,\n }),\n});\n\nconst WhatsAppRecorderSchema = z.strictObject({\n path: z.string().min(1).optional(),\n});\n\nconst WhatsAppWebhookSchema = z.strictObject({\n host: z.string().min(1).default(\"127.0.0.1\"),\n path: z.string().min(1).default(\"/whatsapp/webhook\"),\n port: z.number().int().min(0).max(65_535).default(8789),\n publicUrl: HttpUrlSchema.optional(),\n});\n\nconst WhatsAppConfigSchema = z.strictObject({\n accessToken: z.string().min(1).optional(),\n apiUrl: HttpUrlSchema.optional(),\n apiVersion: z.string().min(1).optional(),\n appSecret: z.string().min(1).optional(),\n phoneNumberId: z.string().min(1).optional(),\n recorder: WhatsAppRecorderSchema.default({}),\n userName: z.string().min(1).optional(),\n verifyToken: z.string().min(1).optional(),\n webhook: WhatsAppWebhookSchema.default({\n host: \"127.0.0.1\",\n path: \"/whatsapp/webhook\",\n port: 8789,\n }),\n});\n\nconst MsTeamsFederatedSchema = z.strictObject({\n clientAudience: z.string().min(1).optional(),\n clientId: z.string().min(1),\n});\n\nconst MsTeamsRecorderSchema = z.strictObject({\n path: z.string().min(1).optional(),\n});\n\nconst MsTeamsWebhookSchema = z.strictObject({\n host: z.string().min(1).default(\"127.0.0.1\"),\n path: z.string().min(1).default(\"/msteams/webhook\"),\n port: z.number().int().min(0).max(65_535).default(8791),\n publicUrl: HttpUrlSchema.optional(),\n});\n\nconst MsTeamsConfigSchema = z.strictObject({\n apiUrl: HttpUrlSchema.optional(),\n appId: z.string().min(1).optional(),\n appPassword: z.string().min(1).optional(),\n appTenantId: z.string().min(1).optional(),\n appType: z.enum([\"MultiTenant\", \"SingleTenant\"]).optional(),\n dialogOpenTimeoutMs: z.number().int().min(0).optional(),\n federated: MsTeamsFederatedSchema.optional(),\n recorder: MsTeamsRecorderSchema.default({}),\n userName: z.string().min(1).optional(),\n webhook: MsTeamsWebhookSchema.default({\n host: \"127.0.0.1\",\n path: \"/msteams/webhook\",\n port: 8791,\n }),\n});\n\nconst GoogleChatCredentialsSchema = z\n .object({\n client_email: z.string().min(1),\n private_key: z.string().min(1),\n project_id: z.string().min(1).optional(),\n })\n .passthrough();\n\nconst GoogleChatRecorderSchema = z.strictObject({\n path: z.string().min(1).optional(),\n});\n\nconst GoogleChatWebhookSchema = z.strictObject({\n host: z.string().min(1).default(\"127.0.0.1\"),\n path: z.string().min(1).default(\"/googlechat/webhook\"),\n port: z.number().int().min(0).max(65_535).default(8792),\n publicUrl: HttpUrlSchema.optional(),\n});\n\nconst GoogleChatConfigSchema = z.strictObject({\n apiUrl: HttpUrlSchema.optional(),\n credentials: GoogleChatCredentialsSchema.optional(),\n disableSignatureVerification: z.boolean().optional(),\n endpointUrl: HttpUrlSchema.optional(),\n googleChatProjectNumber: z.string().min(1).optional(),\n impersonateUser: z.string().min(1).optional(),\n pubsubAudience: z.string().min(1).optional(),\n pubsubServiceAccountEmail: z.string().min(1).optional(),\n pubsubTopic: z.string().min(1).optional(),\n recorder: GoogleChatRecorderSchema.default({}),\n useApplicationDefaultCredentials: z.boolean().optional(),\n userName: z.string().min(1).optional(),\n webhook: GoogleChatWebhookSchema.default({\n host: \"127.0.0.1\",\n path: \"/googlechat/webhook\",\n port: 8792,\n }),\n});\n\nconst TelegramLongPollingSchema = z.strictObject({\n allowedUpdates: z.array(z.string().min(1)).optional(),\n deleteWebhook: z.boolean().optional(),\n dropPendingUpdates: z.boolean().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n retryDelayMs: z.number().int().min(0).optional(),\n timeout: z.number().int().min(0).optional(),\n});\n\nconst TelegramRecorderSchema = z.strictObject({\n path: z.string().min(1).optional(),\n});\n\nconst TelegramWebhookSchema = z.strictObject({\n host: z.string().min(1).default(\"127.0.0.1\"),\n path: z.string().min(1).default(\"/telegram/webhook\"),\n port: z.number().int().min(0).max(65_535).default(8790),\n publicUrl: HttpUrlSchema.optional(),\n});\n\nconst TelegramConfigSchema = z.strictObject({\n apiUrl: HttpUrlSchema.optional(),\n botToken: z.string().min(1).optional(),\n longPolling: TelegramLongPollingSchema.optional(),\n mode: z.enum([\"auto\", \"polling\", \"webhook\"]).default(\"auto\"),\n recorder: TelegramRecorderSchema.default({}),\n secretToken: z.string().min(1).optional(),\n userName: z.string().min(1).optional(),\n webhook: TelegramWebhookSchema.default({\n host: \"127.0.0.1\",\n path: \"/telegram/webhook\",\n port: 8790,\n }),\n});\n\nconst FeishuConfigSchema = z.strictObject({\n appId: z.string().min(1).optional(),\n appSecret: z.string().min(1).optional(),\n encryptKey: z.string().min(1).optional(),\n recorder: z.strictObject({ path: z.string().min(1).optional() }).default({}),\n userName: z.string().min(1).optional(),\n verificationToken: z.string().min(1).optional(),\n webhook: z\n .strictObject({\n host: z.string().min(1).default(\"127.0.0.1\"),\n path: z.string().min(1).default(\"/feishu/webhook\"),\n port: z.number().int().min(0).max(65_535).default(8795),\n publicUrl: HttpUrlSchema.optional(),\n })\n .default({\n host: \"127.0.0.1\",\n path: \"/feishu/webhook\",\n port: 8795,\n }),\n});\n\nconst MattermostRecorderSchema = z.strictObject({\n path: z.string().min(1).optional(),\n});\n\nconst MattermostWebhookSchema = z.strictObject({\n host: z.string().min(1).default(\"127.0.0.1\"),\n path: z.string().min(1).default(\"/mattermost/webhook\"),\n port: z.number().int().min(0).max(65_535).default(8793),\n publicUrl: HttpUrlSchema.optional(),\n});\n\nconst MattermostWebsocketSchema = z.strictObject({\n enabled: z.boolean().optional(),\n maxReconnectDelayMs: z.number().int().min(0).optional(),\n reconnectDelayMs: z.number().int().min(0).optional(),\n});\n\nconst MattermostConfigSchema = z.strictObject({\n baseUrl: HttpUrlSchema.optional(),\n botToken: z.string().min(1).optional(),\n callbackUrl: HttpUrlSchema.optional(),\n recorder: MattermostRecorderSchema.default({}),\n userName: z.string().min(1).optional(),\n webhook: MattermostWebhookSchema.default({\n host: \"127.0.0.1\",\n path: \"/mattermost/webhook\",\n port: 8793,\n }),\n websocket: MattermostWebsocketSchema.optional(),\n});\n\nconst ZaloRecorderSchema = z.strictObject({\n path: z.string().min(1).optional(),\n});\n\nconst ZaloWebhookSchema = z.strictObject({\n host: z.string().min(1).default(\"127.0.0.1\"),\n path: z.string().min(1).default(\"/zalo/webhook\"),\n port: z.number().int().min(0).max(65_535).default(8794),\n publicUrl: HttpUrlSchema.optional(),\n});\n\nconst ZaloConfigSchema = z.strictObject({\n botToken: z.string().min(1).optional(),\n recorder: ZaloRecorderSchema.default({}),\n userName: z.string().min(1).optional(),\n webhook: ZaloWebhookSchema.default({\n host: \"127.0.0.1\",\n path: \"/zalo/webhook\",\n port: 8794,\n }),\n webhookSecret: z.string().min(1).optional(),\n});\n\nconst MatrixAccessTokenAuthSchema = z.strictObject({\n accessToken: z.string().min(1),\n type: z.literal(\"accessToken\"),\n userID: z.string().min(1).optional(),\n});\n\nconst MatrixPasswordAuthSchema = z.strictObject({\n password: z.string().min(1),\n type: z.literal(\"password\"),\n userID: z.string().min(1).optional(),\n username: z.string().min(1),\n});\n\nconst MatrixConfigSchema = z.strictObject({\n auth: z.union([MatrixAccessTokenAuthSchema, MatrixPasswordAuthSchema]).optional(),\n baseURL: HttpUrlSchema.optional(),\n commandPrefix: z.string().min(1).optional(),\n recorder: z.strictObject({ path: z.string().min(1).optional() }).default({}),\n recoveryKey: z.string().min(1).optional(),\n roomAllowlist: z.array(z.string().min(1)).optional(),\n webhook: z\n .strictObject({\n host: z.string().min(1).default(\"127.0.0.1\"),\n path: z.string().min(1).default(\"/matrix/webhook\"),\n port: z.number().int().min(0).max(65_535).default(8797),\n publicUrl: HttpUrlSchema.optional(),\n })\n .default({\n host: \"127.0.0.1\",\n path: \"/matrix/webhook\",\n port: 8797,\n }),\n});\n\nconst IMessageConfigSchema = z.strictObject({\n apiKey: z.string().min(1).optional(),\n gatewayDurationMs: z.number().int().min(1000).default(180_000),\n local: z.boolean().optional(),\n recorder: z.strictObject({ path: z.string().min(1).optional() }).default({}),\n serverUrl: HttpUrlSchema.optional(),\n webhook: z\n .strictObject({\n host: z.string().min(1).default(\"127.0.0.1\"),\n path: z.string().min(1).default(\"/imessage/webhook\"),\n port: z.number().int().min(0).max(65_535).default(8796),\n publicUrl: HttpUrlSchema.optional(),\n })\n .default({\n host: \"127.0.0.1\",\n path: \"/imessage/webhook\",\n port: 8796,\n }),\n});\n\nexport const ProviderConfigSchema = z\n .strictObject({\n adapter: z.enum(BUILTIN_ADAPTERS),\n capabilities: z.array(z.enum(FIXTURE_MODES)).default([\"probe\", \"send\", \"roundtrip\", \"agent\"]),\n discord: DiscordConfigSchema.optional(),\n env: z.array(z.string().min(1)).default([]),\n feishu: FeishuConfigSchema.optional(),\n googlechat: GoogleChatConfigSchema.optional(),\n imessage: IMessageConfigSchema.optional(),\n loopback: LoopbackConfigSchema.optional(),\n matrix: MatrixConfigSchema.optional(),\n mattermost: MattermostConfigSchema.optional(),\n msteams: MsTeamsConfigSchema.optional(),\n notes: z.string().optional(),\n platform: z.enum(PROVIDER_PLATFORMS).optional(),\n slack: SlackConfigSchema.optional(),\n script: ScriptConfigSchema.optional(),\n status: z.enum([\"active\", \"disabled\", \"planned\"]).default(\"active\"),\n telegram: TelegramConfigSchema.optional(),\n whatsapp: WhatsAppConfigSchema.optional(),\n zalo: ZaloConfigSchema.optional(),\n })\n .superRefine((value, ctx) => {\n const platform = value.platform ?? inferProviderPlatform(value.adapter);\n\n for (const adapterConfigKey of BUILTIN_ADAPTERS) {\n if (adapterConfigKey === value.adapter || value[adapterConfigKey] === undefined) {\n continue;\n }\n\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n value.adapter === \"script\"\n ? `script adapter cannot use ${adapterConfigKey} configuration; configure provider behavior through script.commands`\n : `${adapterConfigKey} configuration requires adapter=${adapterConfigKey}, got adapter=${value.adapter}`,\n path: [adapterConfigKey],\n });\n }\n\n if (value.adapter === \"script\" && !value.script) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"script adapter requires a script configuration\",\n path: [\"script\"],\n });\n }\n\n if (value.adapter === \"script\" && !value.platform) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"script adapter requires platform\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"script\" && value.status === \"active\" && value.script) {\n const requiredCommands = new Set<\"probe\" | \"send\" | \"waitForInbound\">();\n for (const capability of value.capabilities) {\n if (capability === \"probe\") {\n requiredCommands.add(\"probe\");\n }\n if (capability === \"send\" || capability === \"roundtrip\" || capability === \"agent\") {\n requiredCommands.add(\"send\");\n }\n if (capability === \"roundtrip\" || capability === \"agent\") {\n requiredCommands.add(\"waitForInbound\");\n }\n }\n\n for (const command of requiredCommands) {\n if (!value.script.commands[command]) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `active script provider requires script.commands.${command} for its declared capabilities`,\n path: [\"script\", \"commands\", command],\n });\n }\n }\n }\n\n if (value.adapter === \"loopback\" && platform !== \"loopback\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"loopback adapter must use platform=loopback\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"slack\" && platform !== \"slack\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"slack adapter must use platform=slack\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"discord\" && platform !== \"discord\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"discord adapter must use platform=discord\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"feishu\" && platform !== \"feishu\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"feishu adapter must use platform=feishu\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"googlechat\" && platform !== \"googlechat\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"googlechat adapter must use platform=googlechat\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"mattermost\" && platform !== \"mattermost\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"mattermost adapter must use platform=mattermost\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"msteams\" && platform !== \"msteams\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"msteams adapter must use platform=msteams\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"whatsapp\" && platform !== \"whatsapp\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"whatsapp adapter must use platform=whatsapp\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"telegram\" && platform !== \"telegram\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"telegram adapter must use platform=telegram\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"matrix\" && platform !== \"matrix\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"matrix adapter must use platform=matrix\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"imessage\" && platform !== \"imessage\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"imessage adapter must use platform=imessage\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"zalo\" && platform !== \"zalo\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"zalo adapter must use platform=zalo\",\n path: [\"platform\"],\n });\n }\n })\n .transform((value) => ({\n ...value,\n platform: value.platform ?? inferProviderPlatform(value.adapter) ?? \"loopback\",\n }));\n\nexport const FixtureSchema = z.strictObject({\n accountId: z.string().min(1).optional(),\n env: z.array(z.string().min(1)).default([]),\n id: z\n .string()\n .min(1)\n .regex(FIXTURE_ID_PATTERN, \"fixture id must contain only letters, numbers, and hyphens\"),\n inboundMatch: InboundMatchSchema.default({\n author: \"assistant\",\n nonce: \"contains\",\n strategy: \"contains\",\n }),\n mode: z.enum(FIXTURE_MODES),\n notes: z.string().optional(),\n provider: z.string().min(1),\n retries: z.number().int().min(0).default(0),\n tags: z.array(z.string().min(1)).default([]),\n target: TargetSchema,\n timeoutMs: z.number().int().min(100).max(MAX_TIMER_MS).default(30_000),\n});\n\nconst MANIFEST_EXTENSION_KEY_PATTERN = /^x-[a-z0-9][a-z0-9._-]*$/u;\n\nfunction omitManifestExtensions(value: unknown): unknown {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return value;\n }\n\n const entries = Object.entries(value);\n const manifestEntries = entries.filter(([key]) => !MANIFEST_EXTENSION_KEY_PATTERN.test(key));\n return manifestEntries.length === entries.length ? value : Object.fromEntries(manifestEntries);\n}\n\nconst StrictManifestSchema = z\n .strictObject({\n configVersion: z.literal(1).default(1),\n fixtures: z.array(FixtureSchema).default([]),\n providers: z.record(z.string().min(1), ProviderConfigSchema).default({}),\n userName: z.string().min(1).default(\"crabline\"),\n })\n .superRefine((manifest, ctx) => {\n const seenFixtureIds = new Set<string>();\n for (const [index, fixture] of manifest.fixtures.entries()) {\n if (seenFixtureIds.has(fixture.id)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `duplicate fixture id: ${fixture.id}`,\n path: [\"fixtures\", index, \"id\"],\n });\n }\n seenFixtureIds.add(fixture.id);\n\n if (!Object.hasOwn(manifest.providers, fixture.provider)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `fixture ${fixture.id} references unknown provider ${fixture.provider}`,\n path: [\"fixtures\", index, \"provider\"],\n });\n continue;\n }\n\n const provider = manifest.providers[fixture.provider]!;\n if (!provider.capabilities.includes(fixture.mode)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `fixture ${fixture.id} uses mode ${fixture.mode}, but provider ${fixture.provider} declares capabilities ${provider.capabilities.join(\", \") || \"(none)\"}`,\n path: [\"fixtures\", index, \"mode\"],\n });\n }\n }\n });\n\nexport const ManifestSchema = z.preprocess(omitManifestExtensions, StrictManifestSchema);\n\nexport type BuiltinAdapterId = BuiltinAdapterName;\nexport type FixtureDefinition = z.infer<typeof FixtureSchema>;\nexport type FixtureMode = (typeof FIXTURE_MODES)[number];\nexport type InboundAuthor = (typeof INBOUND_AUTHORS)[number];\nexport type ManifestDefinition = z.infer<typeof ManifestSchema>;\nexport type ProviderConfig = z.infer<typeof ProviderConfigSchema>;\nexport type ProviderPlatform = ProviderPlatformName;\n"]}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/config/schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { validateHeaderValue } from \"node:http\";\nimport { BlockList, isIP } from \"node:net\";\nimport { z } from \"zod\";\nimport { isCanonicalHttpPath } from \"../core/http-path.js\";\nimport { isValidNonceFixtureId, NONCE_FIXTURE_ID_ERROR } from \"../core/nonces.js\";\nimport { inboundRegexSafetyError } from \"../core/safe-regex.js\";\n\nexport const FIXTURE_MODES = [\"probe\", \"send\", \"roundtrip\", \"agent\"] as const;\nconst LOOPBACK_ADDRESSES = new BlockList();\nLOOPBACK_ADDRESSES.addSubnet(\"127.0.0.0\", 8, \"ipv4\");\nLOOPBACK_ADDRESSES.addAddress(\"::1\", \"ipv6\");\nLOOPBACK_ADDRESSES.addSubnet(\"::ffff:127.0.0.0\", 104, \"ipv6\");\nconst MAX_FIXTURE_RETRIES = 10;\nconst MAX_TIMER_MS = 2_147_483_647;\nconst TimerMsSchema = z\n .number()\n .int()\n .max(MAX_TIMER_MS, \"timer duration must be at most 2147483647ms\");\nexport const INBOUND_AUTHORS = [\"assistant\", \"user\", \"system\", \"any\"] as const;\nexport const INBOUND_STRATEGIES = [\"contains\", \"exact\", \"regex\"] as const;\nexport const INBOUND_NONCE_MODES = [\"contains\", \"exact\", \"ignore\"] as const;\nexport const BUILTIN_ADAPTERS = [\n \"discord\",\n \"feishu\",\n \"googlechat\",\n \"imessage\",\n \"loopback\",\n \"matrix\",\n \"mattermost\",\n \"msteams\",\n \"script\",\n \"slack\",\n \"telegram\",\n \"whatsapp\",\n \"zalo\",\n] as const;\nexport const PROVIDER_PLATFORMS = [\n \"bluebubbles\",\n \"discord\",\n \"feishu\",\n \"googlechat\",\n \"imessage\",\n \"irc\",\n \"line\",\n \"loopback\",\n \"matrix\",\n \"mattermost\",\n \"msteams\",\n \"nextcloudtalk\",\n \"nostr\",\n \"signal\",\n \"slack\",\n \"synologychat\",\n \"telegram\",\n \"tlon\",\n \"twitch\",\n \"webchat\",\n \"whatsapp\",\n \"zalo\",\n \"zalouser\",\n] as const;\n\ntype BuiltinAdapterName = (typeof BUILTIN_ADAPTERS)[number];\ntype ProviderPlatformName = (typeof PROVIDER_PLATFORMS)[number];\ntype FixtureModeConstraintInput = {\n inboundMatch: {\n nonce: (typeof INBOUND_NONCE_MODES)[number];\n pattern?: string | undefined;\n strategy: (typeof INBOUND_STRATEGIES)[number];\n };\n mode: (typeof FIXTURE_MODES)[number];\n retries: number;\n};\n\ntype FixtureModeValidationIssue = {\n message: string;\n path: [\"inboundMatch\", \"nonce\" | \"strategy\"];\n};\n\nexport function fixtureModeValidationIssue(\n value: FixtureModeConstraintInput,\n): FixtureModeValidationIssue | undefined {\n if (\n (value.mode === \"roundtrip\" || value.mode === \"agent\") &&\n value.retries > 0 &&\n value.inboundMatch.nonce === \"ignore\"\n ) {\n return {\n message: `${value.mode} mode cannot retry when inboundMatch.nonce=ignore because a late reply from an earlier attempt could be accepted`,\n path: [\"inboundMatch\", \"nonce\"],\n };\n }\n if (\n value.mode === \"agent\" &&\n value.inboundMatch.strategy === \"exact\" &&\n value.inboundMatch.pattern\n ) {\n return {\n message:\n \"agent mode cannot use inboundMatch.strategy=exact with a static pattern because replies must include the generated ACK nonce\",\n path: [\"inboundMatch\", \"strategy\"],\n };\n }\n return undefined;\n}\n\nconst HttpUrlSchema = z\n .string()\n .url()\n .refine((value) => {\n try {\n const protocol = new URL(value).protocol;\n return protocol === \"http:\" || protocol === \"https:\";\n } catch {\n return false;\n }\n }, \"URL must use http or https\");\n\nconst HttpsUrlSchema = HttpUrlSchema.refine((value) => {\n try {\n return new URL(value).protocol === \"https:\";\n } catch {\n return false;\n }\n}, \"URL must use https\");\n\nconst NonBlankSecretSchema = z\n .string()\n .min(1)\n .refine((value) => value.trim().length > 0, \"secret must not be blank\");\n\nconst HeaderValueSchema = z\n .string()\n .min(1)\n .refine((value) => value.trim().length > 0, \"secret must not be blank\")\n .refine((value) => value === value.trim(), \"secret must not contain surrounding whitespace\")\n .refine((value) => {\n try {\n validateHeaderValue(\"x-crabline-secret\", value);\n return true;\n } catch {\n return false;\n }\n }, \"secret must be a valid HTTP header value\");\n\nconst WebhookPathSchema = z\n .string()\n .min(1)\n .startsWith(\"/\", \"webhook path must start with /\")\n .refine(isCanonicalHttpPath, \"webhook path must be a canonical URL pathname\");\n\nfunction isLoopbackHost(host: string): boolean {\n const normalized = host\n .trim()\n .replace(/^\\[(.*)\\]$/u, \"$1\")\n .toLowerCase()\n .replace(/\\.$/u, \"\");\n if (normalized === \"localhost\" || normalized.endsWith(\".localhost\")) {\n return true;\n }\n const family = isIP(normalized);\n return family === 4\n ? LOOPBACK_ADDRESSES.check(normalized, \"ipv4\")\n : family === 6\n ? LOOPBACK_ADDRESSES.check(normalized, \"ipv6\")\n : false;\n}\n\nfunction inferProviderPlatform(adapter: BuiltinAdapterName): ProviderPlatformName | undefined {\n if (adapter === \"script\") {\n return undefined;\n }\n\n return adapter;\n}\n\nconst TargetSchema = z.strictObject({\n id: z.string().min(1),\n channelId: z.string().min(1).optional(),\n threadId: z.string().min(1).optional(),\n behavior: z.enum([\"agent\", \"echo\", \"sink\"]).optional(),\n metadata: z.record(z.string(), z.string()).default({}),\n});\n\nconst InboundMatchSchema = z\n .strictObject({\n author: z.enum(INBOUND_AUTHORS).default(\"assistant\"),\n nonce: z.enum(INBOUND_NONCE_MODES).default(\"contains\"),\n pattern: z.string().min(1).optional(),\n strategy: z.enum(INBOUND_STRATEGIES).default(\"contains\"),\n })\n .superRefine((value, ctx) => {\n if (value.strategy === \"exact\" && value.pattern && value.nonce !== \"ignore\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"inboundMatch.strategy=exact requires inboundMatch.nonce=ignore\",\n path: [\"nonce\"],\n });\n }\n if (value.strategy !== \"regex\" || !value.pattern) {\n return;\n }\n const safetyError = inboundRegexSafetyError(value.pattern);\n if (safetyError?.startsWith(\"must contain at most \")) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `inboundMatch.pattern ${safetyError}`,\n path: [\"pattern\"],\n });\n return;\n }\n try {\n RegExp(value.pattern, \"u\");\n } catch {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"inboundMatch.pattern must be a valid Unicode regular expression\",\n path: [\"pattern\"],\n });\n return;\n }\n if (safetyError) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `inboundMatch.pattern ${safetyError}`,\n path: [\"pattern\"],\n });\n }\n });\n\nconst ScriptCommandSchema = z\n .string()\n .min(1)\n .refine((value) => value.trim().length > 0, \"script command must not be blank\");\n\nconst ScriptCommandsSchema = z.strictObject({\n probe: ScriptCommandSchema.optional(),\n send: ScriptCommandSchema.optional(),\n waitForInbound: ScriptCommandSchema.optional(),\n watch: ScriptCommandSchema.optional(),\n});\n\nconst LoopbackConfigSchema = z.strictObject({\n delayMs: TimerMsSchema.min(0).default(25),\n});\n\nconst ScriptConfigSchema = z.strictObject({\n commands: ScriptCommandsSchema,\n cwd: z.string().min(1).optional(),\n shell: z.string().min(1).optional(),\n});\n\nconst SlackRecorderSchema = z.strictObject({\n path: z.string().min(1).optional(),\n});\n\nconst SlackWebhookSchema = z.strictObject({\n host: z.string().min(1).default(\"127.0.0.1\"),\n path: WebhookPathSchema.default(\"/slack/events\"),\n port: z.number().int().min(0).max(65_535).default(8787),\n publicUrl: HttpUrlSchema.optional(),\n});\n\nconst SlackConfigSchema = z.strictObject({\n recorder: SlackRecorderSchema.default({}),\n signingSecret: NonBlankSecretSchema.optional(),\n webhook: SlackWebhookSchema.default({\n host: \"127.0.0.1\",\n path: \"/slack/events\",\n port: 8787,\n }),\n});\n\nconst DiscordRecorderSchema = z.strictObject({\n path: z.string().min(1).optional(),\n});\n\nconst DiscordWebhookSchema = z.strictObject({\n host: z.string().min(1).default(\"127.0.0.1\"),\n path: WebhookPathSchema.default(\"/discord/interactions\"),\n port: z.number().int().min(0).max(65_535).default(8788),\n publicUrl: HttpUrlSchema.optional(),\n});\n\nconst DiscordConfigSchema = z.strictObject({\n applicationId: z.string().min(1).optional(),\n botToken: z.string().min(1).optional(),\n gatewayDurationMs: TimerMsSchema.min(1000).default(180_000),\n mentionRoleIds: z.array(z.string().min(1)).optional(),\n publicKey: z.string().min(1).optional(),\n recorder: DiscordRecorderSchema.default({}),\n webhook: DiscordWebhookSchema.default({\n host: \"127.0.0.1\",\n path: \"/discord/interactions\",\n port: 8788,\n }),\n});\n\nconst WhatsAppRecorderSchema = z.strictObject({\n path: z.string().min(1).optional(),\n});\n\nconst WhatsAppWebhookSchema = z.strictObject({\n host: z.string().min(1).default(\"127.0.0.1\"),\n path: WebhookPathSchema.default(\"/whatsapp/webhook\"),\n port: z.number().int().min(0).max(65_535).default(8789),\n publicUrl: HttpUrlSchema.optional(),\n});\n\nconst WhatsAppConfigSchema = z.strictObject({\n accessToken: z.string().min(1).optional(),\n apiUrl: HttpUrlSchema.optional(),\n apiVersion: z.string().min(1).optional(),\n appSecret: z.string().min(1).optional(),\n phoneNumberId: z.string().min(1).optional(),\n recorder: WhatsAppRecorderSchema.default({}),\n userName: z.string().min(1).optional(),\n verifyToken: z.string().min(1).optional(),\n webhook: WhatsAppWebhookSchema.default({\n host: \"127.0.0.1\",\n path: \"/whatsapp/webhook\",\n port: 8789,\n }),\n});\n\nconst MsTeamsFederatedSchema = z.strictObject({\n clientAudience: z.string().min(1).optional(),\n clientId: z.string().min(1),\n});\n\nconst MsTeamsRecorderSchema = z.strictObject({\n path: z.string().min(1).optional(),\n});\n\nconst MsTeamsWebhookSchema = z.strictObject({\n host: z.string().min(1).default(\"127.0.0.1\"),\n path: WebhookPathSchema.default(\"/msteams/webhook\"),\n port: z.number().int().min(0).max(65_535).default(8791),\n publicUrl: HttpsUrlSchema.optional(),\n});\n\nconst MsTeamsConfigSchema = z.strictObject({\n apiUrl: HttpUrlSchema.optional(),\n appId: z.string().min(1).optional(),\n appPassword: z.string().min(1).optional(),\n appTenantId: z.string().min(1).optional(),\n appType: z.enum([\"MultiTenant\", \"SingleTenant\"]).optional(),\n dialogOpenTimeoutMs: TimerMsSchema.min(0).optional(),\n federated: MsTeamsFederatedSchema.optional(),\n recorder: MsTeamsRecorderSchema.default({}),\n userName: z.string().min(1).optional(),\n webhook: MsTeamsWebhookSchema.default({\n host: \"127.0.0.1\",\n path: \"/msteams/webhook\",\n port: 8791,\n }),\n});\n\nconst GoogleChatCredentialsSchema = z\n .object({\n client_email: z.string().min(1),\n private_key: z.string().min(1),\n project_id: z.string().min(1).optional(),\n })\n .passthrough();\n\nconst GoogleChatRecorderSchema = z.strictObject({\n path: z.string().min(1).optional(),\n});\n\nconst GoogleChatWebhookSchema = z.strictObject({\n host: z.string().min(1).default(\"127.0.0.1\"),\n path: WebhookPathSchema.default(\"/googlechat/webhook\"),\n port: z.number().int().min(0).max(65_535).default(8792),\n publicUrl: HttpUrlSchema.optional(),\n});\n\nconst GoogleChatConfigSchema = z\n .strictObject({\n apiUrl: HttpUrlSchema.optional(),\n credentials: GoogleChatCredentialsSchema.optional(),\n disableSignatureVerification: z.boolean().optional(),\n endpointUrl: HttpUrlSchema.optional(),\n googleChatProjectNumber: z.string().min(1).optional(),\n impersonateUser: z.string().min(1).optional(),\n pubsubAudience: z.string().min(1).optional(),\n pubsubServiceAccountEmail: z.string().min(1).optional(),\n pubsubTopic: z.string().min(1).optional(),\n recorder: GoogleChatRecorderSchema.default({}),\n useApplicationDefaultCredentials: z.boolean().optional(),\n userName: z.string().min(1).optional(),\n webhook: GoogleChatWebhookSchema.default({\n host: \"127.0.0.1\",\n path: \"/googlechat/webhook\",\n port: 8792,\n }),\n })\n .superRefine((value, ctx) => {\n if (\n value.pubsubAudience &&\n !value.disableSignatureVerification &&\n !value.pubsubServiceAccountEmail &&\n !value.credentials?.client_email\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"pubsubAudience requires a Pub/Sub service-account identity\",\n path: [\"pubsubAudience\"],\n });\n }\n });\n\nconst TelegramLongPollingSchema = z.strictObject({\n allowedUpdates: z.array(z.string().min(1)).optional(),\n deleteWebhook: z.boolean().optional(),\n dropPendingUpdates: z.boolean().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n retryDelayMs: TimerMsSchema.min(0).optional(),\n timeout: z.number().int().min(0).optional(),\n});\n\nconst TelegramRecorderSchema = z.strictObject({\n path: z.string().min(1).optional(),\n});\n\nconst TelegramWebhookSchema = z.strictObject({\n host: z.string().min(1).default(\"127.0.0.1\"),\n path: WebhookPathSchema.default(\"/telegram/webhook\"),\n port: z.number().int().min(0).max(65_535).default(8790),\n publicUrl: HttpUrlSchema.optional(),\n});\n\nconst TelegramConfigSchema = z.strictObject({\n apiUrl: HttpUrlSchema.optional(),\n botToken: z.string().min(1).optional(),\n longPolling: TelegramLongPollingSchema.optional(),\n mode: z.enum([\"auto\", \"polling\", \"webhook\"]).default(\"auto\"),\n recorder: TelegramRecorderSchema.default({}),\n secretToken: z\n .string()\n .regex(\n /^[A-Za-z0-9_-]{1,256}(?![\\s\\S])/u,\n \"Telegram secretToken must use 1-256 letters, digits, underscores, or hyphens\",\n )\n .optional(),\n userName: z.string().min(1).optional(),\n webhook: TelegramWebhookSchema.default({\n host: \"127.0.0.1\",\n path: \"/telegram/webhook\",\n port: 8790,\n }),\n});\n\nconst FeishuConfigSchema = z.strictObject({\n appId: z.string().min(1).optional(),\n appSecret: z.string().min(1).optional(),\n encryptKey: NonBlankSecretSchema.optional(),\n recorder: z.strictObject({ path: z.string().min(1).optional() }).default({}),\n userName: z.string().min(1).optional(),\n verificationToken: NonBlankSecretSchema.optional(),\n webhook: z\n .strictObject({\n host: z.string().min(1).default(\"127.0.0.1\"),\n path: WebhookPathSchema.default(\"/feishu/webhook\"),\n port: z.number().int().min(0).max(65_535).default(8795),\n publicUrl: HttpUrlSchema.optional(),\n })\n .default({\n host: \"127.0.0.1\",\n path: \"/feishu/webhook\",\n port: 8795,\n }),\n});\n\nconst MattermostRecorderSchema = z.strictObject({\n path: z.string().min(1).optional(),\n});\n\nconst MattermostWebhookSchema = z.strictObject({\n host: z.string().min(1).default(\"127.0.0.1\"),\n path: WebhookPathSchema.default(\"/mattermost/webhook\"),\n port: z.number().int().min(0).max(65_535).default(8793),\n publicUrl: HttpUrlSchema.optional(),\n});\n\nconst MattermostWebsocketSchema = z.strictObject({\n enabled: z.boolean().optional(),\n maxReconnectDelayMs: TimerMsSchema.min(0).optional(),\n reconnectDelayMs: TimerMsSchema.min(0).optional(),\n});\n\nconst MattermostConfigSchema = z.strictObject({\n baseUrl: HttpUrlSchema.optional(),\n botToken: z.string().min(1).optional(),\n callbackUrl: HttpUrlSchema.optional(),\n recorder: MattermostRecorderSchema.default({}),\n userName: z.string().min(1).optional(),\n webhook: MattermostWebhookSchema.default({\n host: \"127.0.0.1\",\n path: \"/mattermost/webhook\",\n port: 8793,\n }),\n webhookToken: z\n .string()\n .min(1)\n .refine((value) => value.trim().length > 0, \"webhookToken must not be blank\")\n .optional(),\n websocket: MattermostWebsocketSchema.optional(),\n});\n\nconst ZaloRecorderSchema = z.strictObject({\n path: z.string().min(1).optional(),\n});\n\nconst ZaloWebhookSchema = z.strictObject({\n host: z.string().min(1).default(\"127.0.0.1\"),\n path: WebhookPathSchema.default(\"/zalo/webhook\"),\n port: z.number().int().min(0).max(65_535).default(8794),\n publicUrl: HttpUrlSchema.optional(),\n});\n\nconst ZaloConfigSchema = z.strictObject({\n botToken: HeaderValueSchema.optional(),\n recorder: ZaloRecorderSchema.default({}),\n userName: z.string().min(1).optional(),\n webhook: ZaloWebhookSchema.default({\n host: \"127.0.0.1\",\n path: \"/zalo/webhook\",\n port: 8794,\n }),\n webhookSecret: HeaderValueSchema.optional(),\n});\n\nconst MatrixAccessTokenAuthSchema = z.strictObject({\n accessToken: z.string().min(1),\n type: z.literal(\"accessToken\"),\n userID: z.string().min(1).optional(),\n});\n\nconst MatrixPasswordAuthSchema = z.strictObject({\n password: z.string().min(1),\n type: z.literal(\"password\"),\n userID: z.string().min(1).optional(),\n username: z.string().min(1),\n});\n\nconst MatrixConfigSchema = z.strictObject({\n auth: z.union([MatrixAccessTokenAuthSchema, MatrixPasswordAuthSchema]).optional(),\n baseURL: HttpUrlSchema.optional(),\n commandPrefix: z.string().min(1).optional(),\n recorder: z.strictObject({ path: z.string().min(1).optional() }).default({}),\n recoveryKey: z.string().min(1).optional(),\n roomAllowlist: z.array(z.string().min(1)).optional(),\n webhook: z\n .strictObject({\n host: z.string().min(1).default(\"127.0.0.1\"),\n path: WebhookPathSchema.default(\"/matrix/webhook\"),\n port: z.number().int().min(0).max(65_535).default(8797),\n publicUrl: HttpUrlSchema.optional(),\n })\n .default({\n host: \"127.0.0.1\",\n path: \"/matrix/webhook\",\n port: 8797,\n }),\n});\n\nconst IMessageConfigSchema = z.strictObject({\n apiKey: z.string().min(1).optional(),\n gatewayDurationMs: TimerMsSchema.min(1000).default(180_000),\n local: z.boolean().optional(),\n recorder: z.strictObject({ path: z.string().min(1).optional() }).default({}),\n serverUrl: HttpUrlSchema.optional(),\n webhook: z\n .strictObject({\n host: z.string().min(1).default(\"127.0.0.1\"),\n path: WebhookPathSchema.default(\"/imessage/webhook\"),\n port: z.number().int().min(0).max(65_535).default(8796),\n publicUrl: HttpUrlSchema.optional(),\n })\n .default({\n host: \"127.0.0.1\",\n path: \"/imessage/webhook\",\n port: 8796,\n }),\n});\n\nexport const ProviderConfigSchema = z\n .strictObject({\n adapter: z.enum(BUILTIN_ADAPTERS),\n capabilities: z.array(z.enum(FIXTURE_MODES)).default([\"probe\", \"send\", \"roundtrip\", \"agent\"]),\n discord: DiscordConfigSchema.optional(),\n env: z.array(z.string().min(1)).default([]),\n feishu: FeishuConfigSchema.optional(),\n googlechat: GoogleChatConfigSchema.optional(),\n imessage: IMessageConfigSchema.optional(),\n loopback: LoopbackConfigSchema.optional(),\n matrix: MatrixConfigSchema.optional(),\n mattermost: MattermostConfigSchema.optional(),\n msteams: MsTeamsConfigSchema.optional(),\n notes: z.string().optional(),\n platform: z.enum(PROVIDER_PLATFORMS).optional(),\n slack: SlackConfigSchema.optional(),\n script: ScriptConfigSchema.optional(),\n status: z.enum([\"active\", \"disabled\", \"planned\"]).default(\"active\"),\n telegram: TelegramConfigSchema.optional(),\n whatsapp: WhatsAppConfigSchema.optional(),\n zalo: ZaloConfigSchema.optional(),\n })\n .superRefine((value, ctx) => {\n const platform = value.platform ?? inferProviderPlatform(value.adapter);\n\n for (const adapterConfigKey of BUILTIN_ADAPTERS) {\n if (adapterConfigKey === value.adapter || value[adapterConfigKey] === undefined) {\n continue;\n }\n\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n value.adapter === \"script\"\n ? `script adapter cannot use ${adapterConfigKey} configuration; configure provider behavior through script.commands`\n : `${adapterConfigKey} configuration requires adapter=${adapterConfigKey}, got adapter=${value.adapter}`,\n path: [adapterConfigKey],\n });\n }\n\n if (value.adapter === \"script\" && !value.script) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"script adapter requires a script configuration\",\n path: [\"script\"],\n });\n }\n\n if (value.adapter === \"script\" && !value.platform) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"script adapter requires platform\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"script\" && value.status === \"active\" && value.script) {\n const requiredCommands = new Set<\"probe\" | \"send\" | \"waitForInbound\">();\n for (const capability of value.capabilities) {\n if (capability === \"probe\") {\n requiredCommands.add(\"probe\");\n }\n if (capability === \"send\" || capability === \"roundtrip\" || capability === \"agent\") {\n requiredCommands.add(\"send\");\n }\n if (capability === \"roundtrip\" || capability === \"agent\") {\n requiredCommands.add(\"waitForInbound\");\n }\n }\n\n for (const command of requiredCommands) {\n if (!value.script.commands[command]) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `active script provider requires script.commands.${command} for its declared capabilities`,\n path: [\"script\", \"commands\", command],\n });\n }\n }\n }\n\n if (value.adapter === \"loopback\" && platform !== \"loopback\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"loopback adapter must use platform=loopback\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"slack\" && platform !== \"slack\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"slack adapter must use platform=slack\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"discord\" && platform !== \"discord\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"discord adapter must use platform=discord\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"feishu\" && platform !== \"feishu\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"feishu adapter must use platform=feishu\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"googlechat\" && platform !== \"googlechat\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"googlechat adapter must use platform=googlechat\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"mattermost\" && platform !== \"mattermost\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"mattermost adapter must use platform=mattermost\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"msteams\" && platform !== \"msteams\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"msteams adapter must use platform=msteams\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"whatsapp\" && platform !== \"whatsapp\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"whatsapp adapter must use platform=whatsapp\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"telegram\" && platform !== \"telegram\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"telegram adapter must use platform=telegram\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"matrix\" && platform !== \"matrix\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"matrix adapter must use platform=matrix\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"imessage\" && platform !== \"imessage\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"imessage adapter must use platform=imessage\",\n path: [\"platform\"],\n });\n }\n\n if (value.adapter === \"zalo\" && platform !== \"zalo\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"zalo adapter must use platform=zalo\",\n path: [\"platform\"],\n });\n }\n })\n .transform((value) => ({\n ...value,\n platform: value.platform ?? inferProviderPlatform(value.adapter) ?? \"loopback\",\n }));\n\nexport const FixtureSchema = z\n .strictObject({\n accountId: z.string().min(1).optional(),\n env: z.array(z.string().min(1)).default([]),\n id: z.string().min(1).refine(isValidNonceFixtureId, NONCE_FIXTURE_ID_ERROR),\n inboundMatch: InboundMatchSchema.default({\n author: \"assistant\",\n nonce: \"contains\",\n strategy: \"contains\",\n }),\n mode: z.enum(FIXTURE_MODES),\n notes: z.string().optional(),\n provider: z.string().min(1),\n retries: z.number().int().min(0).max(MAX_FIXTURE_RETRIES).default(0),\n tags: z.array(z.string().min(1)).default([]),\n target: TargetSchema,\n timeoutMs: TimerMsSchema.min(100).default(30_000),\n })\n .superRefine((value, ctx) => {\n const validationIssue = fixtureModeValidationIssue(value);\n if (validationIssue) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: validationIssue.message,\n path: validationIssue.path,\n });\n }\n });\n\nconst MANIFEST_EXTENSION_KEY_PATTERN = /^x-[a-z0-9][a-z0-9._-]*$/u;\n\nfunction omitManifestExtensions(value: unknown): unknown {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return value;\n }\n\n const entries = Object.entries(value);\n const manifestEntries = entries.filter(([key]) => !MANIFEST_EXTENSION_KEY_PATTERN.test(key));\n return manifestEntries.length === entries.length ? value : Object.fromEntries(manifestEntries);\n}\n\nconst StrictManifestSchema = z\n .strictObject({\n configVersion: z.literal(1).default(1),\n fixtures: z.array(FixtureSchema).default([]),\n providers: z.record(z.string().min(1), ProviderConfigSchema).default({}),\n userName: z.string().min(1).default(\"crabline\"),\n })\n .superRefine((manifest, ctx) => {\n for (const [providerId, provider] of Object.entries(manifest.providers)) {\n if (provider.adapter !== \"matrix\" && provider.adapter !== \"imessage\") {\n continue;\n }\n const webhook = provider[provider.adapter]?.webhook;\n if (webhook?.publicUrl || (webhook && !isLoopbackHost(webhook.host))) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `${provider.adapter} provider ${providerId} does not support external webhook ingress`,\n path: [\"providers\", providerId, provider.adapter, \"webhook\"],\n });\n }\n }\n\n const seenFixtureIds = new Set<string>();\n for (const [index, fixture] of manifest.fixtures.entries()) {\n if (seenFixtureIds.has(fixture.id)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `duplicate fixture id: ${fixture.id}`,\n path: [\"fixtures\", index, \"id\"],\n });\n }\n seenFixtureIds.add(fixture.id);\n\n if (!Object.hasOwn(manifest.providers, fixture.provider)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `fixture ${fixture.id} references unknown provider ${fixture.provider}`,\n path: [\"fixtures\", index, \"provider\"],\n });\n continue;\n }\n\n const provider = manifest.providers[fixture.provider]!;\n if (!provider.capabilities.includes(fixture.mode)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `fixture ${fixture.id} uses mode ${fixture.mode}, but provider ${fixture.provider} declares capabilities ${provider.capabilities.join(\", \") || \"(none)\"}`,\n path: [\"fixtures\", index, \"mode\"],\n });\n }\n }\n });\n\nexport const ManifestSchema = z.preprocess(omitManifestExtensions, StrictManifestSchema);\n\nexport type BuiltinAdapterId = BuiltinAdapterName;\nexport type FixtureDefinition = z.infer<typeof FixtureSchema>;\nexport type FixtureMode = (typeof FIXTURE_MODES)[number];\nexport type InboundAuthor = (typeof INBOUND_AUTHORS)[number];\nexport type ManifestDefinition = z.infer<typeof ManifestSchema>;\nexport type ProviderConfig = z.infer<typeof ProviderConfigSchema>;\nexport type ProviderPlatform = ProviderPlatformName;\n"]}
@@ -2,6 +2,7 @@ import { type ExitCode } from "./exit-codes.js";
2
2
  export type FailureKind = "config" | "auth" | "connectivity" | "outbound" | "inbound" | "timeout" | "assertion";
3
3
  export declare class CrablineError extends Error {
4
4
  readonly exitCode: ExitCode;
5
+ readonly hasExplicitExitCode: boolean;
5
6
  readonly kind: FailureKind | undefined;
6
7
  constructor(message: string, options?: {
7
8
  cause?: unknown;
@@ -10,10 +10,12 @@ const KIND_TO_EXIT = {
10
10
  };
11
11
  export class CrablineError extends Error {
12
12
  exitCode;
13
+ hasExplicitExitCode;
13
14
  kind;
14
15
  constructor(message, options) {
15
16
  super(message, options);
16
17
  this.name = "CrablineError";
18
+ this.hasExplicitExitCode = options?.exitCode !== undefined;
17
19
  this.kind = options?.kind;
18
20
  this.exitCode =
19
21
  options?.exitCode === EXIT_CODES.SUCCESS
@@ -22,10 +24,11 @@ export class CrablineError extends Error {
22
24
  }
23
25
  }
24
26
  export function ensureErrorMessage(error) {
25
- if (error instanceof Error) {
26
- return error.message;
27
- }
28
27
  try {
28
+ if (error instanceof Error) {
29
+ const message = error.message;
30
+ return typeof message === "string" ? message : String(message);
31
+ }
29
32
  return String(error);
30
33
  }
31
34
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/core/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,iBAAiB,CAAC;AAW5D,MAAM,YAAY,GAAkC;IAClD,MAAM,EAAE,UAAU,CAAC,MAAM;IACzB,IAAI,EAAE,UAAU,CAAC,IAAI;IACrB,YAAY,EAAE,UAAU,CAAC,YAAY;IACrC,QAAQ,EAAE,UAAU,CAAC,QAAQ;IAC7B,OAAO,EAAE,UAAU,CAAC,OAAO;IAC3B,OAAO,EAAE,UAAU,CAAC,OAAO;IAC3B,SAAS,EAAE,UAAU,CAAC,SAAS;CAChC,CAAC;AAEF,MAAM,OAAO,aAAc,SAAQ,KAAK;IAC7B,QAAQ,CAAW;IACnB,IAAI,CAA0B;IAEvC,YACE,OAAe,EACf,OAAsE;QAEtE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC;QAC1B,IAAI,CAAC,QAAQ;YACX,OAAO,EAAE,QAAQ,KAAK,UAAU,CAAC,OAAO;gBACtC,CAAC,CAAC,UAAU,CAAC,OAAO;gBACpB,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IACjG,CAAC;CACF;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,eAAe,CAAC;IACzB,CAAC;AACH,CAAC","sourcesContent":["import { EXIT_CODES, type ExitCode } from \"./exit-codes.js\";\n\nexport type FailureKind =\n | \"config\"\n | \"auth\"\n | \"connectivity\"\n | \"outbound\"\n | \"inbound\"\n | \"timeout\"\n | \"assertion\";\n\nconst KIND_TO_EXIT: Record<FailureKind, ExitCode> = {\n config: EXIT_CODES.CONFIG,\n auth: EXIT_CODES.AUTH,\n connectivity: EXIT_CODES.CONNECTIVITY,\n outbound: EXIT_CODES.OUTBOUND,\n inbound: EXIT_CODES.INBOUND,\n timeout: EXIT_CODES.TIMEOUT,\n assertion: EXIT_CODES.ASSERTION,\n};\n\nexport class CrablineError extends Error {\n readonly exitCode: ExitCode;\n readonly kind: FailureKind | undefined;\n\n constructor(\n message: string,\n options?: { cause?: unknown; exitCode?: ExitCode; kind?: FailureKind },\n ) {\n super(message, options);\n this.name = \"CrablineError\";\n this.kind = options?.kind;\n this.exitCode =\n options?.exitCode === EXIT_CODES.SUCCESS\n ? EXIT_CODES.FAILURE\n : (options?.exitCode ?? (options?.kind ? KIND_TO_EXIT[options.kind] : EXIT_CODES.FAILURE));\n }\n}\n\nexport function ensureErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n try {\n return String(error);\n } catch {\n return \"Unknown error\";\n }\n}\n"]}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/core/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,iBAAiB,CAAC;AAW5D,MAAM,YAAY,GAAkC;IAClD,MAAM,EAAE,UAAU,CAAC,MAAM;IACzB,IAAI,EAAE,UAAU,CAAC,IAAI;IACrB,YAAY,EAAE,UAAU,CAAC,YAAY;IACrC,QAAQ,EAAE,UAAU,CAAC,QAAQ;IAC7B,OAAO,EAAE,UAAU,CAAC,OAAO;IAC3B,OAAO,EAAE,UAAU,CAAC,OAAO;IAC3B,SAAS,EAAE,UAAU,CAAC,SAAS;CAChC,CAAC;AAEF,MAAM,OAAO,aAAc,SAAQ,KAAK;IAC7B,QAAQ,CAAW;IACnB,mBAAmB,CAAU;IAC7B,IAAI,CAA0B;IAEvC,YACE,OAAe,EACf,OAAsE;QAEtE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,mBAAmB,GAAG,OAAO,EAAE,QAAQ,KAAK,SAAS,CAAC;QAC3D,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC;QAC1B,IAAI,CAAC,QAAQ;YACX,OAAO,EAAE,QAAQ,KAAK,UAAU,CAAC,OAAO;gBACtC,CAAC,CAAC,UAAU,CAAC,OAAO;gBACpB,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IACjG,CAAC;CACF;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,IAAI,CAAC;QACH,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAY,KAAK,CAAC,OAAO,CAAC;YACvC,OAAO,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,eAAe,CAAC;IACzB,CAAC;AACH,CAAC","sourcesContent":["import { EXIT_CODES, type ExitCode } from \"./exit-codes.js\";\n\nexport type FailureKind =\n | \"config\"\n | \"auth\"\n | \"connectivity\"\n | \"outbound\"\n | \"inbound\"\n | \"timeout\"\n | \"assertion\";\n\nconst KIND_TO_EXIT: Record<FailureKind, ExitCode> = {\n config: EXIT_CODES.CONFIG,\n auth: EXIT_CODES.AUTH,\n connectivity: EXIT_CODES.CONNECTIVITY,\n outbound: EXIT_CODES.OUTBOUND,\n inbound: EXIT_CODES.INBOUND,\n timeout: EXIT_CODES.TIMEOUT,\n assertion: EXIT_CODES.ASSERTION,\n};\n\nexport class CrablineError extends Error {\n readonly exitCode: ExitCode;\n readonly hasExplicitExitCode: boolean;\n readonly kind: FailureKind | undefined;\n\n constructor(\n message: string,\n options?: { cause?: unknown; exitCode?: ExitCode; kind?: FailureKind },\n ) {\n super(message, options);\n this.name = \"CrablineError\";\n this.hasExplicitExitCode = options?.exitCode !== undefined;\n this.kind = options?.kind;\n this.exitCode =\n options?.exitCode === EXIT_CODES.SUCCESS\n ? EXIT_CODES.FAILURE\n : (options?.exitCode ?? (options?.kind ? KIND_TO_EXIT[options.kind] : EXIT_CODES.FAILURE));\n }\n}\n\nexport function ensureErrorMessage(error: unknown): string {\n try {\n if (error instanceof Error) {\n const message: unknown = error.message;\n return typeof message === \"string\" ? message : String(message);\n }\n return String(error);\n } catch {\n return \"Unknown error\";\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function isCanonicalHttpPath(value: string): boolean;
@@ -0,0 +1,14 @@
1
+ const PATH_BASE_URL = "http://localhost";
2
+ export function isCanonicalHttpPath(value) {
3
+ try {
4
+ const url = new URL(value, PATH_BASE_URL);
5
+ return (url.origin === PATH_BASE_URL &&
6
+ url.pathname === value &&
7
+ url.search.length === 0 &&
8
+ url.hash.length === 0);
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ }
14
+ //# sourceMappingURL=http-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-path.js","sourceRoot":"","sources":["../../../src/core/http-path.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAEzC,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QAC1C,OAAO,CACL,GAAG,CAAC,MAAM,KAAK,aAAa;YAC5B,GAAG,CAAC,QAAQ,KAAK,KAAK;YACtB,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CACtB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC","sourcesContent":["const PATH_BASE_URL = \"http://localhost\";\n\nexport function isCanonicalHttpPath(value: string): boolean {\n try {\n const url = new URL(value, PATH_BASE_URL);\n return (\n url.origin === PATH_BASE_URL &&\n url.pathname === value &&\n url.search.length === 0 &&\n url.hash.length === 0\n );\n } catch {\n return false;\n }\n}\n"]}
@@ -1,2 +1,4 @@
1
1
  import type { InboundEnvelope, InboundMatchConfig } from "../providers/types.js";
2
- export declare function matchesInbound(envelope: InboundEnvelope, config: InboundMatchConfig, nonce: string): boolean;
2
+ export declare function matchesInbound(envelope: InboundEnvelope, config: InboundMatchConfig, nonce: string, options?: {
3
+ requireAcknowledgement?: boolean;
4
+ }): boolean;
@@ -1,11 +1,67 @@
1
1
  import { extractNonces } from "./nonces.js";
2
2
  import { compileInboundRegex } from "./safe-regex.js";
3
- export function matchesInbound(envelope, config, nonce) {
3
+ const EXACT_ACK_WORD = /(?<![\p{ID_Continue}\p{Mark}\p{Cf}])ACK(?![\p{ID_Continue}\p{Mark}\p{Cf}])/gu;
4
+ const ACK_SEPARATOR = /[\p{White_Space}\p{P}\p{S}]/u;
5
+ const IDENTIFIER_CONTINUATION = /[\p{ID_Continue}\p{Mark}\p{Cf}-]/u;
6
+ function characterBefore(text, offset) {
7
+ if (offset === 0) {
8
+ return undefined;
9
+ }
10
+ const previous = text.charCodeAt(offset - 1);
11
+ if (previous >= 0xdc00 && previous <= 0xdfff && offset > 1) {
12
+ const leading = text.charCodeAt(offset - 2);
13
+ if (leading >= 0xd800 && leading <= 0xdbff) {
14
+ return text.slice(offset - 2, offset);
15
+ }
16
+ }
17
+ return text[offset - 1];
18
+ }
19
+ function isCanonicalNonceOccurrence(text, offset, nonce) {
20
+ const precedingCharacter = characterBefore(text, offset);
21
+ const followingOffset = offset + nonce.length;
22
+ const followingCharacter = followingOffset < text.length
23
+ ? String.fromCodePoint(text.codePointAt(followingOffset))
24
+ : undefined;
25
+ return ((!precedingCharacter || !IDENTIFIER_CONTINUATION.test(precedingCharacter)) &&
26
+ (!followingCharacter || !IDENTIFIER_CONTINUATION.test(followingCharacter)));
27
+ }
28
+ function extractCanonicalNonces(text) {
29
+ let searchOffset = 0;
30
+ return extractNonces(text).filter((nonce) => {
31
+ const offset = text.indexOf(nonce, searchOffset);
32
+ if (offset < 0) {
33
+ return false;
34
+ }
35
+ searchOffset = offset + nonce.length;
36
+ return isCanonicalNonceOccurrence(text, offset, nonce);
37
+ });
38
+ }
39
+ function hasAcknowledgementForNonce(text, nonce) {
40
+ for (const match of text.matchAll(EXACT_ACK_WORD)) {
41
+ let offset = match.index + match[0].length;
42
+ while (offset < text.length) {
43
+ const character = String.fromCodePoint(text.codePointAt(offset));
44
+ if (!ACK_SEPARATOR.test(character)) {
45
+ break;
46
+ }
47
+ offset += character.length;
48
+ }
49
+ if (text.startsWith(nonce, offset) && isCanonicalNonceOccurrence(text, offset, nonce)) {
50
+ return true;
51
+ }
52
+ }
53
+ return false;
54
+ }
55
+ export function matchesInbound(envelope, config, nonce, options) {
4
56
  if (config.author !== "any" && envelope.author !== config.author) {
5
57
  return false;
6
58
  }
7
59
  const text = envelope.text ?? "";
8
- const extractedNonces = extractNonces(text);
60
+ const extractedNonces = extractCanonicalNonces(text);
61
+ if (options?.requireAcknowledgement &&
62
+ (!extractedNonces.includes(nonce) || !hasAcknowledgementForNonce(text, nonce))) {
63
+ return false;
64
+ }
9
65
  if (config.nonce !== "ignore") {
10
66
  if (extractedNonces.length === 0) {
11
67
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../../src/core/matcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAGtD,MAAM,UAAU,cAAc,CAC5B,QAAyB,EACzB,MAA0B,EAC1B,KAAa;IAEb,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;QACjE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;IACjC,MAAM,eAAe,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAE5C,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO,IAAI,eAAe,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;YAC7D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,KAAK,UAAU,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,IAAI,KAAK,MAAM,CAAC,OAAO,CAAC;IACjC,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC","sourcesContent":["import { extractNonces } from \"./nonces.js\";\nimport { compileInboundRegex } from \"./safe-regex.js\";\nimport type { InboundEnvelope, InboundMatchConfig } from \"../providers/types.js\";\n\nexport function matchesInbound(\n envelope: InboundEnvelope,\n config: InboundMatchConfig,\n nonce: string,\n): boolean {\n if (config.author !== \"any\" && envelope.author !== config.author) {\n return false;\n }\n\n const text = envelope.text ?? \"\";\n const extractedNonces = extractNonces(text);\n\n if (config.nonce !== \"ignore\") {\n if (extractedNonces.length === 0) {\n return false;\n }\n\n if (config.nonce === \"exact\" && extractedNonces[0] !== nonce) {\n return false;\n }\n\n if (config.nonce === \"contains\" && !extractedNonces.includes(nonce)) {\n return false;\n }\n }\n\n if (!config.pattern) {\n return true;\n }\n\n if (config.strategy === \"exact\") {\n return text === config.pattern;\n }\n\n if (config.strategy === \"regex\") {\n return compileInboundRegex(config.pattern).test(text);\n }\n\n return text.includes(config.pattern);\n}\n"]}
1
+ {"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../../src/core/matcher.ts"],"names":[],"mappings":"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","sourcesContent":["import { extractNonces } from \"./nonces.js\";\nimport { compileInboundRegex } from \"./safe-regex.js\";\nimport type { InboundEnvelope, InboundMatchConfig } from \"../providers/types.js\";\n\nconst EXACT_ACK_WORD =\n /(?<![\\p{ID_Continue}\\p{Mark}\\p{Cf}])ACK(?![\\p{ID_Continue}\\p{Mark}\\p{Cf}])/gu;\nconst ACK_SEPARATOR = /[\\p{White_Space}\\p{P}\\p{S}]/u;\nconst IDENTIFIER_CONTINUATION = /[\\p{ID_Continue}\\p{Mark}\\p{Cf}-]/u;\n\nfunction characterBefore(text: string, offset: number): string | undefined {\n if (offset === 0) {\n return undefined;\n }\n const previous = text.charCodeAt(offset - 1);\n if (previous >= 0xdc00 && previous <= 0xdfff && offset > 1) {\n const leading = text.charCodeAt(offset - 2);\n if (leading >= 0xd800 && leading <= 0xdbff) {\n return text.slice(offset - 2, offset);\n }\n }\n return text[offset - 1];\n}\n\nfunction isCanonicalNonceOccurrence(text: string, offset: number, nonce: string): boolean {\n const precedingCharacter = characterBefore(text, offset);\n const followingOffset = offset + nonce.length;\n const followingCharacter =\n followingOffset < text.length\n ? String.fromCodePoint(text.codePointAt(followingOffset)!)\n : undefined;\n return (\n (!precedingCharacter || !IDENTIFIER_CONTINUATION.test(precedingCharacter)) &&\n (!followingCharacter || !IDENTIFIER_CONTINUATION.test(followingCharacter))\n );\n}\n\nfunction extractCanonicalNonces(text: string): string[] {\n let searchOffset = 0;\n return extractNonces(text).filter((nonce) => {\n const offset = text.indexOf(nonce, searchOffset);\n if (offset < 0) {\n return false;\n }\n searchOffset = offset + nonce.length;\n return isCanonicalNonceOccurrence(text, offset, nonce);\n });\n}\n\nfunction hasAcknowledgementForNonce(text: string, nonce: string): boolean {\n for (const match of text.matchAll(EXACT_ACK_WORD)) {\n let offset = match.index + match[0].length;\n while (offset < text.length) {\n const character = String.fromCodePoint(text.codePointAt(offset)!);\n if (!ACK_SEPARATOR.test(character)) {\n break;\n }\n offset += character.length;\n }\n if (text.startsWith(nonce, offset) && isCanonicalNonceOccurrence(text, offset, nonce)) {\n return true;\n }\n }\n return false;\n}\n\nexport function matchesInbound(\n envelope: InboundEnvelope,\n config: InboundMatchConfig,\n nonce: string,\n options?: { requireAcknowledgement?: boolean },\n): boolean {\n if (config.author !== \"any\" && envelope.author !== config.author) {\n return false;\n }\n\n const text = envelope.text ?? \"\";\n const extractedNonces = extractCanonicalNonces(text);\n\n if (\n options?.requireAcknowledgement &&\n (!extractedNonces.includes(nonce) || !hasAcknowledgementForNonce(text, nonce))\n ) {\n return false;\n }\n\n if (config.nonce !== \"ignore\") {\n if (extractedNonces.length === 0) {\n return false;\n }\n\n if (config.nonce === \"exact\" && extractedNonces[0] !== nonce) {\n return false;\n }\n\n if (config.nonce === \"contains\" && !extractedNonces.includes(nonce)) {\n return false;\n }\n }\n\n if (!config.pattern) {\n return true;\n }\n\n if (config.strategy === \"exact\") {\n return text === config.pattern;\n }\n\n if (config.strategy === \"regex\") {\n return compileInboundRegex(config.pattern).test(text);\n }\n\n return text.includes(config.pattern);\n}\n"]}
@@ -1,3 +1,5 @@
1
+ export declare const NONCE_FIXTURE_ID_ERROR = "fixture id must contain only letters, numbers, and hyphens";
2
+ export declare function isValidNonceFixtureId(fixtureId: string): boolean;
1
3
  export declare function createNonce(fixtureId: string): string;
2
4
  export declare function extractNonces(text: string): string[];
3
5
  export declare function extractNonce(text: string): string | null;
@@ -1,11 +1,21 @@
1
1
  import { randomBytes } from "node:crypto";
2
+ const NONCE_ALPHABET = "a-z0-9-";
3
+ export const NONCE_FIXTURE_ID_ERROR = "fixture id must contain only letters, numbers, and hyphens";
4
+ const INVALID_NONCE_FIXTURE_ID_CHARACTER = new RegExp(`[^${NONCE_ALPHABET}]`, "i");
5
+ const NONCE_PATTERN = new RegExp(`(?<![${NONCE_ALPHABET}])mp-[${NONCE_ALPHABET}]+-[a-z0-9]+-[a-f0-9]{8}(?![${NONCE_ALPHABET}])`, "gi");
6
+ export function isValidNonceFixtureId(fixtureId) {
7
+ return fixtureId.length > 0 && !INVALID_NONCE_FIXTURE_ID_CHARACTER.test(fixtureId);
8
+ }
2
9
  export function createNonce(fixtureId) {
10
+ if (typeof fixtureId !== "string" || !isValidNonceFixtureId(fixtureId)) {
11
+ throw new TypeError(NONCE_FIXTURE_ID_ERROR);
12
+ }
3
13
  const timestamp = Date.now().toString(36);
4
14
  const entropy = randomBytes(4).toString("hex");
5
15
  return `mp-${fixtureId}-${timestamp}-${entropy}`;
6
16
  }
7
17
  export function extractNonces(text) {
8
- return text.match(/(?<![a-z0-9-])mp-[a-z0-9-]+-[a-z0-9]+-[a-f0-9]{8}(?![a-z0-9-])/gi) ?? [];
18
+ return text.match(NONCE_PATTERN) ?? [];
9
19
  }
10
20
  export function extractNonce(text) {
11
21
  return extractNonces(text)[0] ?? null;
@@ -1 +1 @@
1
- {"version":3,"file":"nonces.js","sourceRoot":"","sources":["../../../src/core/nonces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/C,OAAO,MAAM,SAAS,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,KAAK,CAAC,kEAAkE,CAAC,IAAI,EAAE,CAAC;AAC9F,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACxC,CAAC","sourcesContent":["import { randomBytes } from \"node:crypto\";\n\nexport function createNonce(fixtureId: string): string {\n const timestamp = Date.now().toString(36);\n const entropy = randomBytes(4).toString(\"hex\");\n return `mp-${fixtureId}-${timestamp}-${entropy}`;\n}\n\nexport function extractNonces(text: string): string[] {\n return text.match(/(?<![a-z0-9-])mp-[a-z0-9-]+-[a-z0-9]+-[a-f0-9]{8}(?![a-z0-9-])/gi) ?? [];\n}\n\nexport function extractNonce(text: string): string | null {\n return extractNonces(text)[0] ?? null;\n}\n"]}
1
+ {"version":3,"file":"nonces.js","sourceRoot":"","sources":["../../../src/core/nonces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,cAAc,GAAG,SAAS,CAAC;AACjC,MAAM,CAAC,MAAM,sBAAsB,GAAG,4DAA4D,CAAC;AACnG,MAAM,kCAAkC,GAAG,IAAI,MAAM,CAAC,KAAK,cAAc,GAAG,EAAE,GAAG,CAAC,CAAC;AACnF,MAAM,aAAa,GAAG,IAAI,MAAM,CAC9B,QAAQ,cAAc,SAAS,cAAc,+BAA+B,cAAc,IAAI,EAC9F,IAAI,CACL,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACrD,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,kCAAkC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/C,OAAO,MAAM,SAAS,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACxC,CAAC","sourcesContent":["import { randomBytes } from \"node:crypto\";\n\nconst NONCE_ALPHABET = \"a-z0-9-\";\nexport const NONCE_FIXTURE_ID_ERROR = \"fixture id must contain only letters, numbers, and hyphens\";\nconst INVALID_NONCE_FIXTURE_ID_CHARACTER = new RegExp(`[^${NONCE_ALPHABET}]`, \"i\");\nconst NONCE_PATTERN = new RegExp(\n `(?<![${NONCE_ALPHABET}])mp-[${NONCE_ALPHABET}]+-[a-z0-9]+-[a-f0-9]{8}(?![${NONCE_ALPHABET}])`,\n \"gi\",\n);\n\nexport function isValidNonceFixtureId(fixtureId: string): boolean {\n return fixtureId.length > 0 && !INVALID_NONCE_FIXTURE_ID_CHARACTER.test(fixtureId);\n}\n\nexport function createNonce(fixtureId: string): string {\n if (typeof fixtureId !== \"string\" || !isValidNonceFixtureId(fixtureId)) {\n throw new TypeError(NONCE_FIXTURE_ID_ERROR);\n }\n\n const timestamp = Date.now().toString(36);\n const entropy = randomBytes(4).toString(\"hex\");\n return `mp-${fixtureId}-${timestamp}-${entropy}`;\n}\n\nexport function extractNonces(text: string): string[] {\n return text.match(NONCE_PATTERN) ?? [];\n}\n\nexport function extractNonce(text: string): string | null {\n return extractNonces(text)[0] ?? null;\n}\n"]}
@@ -1,4 +1,9 @@
1
1
  import type { CommandRunResult, SuiteRunResult } from "./run.js";
2
2
  export declare function sanitizeTerminalText(value: string, singleLine?: boolean): string;
3
3
  export declare function formatRunResultText(result: CommandRunResult | SuiteRunResult): string;
4
+ export type JsonFormatResult = {
5
+ ok: boolean;
6
+ output: string;
7
+ };
8
+ export declare function formatJsonResult(result: unknown): JsonFormatResult;
4
9
  export declare function formatJson(result: unknown): string;
@@ -2,6 +2,13 @@ import pc from "picocolors";
2
2
  const BIDI_CONTROL_CODE_POINTS = new Set([
3
3
  0x061c, 0x200e, 0x200f, 0x202a, 0x202b, 0x202c, 0x202d, 0x202e, 0x2066, 0x2067, 0x2068, 0x2069,
4
4
  ]);
5
+ const UNSAFE_JSON_CODE_POINTS = /[\u007f-\u009f\u061c\u200e\u200f\u2028\u2029\u202a-\u202e\u2066-\u2069]/gu;
6
+ const JSON_SERIALIZATION_ERROR = `{
7
+ "error": {
8
+ "message": "Unable to serialize JSON output."
9
+ },
10
+ "ok": false
11
+ }`;
5
12
  export function sanitizeTerminalText(value, singleLine = false) {
6
13
  let sanitized = "";
7
14
  for (const character of value) {
@@ -31,19 +38,36 @@ export function sanitizeTerminalText(value, singleLine = false) {
31
38
  }
32
39
  export function formatRunResultText(result) {
33
40
  if ("results" in result) {
41
+ const skippedFixtureIds = result.skippedFixtureIds ?? [];
42
+ const requestedFixtureCount = result.requestedFixtureIds?.length ?? result.results.length + skippedFixtureIds.length;
43
+ const skippedSummary = skippedFixtureIds.length > 0 ? `, ${skippedFixtureIds.length} skipped` : "";
34
44
  const lines = [
35
- `${pc.bold("suite")} ${result.totalPassed}/${result.results.length} passed`,
45
+ `${pc.bold("suite")} ${result.totalPassed}/${requestedFixtureCount} passed${skippedSummary}`,
36
46
  ...result.results.flatMap((entry) => [
37
47
  formatCaseLine(entry),
38
48
  ...entry.diagnostics.flatMap(formatDiagnostic),
39
49
  ]),
50
+ ...skippedFixtureIds.map((fixtureId) => `${pc.yellow("SKIP")} ${sanitizeTerminalText(fixtureId, true)} not run`),
40
51
  ];
41
52
  return lines.join("\n");
42
53
  }
43
54
  return formatSingleResult(result);
44
55
  }
56
+ export function formatJsonResult(result) {
57
+ let serialized;
58
+ try {
59
+ serialized = JSON.stringify(result === undefined ? null : result, null, 2);
60
+ }
61
+ catch {
62
+ return { ok: false, output: JSON_SERIALIZATION_ERROR };
63
+ }
64
+ return {
65
+ ok: true,
66
+ output: (serialized ?? "null").replace(UNSAFE_JSON_CODE_POINTS, (character) => String.raw `\u${character.codePointAt(0).toString(16).padStart(4, "0")}`),
67
+ };
68
+ }
45
69
  export function formatJson(result) {
46
- return JSON.stringify(result === undefined ? null : result, null, 2) ?? "null";
70
+ return formatJsonResult(result).output;
47
71
  }
48
72
  function formatSingleResult(result) {
49
73
  const lines = [formatCaseLine(result), ...result.diagnostics.flatMap(formatDiagnostic)];
@@ -1 +1 @@
1
- {"version":3,"file":"reporters.js","sourceRoot":"","sources":["../../../src/core/reporters.ts"],"names":[],"mappings":"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","sourcesContent":["import pc from \"picocolors\";\nimport type { CommandRunResult, SuiteRunResult } from \"./run.js\";\n\nconst BIDI_CONTROL_CODE_POINTS = new Set([\n 0x061c, 0x200e, 0x200f, 0x202a, 0x202b, 0x202c, 0x202d, 0x202e, 0x2066, 0x2067, 0x2068, 0x2069,\n]);\n\nexport function sanitizeTerminalText(value: string, singleLine = false): string {\n let sanitized = \"\";\n for (const character of value) {\n const codePoint = character.codePointAt(0)!;\n if (character === \"\\n\") {\n sanitized += singleLine ? String.raw`\\n` : \"\\n\";\n } else if (character === \"\\r\") {\n sanitized += String.raw`\\r`;\n } else if (character === \"\\t\") {\n sanitized += String.raw`\\t`;\n } else if (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f)) {\n sanitized += String.raw`\\x${codePoint.toString(16).padStart(2, \"0\")}`;\n } else if (\n codePoint === 0x2028 ||\n codePoint === 0x2029 ||\n BIDI_CONTROL_CODE_POINTS.has(codePoint)\n ) {\n sanitized += String.raw`\\u${codePoint.toString(16).padStart(4, \"0\")}`;\n } else {\n sanitized += character;\n }\n }\n return sanitized;\n}\n\nexport function formatRunResultText(result: CommandRunResult | SuiteRunResult): string {\n if (\"results\" in result) {\n const lines = [\n `${pc.bold(\"suite\")} ${result.totalPassed}/${result.results.length} passed`,\n ...result.results.flatMap((entry) => [\n formatCaseLine(entry),\n ...entry.diagnostics.flatMap(formatDiagnostic),\n ]),\n ];\n return lines.join(\"\\n\");\n }\n\n return formatSingleResult(result);\n}\n\nexport function formatJson(result: unknown): string {\n return JSON.stringify(result === undefined ? null : result, null, 2) ?? \"null\";\n}\n\nfunction formatSingleResult(result: CommandRunResult): string {\n const lines = [formatCaseLine(result), ...result.diagnostics.flatMap(formatDiagnostic)];\n return lines.join(\"\\n\");\n}\n\nfunction formatDiagnostic(diagnostic: string): string[] {\n return sanitizeTerminalText(diagnostic)\n .split(\"\\n\")\n .map((line) => ` - ${line}`);\n}\n\nfunction formatCaseLine(result: CommandRunResult): string {\n const colorize = result.ok ? pc.green : result.failureKind === \"timeout\" ? pc.yellow : pc.red;\n return `${colorize(result.ok ? \"PASS\" : \"FAIL\")} ${sanitizeTerminalText(result.fixtureId, true)} ${sanitizeTerminalText(result.mode, true)} ${sanitizeTerminalText(result.providerId, true)}`;\n}\n"]}
1
+ {"version":3,"file":"reporters.js","sourceRoot":"","sources":["../../../src/core/reporters.ts"],"names":[],"mappings":"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","sourcesContent":["import pc from \"picocolors\";\nimport type { CommandRunResult, SuiteRunResult } from \"./run.js\";\n\nconst BIDI_CONTROL_CODE_POINTS = new Set([\n 0x061c, 0x200e, 0x200f, 0x202a, 0x202b, 0x202c, 0x202d, 0x202e, 0x2066, 0x2067, 0x2068, 0x2069,\n]);\n\nconst UNSAFE_JSON_CODE_POINTS =\n /[\\u007f-\\u009f\\u061c\\u200e\\u200f\\u2028\\u2029\\u202a-\\u202e\\u2066-\\u2069]/gu;\nconst JSON_SERIALIZATION_ERROR = `{\n \"error\": {\n \"message\": \"Unable to serialize JSON output.\"\n },\n \"ok\": false\n}`;\n\nexport function sanitizeTerminalText(value: string, singleLine = false): string {\n let sanitized = \"\";\n for (const character of value) {\n const codePoint = character.codePointAt(0)!;\n if (character === \"\\n\") {\n sanitized += singleLine ? String.raw`\\n` : \"\\n\";\n } else if (character === \"\\r\") {\n sanitized += String.raw`\\r`;\n } else if (character === \"\\t\") {\n sanitized += String.raw`\\t`;\n } else if (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f)) {\n sanitized += String.raw`\\x${codePoint.toString(16).padStart(2, \"0\")}`;\n } else if (\n codePoint === 0x2028 ||\n codePoint === 0x2029 ||\n BIDI_CONTROL_CODE_POINTS.has(codePoint)\n ) {\n sanitized += String.raw`\\u${codePoint.toString(16).padStart(4, \"0\")}`;\n } else {\n sanitized += character;\n }\n }\n return sanitized;\n}\n\nexport function formatRunResultText(result: CommandRunResult | SuiteRunResult): string {\n if (\"results\" in result) {\n const skippedFixtureIds = result.skippedFixtureIds ?? [];\n const requestedFixtureCount =\n result.requestedFixtureIds?.length ?? result.results.length + skippedFixtureIds.length;\n const skippedSummary =\n skippedFixtureIds.length > 0 ? `, ${skippedFixtureIds.length} skipped` : \"\";\n const lines = [\n `${pc.bold(\"suite\")} ${result.totalPassed}/${requestedFixtureCount} passed${skippedSummary}`,\n ...result.results.flatMap((entry) => [\n formatCaseLine(entry),\n ...entry.diagnostics.flatMap(formatDiagnostic),\n ]),\n ...skippedFixtureIds.map(\n (fixtureId) => `${pc.yellow(\"SKIP\")} ${sanitizeTerminalText(fixtureId, true)} not run`,\n ),\n ];\n return lines.join(\"\\n\");\n }\n\n return formatSingleResult(result);\n}\n\nexport type JsonFormatResult = {\n ok: boolean;\n output: string;\n};\n\nexport function formatJsonResult(result: unknown): JsonFormatResult {\n let serialized: string | undefined;\n try {\n serialized = JSON.stringify(result === undefined ? null : result, null, 2);\n } catch {\n return { ok: false, output: JSON_SERIALIZATION_ERROR };\n }\n return {\n ok: true,\n output: (serialized ?? \"null\").replace(\n UNSAFE_JSON_CODE_POINTS,\n (character) => String.raw`\\u${character.codePointAt(0)!.toString(16).padStart(4, \"0\")}`,\n ),\n };\n}\n\nexport function formatJson(result: unknown): string {\n return formatJsonResult(result).output;\n}\n\nfunction formatSingleResult(result: CommandRunResult): string {\n const lines = [formatCaseLine(result), ...result.diagnostics.flatMap(formatDiagnostic)];\n return lines.join(\"\\n\");\n}\n\nfunction formatDiagnostic(diagnostic: string): string[] {\n return sanitizeTerminalText(diagnostic)\n .split(\"\\n\")\n .map((line) => ` - ${line}`);\n}\n\nfunction formatCaseLine(result: CommandRunResult): string {\n const colorize = result.ok ? pc.green : result.failureKind === \"timeout\" ? pc.yellow : pc.red;\n return `${colorize(result.ok ? \"PASS\" : \"FAIL\")} ${sanitizeTerminalText(result.fixtureId, true)} ${sanitizeTerminalText(result.mode, true)} ${sanitizeTerminalText(result.providerId, true)}`;\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { type FailureKind } from "./errors.js";
2
2
  import { type ExitCode } from "./exit-codes.js";
3
- import type { ManifestDefinition } from "../config/schema.js";
3
+ import { type ManifestDefinition } from "../config/schema.js";
4
4
  import type { Registry } from "../providers/registry.js";
5
5
  export type CommandRunResult = {
6
6
  diagnostics: string[];
@@ -13,7 +13,9 @@ export type CommandRunResult = {
13
13
  providerId: string;
14
14
  };
15
15
  export type SuiteRunResult = {
16
+ requestedFixtureIds?: string[];
16
17
  results: CommandRunResult[];
18
+ skippedFixtureIds?: string[];
17
19
  totalPassed: number;
18
20
  };
19
21
  export declare function assertScriptStdinPayloadSize(payload: unknown): void;