@openclaw/crabline 0.1.9 → 0.1.10

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 (189) hide show
  1. package/README.md +47 -22
  2. package/assets/crabline-banner.svg +20 -0
  3. package/dist/src/bin/crabline.js.map +1 -1
  4. package/dist/src/cli/program.d.ts +25 -1
  5. package/dist/src/cli/program.js +579 -82
  6. package/dist/src/cli/program.js.map +1 -1
  7. package/dist/src/config/load.js +59 -6
  8. package/dist/src/config/load.js.map +1 -1
  9. package/dist/src/config/schema.d.ts +116 -92
  10. package/dist/src/config/schema.js +179 -73
  11. package/dist/src/config/schema.js.map +1 -1
  12. package/dist/src/core/errors.js +9 -2
  13. package/dist/src/core/errors.js.map +1 -1
  14. package/dist/src/core/exit-codes.js.map +1 -1
  15. package/dist/src/core/matcher.js +7 -6
  16. package/dist/src/core/matcher.js.map +1 -1
  17. package/dist/src/core/message-template.js.map +1 -1
  18. package/dist/src/core/nonces.d.ts +1 -0
  19. package/dist/src/core/nonces.js +4 -2
  20. package/dist/src/core/nonces.js.map +1 -1
  21. package/dist/src/core/reporters.d.ts +1 -0
  22. package/dist/src/core/reporters.js +42 -4
  23. package/dist/src/core/reporters.js.map +1 -1
  24. package/dist/src/core/run.d.ts +3 -0
  25. package/dist/src/core/run.js +415 -107
  26. package/dist/src/core/run.js.map +1 -1
  27. package/dist/src/core/safe-regex.d.ts +3 -0
  28. package/dist/src/core/safe-regex.js +21 -0
  29. package/dist/src/core/safe-regex.js.map +1 -0
  30. package/dist/src/index.d.ts +2 -2
  31. package/dist/src/index.js +1 -1
  32. package/dist/src/index.js.map +1 -1
  33. package/dist/src/openclaw/artifact-generation.d.ts +38 -0
  34. package/dist/src/openclaw/artifact-generation.js +314 -0
  35. package/dist/src/openclaw/artifact-generation.js.map +1 -0
  36. package/dist/src/openclaw/bridges/matrix.js +97 -12
  37. package/dist/src/openclaw/bridges/matrix.js.map +1 -1
  38. package/dist/src/openclaw/bridges/mattermost.js +32 -10
  39. package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
  40. package/dist/src/openclaw/bridges/signal.js +55 -18
  41. package/dist/src/openclaw/bridges/signal.js.map +1 -1
  42. package/dist/src/openclaw/bridges/slack.js +85 -7
  43. package/dist/src/openclaw/bridges/slack.js.map +1 -1
  44. package/dist/src/openclaw/bridges/telegram.js +124 -30
  45. package/dist/src/openclaw/bridges/telegram.js.map +1 -1
  46. package/dist/src/openclaw/bridges/whatsapp.js +78 -17
  47. package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
  48. package/dist/src/openclaw/bridges/zalo.js +14 -5
  49. package/dist/src/openclaw/bridges/zalo.js.map +1 -1
  50. package/dist/src/openclaw/outbound-contract.d.ts +5 -0
  51. package/dist/src/openclaw/outbound-contract.js +40 -0
  52. package/dist/src/openclaw/outbound-contract.js.map +1 -0
  53. package/dist/src/openclaw/private-file.d.ts +26 -0
  54. package/dist/src/openclaw/private-file.js +411 -0
  55. package/dist/src/openclaw/private-file.js.map +1 -0
  56. package/dist/src/openclaw/shared.d.ts +21 -2
  57. package/dist/src/openclaw/shared.js +115 -18
  58. package/dist/src/openclaw/shared.js.map +1 -1
  59. package/dist/src/openclaw/smoke-lock.d.ts +63 -0
  60. package/dist/src/openclaw/smoke-lock.js +949 -0
  61. package/dist/src/openclaw/smoke-lock.js.map +1 -0
  62. package/dist/src/openclaw.d.ts +16 -8
  63. package/dist/src/openclaw.js +194 -52
  64. package/dist/src/openclaw.js.map +1 -1
  65. package/dist/src/providers/builtin/discord.d.ts +10 -1
  66. package/dist/src/providers/builtin/discord.js +144 -18
  67. package/dist/src/providers/builtin/discord.js.map +1 -1
  68. package/dist/src/providers/builtin/external-webhook-auth.d.ts +11 -0
  69. package/dist/src/providers/builtin/external-webhook-auth.js +10 -0
  70. package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -0
  71. package/dist/src/providers/builtin/feishu.d.ts +19 -2
  72. package/dist/src/providers/builtin/feishu.js +307 -25
  73. package/dist/src/providers/builtin/feishu.js.map +1 -1
  74. package/dist/src/providers/builtin/googlechat.d.ts +20 -1
  75. package/dist/src/providers/builtin/googlechat.js +178 -19
  76. package/dist/src/providers/builtin/googlechat.js.map +1 -1
  77. package/dist/src/providers/builtin/imessage.d.ts +4 -0
  78. package/dist/src/providers/builtin/imessage.js +26 -11
  79. package/dist/src/providers/builtin/imessage.js.map +1 -1
  80. package/dist/src/providers/builtin/loopback.js +92 -30
  81. package/dist/src/providers/builtin/loopback.js.map +1 -1
  82. package/dist/src/providers/builtin/matrix.d.ts +11 -1
  83. package/dist/src/providers/builtin/matrix.js +53 -29
  84. package/dist/src/providers/builtin/matrix.js.map +1 -1
  85. package/dist/src/providers/builtin/mattermost.d.ts +10 -0
  86. package/dist/src/providers/builtin/mattermost.js +38 -15
  87. package/dist/src/providers/builtin/mattermost.js.map +1 -1
  88. package/dist/src/providers/builtin/msteams.d.ts +17 -1
  89. package/dist/src/providers/builtin/msteams.js +113 -14
  90. package/dist/src/providers/builtin/msteams.js.map +1 -1
  91. package/dist/src/providers/builtin/native-local-mock.d.ts +2 -9
  92. package/dist/src/providers/builtin/native-local-mock.js +12 -35
  93. package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
  94. package/dist/src/providers/builtin/script.d.ts +11 -15
  95. package/dist/src/providers/builtin/script.js +566 -104
  96. package/dist/src/providers/builtin/script.js.map +1 -1
  97. package/dist/src/providers/builtin/slack.d.ts +6 -0
  98. package/dist/src/providers/builtin/slack.js +99 -40
  99. package/dist/src/providers/builtin/slack.js.map +1 -1
  100. package/dist/src/providers/builtin/telegram.d.ts +6 -0
  101. package/dist/src/providers/builtin/telegram.js +64 -43
  102. package/dist/src/providers/builtin/telegram.js.map +1 -1
  103. package/dist/src/providers/builtin/whatsapp.d.ts +28 -8
  104. package/dist/src/providers/builtin/whatsapp.js +567 -30
  105. package/dist/src/providers/builtin/whatsapp.js.map +1 -1
  106. package/dist/src/providers/builtin/zalo.js +30 -19
  107. package/dist/src/providers/builtin/zalo.js.map +1 -1
  108. package/dist/src/providers/catalog.d.ts +3 -3
  109. package/dist/src/providers/catalog.js +3 -3
  110. package/dist/src/providers/catalog.js.map +1 -1
  111. package/dist/src/providers/local-mock.d.ts +11 -2
  112. package/dist/src/providers/local-mock.js +322 -96
  113. package/dist/src/providers/local-mock.js.map +1 -1
  114. package/dist/src/providers/native-ids.d.ts +1 -0
  115. package/dist/src/providers/native-ids.js +6 -1
  116. package/dist/src/providers/native-ids.js.map +1 -1
  117. package/dist/src/providers/recorder.d.ts +30 -2
  118. package/dist/src/providers/recorder.js +539 -70
  119. package/dist/src/providers/recorder.js.map +1 -1
  120. package/dist/src/providers/registry.d.ts +25 -1
  121. package/dist/src/providers/registry.js +280 -40
  122. package/dist/src/providers/registry.js.map +1 -1
  123. package/dist/src/providers/signed-jwt.d.ts +29 -0
  124. package/dist/src/providers/signed-jwt.js +202 -0
  125. package/dist/src/providers/signed-jwt.js.map +1 -0
  126. package/dist/src/providers/slack-ids.js.map +1 -1
  127. package/dist/src/providers/target-normalizers.d.ts +26 -0
  128. package/dist/src/providers/target-normalizers.js +276 -0
  129. package/dist/src/providers/target-normalizers.js.map +1 -0
  130. package/dist/src/providers/types.d.ts +5 -0
  131. package/dist/src/providers/types.js.map +1 -1
  132. package/dist/src/providers/webhook-server.d.ts +2 -0
  133. package/dist/src/providers/webhook-server.js +72 -25
  134. package/dist/src/providers/webhook-server.js.map +1 -1
  135. package/dist/src/servers/http.d.ts +23 -3
  136. package/dist/src/servers/http.js +213 -20
  137. package/dist/src/servers/http.js.map +1 -1
  138. package/dist/src/servers/index.js +20 -21
  139. package/dist/src/servers/index.js.map +1 -1
  140. package/dist/src/servers/matrix.js +465 -51
  141. package/dist/src/servers/matrix.js.map +1 -1
  142. package/dist/src/servers/mattermost.d.ts +5 -0
  143. package/dist/src/servers/mattermost.js +306 -58
  144. package/dist/src/servers/mattermost.js.map +1 -1
  145. package/dist/src/servers/pending-events.d.ts +2 -0
  146. package/dist/src/servers/pending-events.js +11 -0
  147. package/dist/src/servers/pending-events.js.map +1 -0
  148. package/dist/src/servers/recorder.d.ts +5 -0
  149. package/dist/src/servers/recorder.js +46 -3
  150. package/dist/src/servers/recorder.js.map +1 -1
  151. package/dist/src/servers/signal.d.ts +2 -0
  152. package/dist/src/servers/signal.js +444 -56
  153. package/dist/src/servers/signal.js.map +1 -1
  154. package/dist/src/servers/slack.d.ts +5 -0
  155. package/dist/src/servers/slack.js +515 -49
  156. package/dist/src/servers/slack.js.map +1 -1
  157. package/dist/src/servers/telegram.d.ts +111 -0
  158. package/dist/src/servers/telegram.js +811 -152
  159. package/dist/src/servers/telegram.js.map +1 -1
  160. package/dist/src/servers/webhook-target.d.ts +40 -0
  161. package/dist/src/servers/webhook-target.js +349 -0
  162. package/dist/src/servers/webhook-target.js.map +1 -0
  163. package/dist/src/servers/websocket.d.ts +2 -0
  164. package/dist/src/servers/websocket.js +29 -0
  165. package/dist/src/servers/websocket.js.map +1 -0
  166. package/dist/src/servers/whatsapp-baileys-websocket.d.ts +65 -1
  167. package/dist/src/servers/whatsapp-baileys-websocket.js +723 -99
  168. package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
  169. package/dist/src/servers/whatsapp-jid.d.ts +5 -0
  170. package/dist/src/servers/whatsapp-jid.js +32 -0
  171. package/dist/src/servers/whatsapp-jid.js.map +1 -0
  172. package/dist/src/servers/whatsapp-wire/binary-node.d.ts +5 -0
  173. package/dist/src/servers/whatsapp-wire/binary-node.js +87 -20
  174. package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
  175. package/dist/src/servers/whatsapp-wire/crypto.d.ts +6 -1
  176. package/dist/src/servers/whatsapp-wire/crypto.js +99 -45
  177. package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
  178. package/dist/src/servers/whatsapp-wire/handshake.js +39 -4
  179. package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
  180. package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
  181. package/dist/src/servers/whatsapp.d.ts +12 -7
  182. package/dist/src/servers/whatsapp.js +269 -107
  183. package/dist/src/servers/whatsapp.js.map +1 -1
  184. package/dist/src/servers/zalo.d.ts +14 -0
  185. package/dist/src/servers/zalo.js +521 -88
  186. package/dist/src/servers/zalo.js.map +1 -1
  187. package/docs/channel-setup.md +197 -19
  188. package/fixtures/examples/crabline.example.yaml +10 -0
  189. package/package.json +20 -15
package/README.md CHANGED
@@ -86,10 +86,18 @@ Provider ids are local profile names. Fixtures reference them through
86
86
  `provider`. Built-in adapters infer their platform from `adapter`; `platform` is
87
87
  required only for `adapter: script`.
88
88
 
89
- Built-in provider credentials are optional metadata only. `doctor` checks
90
- explicit `env` declarations, script command availability, and config shape; it
91
- does not require live Slack, Discord, Telegram, WhatsApp, Matrix, iMessage, or
92
- other platform secrets for local mocks.
89
+ Most built-in provider credentials are optional mock metadata. The WhatsApp
90
+ webhook requires `appSecret` and `verifyToken` because every verification or
91
+ delivery request is authenticated. `doctor` checks explicit `env` declarations,
92
+ script command availability, and config shape without requiring live platform
93
+ credentials.
94
+
95
+ When configured, Discord `publicKey`, Feishu `encryptKey`, Google Chat endpoint
96
+ or Pub/Sub identity settings, Microsoft Teams `appId`, Slack `signingSecret`,
97
+ Telegram `secretToken`, and Zalo `webhookSecret` enforce provider-native
98
+ webhook authentication. Feishu `verificationToken` remains an additional or
99
+ loopback-only callback check. Microsoft Teams also requires `appId` for
100
+ non-loopback or explicitly public webhook endpoints.
93
101
 
94
102
  ## Built-In Mock Channels
95
103
 
@@ -116,8 +124,13 @@ The built-in providers are:
116
124
  - `whatsapp`
117
125
  - `zalo`
118
126
 
119
- The `script` adapter can bridge any other OpenClaw channel by running local
120
- commands for `probe`, `send`, `waitForInbound`, or `watch`.
127
+ The `script` adapter can bridge any OpenClaw channel represented by the
128
+ configured `platform` enum by running local commands for `probe`, `send`,
129
+ `waitForInbound`, or `watch`.
130
+
131
+ Treat manifests that configure `adapter: script` as executable, trusted code:
132
+ Crabline runs their declared commands with the configured environment. Load
133
+ them only from sources you trust and review changes before use.
121
134
 
122
135
  ## Local Provider Servers
123
136
 
@@ -243,7 +256,7 @@ provided. The inbound endpoint rejects requests without the matching admin
243
256
  header (or `Authorization: Bearer <token>`).
244
257
 
245
258
  Implemented Telegram Bot API endpoints include `getMe`, `sendMessage`,
246
- `sendPhoto`, `sendDocument`, `sendVideo`, `sendAnimation`, `editMessageText`,
259
+ `sendPhoto`, `sendDocument`, `sendVideo`, `sendAudio`, `sendAnimation`, `editMessageText`,
247
260
  `deleteMessage`, `setMessageReaction`, `createForumTopic`, `editForumTopic`,
248
261
  `pinChatMessage`, `unpinChatMessage`, `getUpdates`, `deleteWebhook`,
249
262
  `setWebhook`, `setMyCommands`, `deleteMyCommands`, `sendChatAction`, and
@@ -257,31 +270,36 @@ crabline --json serve whatsapp --ready-file .crabline/whatsapp-server.json
257
270
 
258
271
  The JSON manifest contains:
259
272
 
260
- - `endpoints.apiRoot`: Crabline WhatsApp local provider API root
273
+ - `endpoints.apiRoot`: versioned WhatsApp Graph API root
274
+ - `endpoints.phoneNumberUrl`: provider-native phone-number resource
261
275
  - `endpoints.baileysWebSocketUrl`: Baileys-compatible WebSocket URL for
262
276
  `waWebSocketUrl`, including the local provider access token query parameter
263
277
  - `accessToken`: bearer token for local provider requests
264
278
  - `adminToken`: send this as the `X-Crabline-Admin-Token` header when posting
265
279
  test user messages
266
- - `selfJid`: local authenticated WhatsApp user JID
267
- - `env.CRABLINE_WHATSAPP_ACCESS_TOKEN`: same value as `accessToken`
268
- - `env.CRABLINE_WHATSAPP_API_ROOT`: same value as `endpoints.apiRoot`
269
- - `env.CRABLINE_WHATSAPP_BAILEYS_WEB_SOCKET_URL`: same value as
270
- `endpoints.baileysWebSocketUrl`
271
- - `env.CRABLINE_WHATSAPP_RECORDER_PATH`: recorder file for HTTP traffic and
272
- Baileys WebSocket stanzas
273
- - `env.CRABLINE_WHATSAPP_SELF_JID`: local authenticated WhatsApp user JID
280
+ - `selfJid`: canonical local authenticated WhatsApp user JID; legacy `@c.us`
281
+ input is normalized to `@s.whatsapp.net`
282
+ - `env.CLOUD_API_ACCESS_TOKEN`: same value as `accessToken`
283
+ - `env.CLOUD_API_VERSION`: Graph API version used by the local server
284
+ - `env.WA_BASE_URL`: local Graph API origin
285
+ - `env.WA_PHONE_NUMBER_ID`: local sender phone-number resource ID
274
286
  - `endpoints.adminInboundUrl`: authenticated POST endpoint for test user
275
287
  messages using the WhatsApp Business webhook payload shape
276
- - `endpoints.messagesUrl`: local text send endpoint for Graph-style callers
277
- - `endpoints.presenceUrl`: local presence endpoint for Graph-style callers
288
+ - `endpoints.messagesUrl`: provider-native Cloud API message and status endpoint
289
+ - `endpoints.statusUrl`: alias for the same provider-native status endpoint
278
290
  - `recorderPath`: JSONL file of local provider API/admin traffic and Baileys
279
291
  WebSocket stanzas
280
292
 
281
293
  Pass `endpoints.baileysWebSocketUrl` to Baileys as `waWebSocketUrl` when a
282
- runtime needs to connect through the local provider. The local server completes
294
+ runtime needs to connect through the local provider. Cloud API-compatible
295
+ clients can send text messages through
296
+ `POST /v25.0/<phone-number-id>/messages` with a bearer token. The local server completes
283
297
  the Baileys Noise handshake, serves bootstrap/device/prekey queries, and records
284
- encrypted outbound WebSocket stanzas. The WebSocket endpoint rejects clients
298
+ encrypted outbound WebSocket stanzas. Direct `msg` and `pkmsg` text sends are
299
+ also recorded as normalized accepted-send evidence for the OpenClaw bridge.
300
+ Group outbound uses sender-key `skmsg` encryption and is outside this supported
301
+ subset, so OpenClaw Crabline outbound targets are direct users only. Group
302
+ inbound injection remains supported. The WebSocket endpoint rejects clients
285
303
  that do not present the access token embedded in the manifest URL. The admin
286
304
  token is generated randomly unless `--admin-token <token>` is provided.
287
305
 
@@ -311,7 +329,8 @@ single-update long polling through `getUpdates`, `sendMessage`, `sendPhoto`,
311
329
  `sendChatAction`, and webhook registration, inspection, and deletion. These Bot
312
330
  API methods accept GET query parameters or POST requests. Admin
313
331
  ingress injects a native Zalo update into the active polling or webhook
314
- transport. OpenClaw-specific endpoint, config, and target mapping remain in the
332
+ transport. Webhook delivery posts the native `{ event_name, message }` update
333
+ directly. OpenClaw-specific endpoint, config, and target mapping remain in the
315
334
  isolated bridge.
316
335
 
317
336
  The admin ingress accepts JSON like:
@@ -340,6 +359,7 @@ Thread targets use the platform's native thread identifier:
340
359
 
341
360
  ```yaml
342
361
  target:
362
+ id: "C1234567890"
343
363
  channelId: "C1234567890"
344
364
  threadId: "1700000000.000100"
345
365
  ```
@@ -350,7 +370,7 @@ Examples:
350
370
  - Slack threads: `1700000000.000100`
351
371
  - Telegram chats: `-1001234567890` or `@channelusername`
352
372
  - Telegram topics: `42`
353
- - WhatsApp users: `15551234567@s.whatsapp.net`
373
+ - WhatsApp Cloud API users: digits-only `wa_id` values such as `15551234567`
354
374
  - WhatsApp groups: `120363001234567890@g.us`
355
375
  - Discord channels and threads: Discord snowflake ids such as
356
376
  `123456789012345678`
@@ -398,6 +418,11 @@ and `agent` modes, the local mock also records a deterministic assistant reply:
398
418
  live service latency, external credentials, webhooks exposed to the internet, or
399
419
  provider SDK state.
400
420
 
421
+ Recorder files remain JSONL. Individual events use one object per line; an
422
+ accepted multi-message webhook is committed as one versioned batch object so
423
+ readers never observe a partial batch. Crabline's recorder APIs flatten those
424
+ batch objects back into their individual events.
425
+
401
426
  ## More Setup Detail
402
427
 
403
428
  See [Channel Setup](docs/channel-setup.md) for the provider matrix, webhook
@@ -0,0 +1,20 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 420" role="img" aria-labelledby="title desc">
2
+ <title id="title">Crabline deterministic channel QA</title>
3
+ <desc id="desc">A coral crab crossing a cyan test waveform over a dark navy background.</desc>
4
+ <defs>
5
+ <linearGradient id="bg" x1="0" x2="1" y1="0" y2="1"><stop stop-color="#07192c"/><stop offset="1" stop-color="#102f43"/></linearGradient>
6
+ <linearGradient id="wave" x1="0" x2="1"><stop stop-color="#00e5cc"/><stop offset="1" stop-color="#ffb347"/></linearGradient>
7
+ </defs>
8
+ <rect width="1200" height="420" rx="28" fill="url(#bg)"/>
9
+ <path d="M40 300h140l35-100 45 155 48-120 44 65h160l38-88 46 118 46-75 38 45h300" fill="none" stroke="url(#wave)" stroke-linecap="round" stroke-linejoin="round" stroke-width="10" opacity=".85"/>
10
+ <g transform="translate(120 88)" fill="none" stroke="#ff6f4d" stroke-linecap="round" stroke-linejoin="round" stroke-width="12">
11
+ <path d="M85 102c-42-32-71-36-102-16m102 30c-46 0-76 15-104 48m230-62c42-32 71-36 102-16m-102 30c46 0 76 15 104 48"/>
12
+ <path d="M78 150c-32 30-44 61-35 92m192-92c32 30 44 61 35 92"/>
13
+ <ellipse cx="160" cy="122" rx="88" ry="68" fill="#ff6f4d"/>
14
+ <circle cx="126" cy="95" r="9" fill="#07192c" stroke="none"/><circle cx="194" cy="95" r="9" fill="#07192c" stroke="none"/>
15
+ <path d="M131 134c18 15 40 15 58 0"/>
16
+ </g>
17
+ <text x="470" y="145" fill="#fff" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="64" font-weight="700">crabline</text>
18
+ <text x="474" y="205" fill="#9ddbd5" font-family="ui-sans-serif, system-ui, sans-serif" font-size="26">deterministic messaging-channel QA</text>
19
+ <text x="474" y="255" fill="#ffcf86" font-family="ui-sans-serif, system-ui, sans-serif" font-size="22">local mocks · provider APIs · reproducible evidence</text>
20
+ </svg>
@@ -1 +1 @@
1
- {"version":3,"file":"crabline.js","sourceRoot":"","sources":["../../../src/bin/crabline.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5C,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;IACnB,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"crabline.js","sourceRoot":"","sources":["../../../src/bin/crabline.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5C,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;IACnB,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC9B,CAAC","sourcesContent":["#!/usr/bin/env node\n\nimport { runCli } from \"../cli/program.js\";\n\nconst exitCode = await runCli(process.argv);\nif (exitCode !== 0) {\n process.exitCode = exitCode;\n}\n"]}
@@ -1,5 +1,29 @@
1
1
  import { Command } from "commander";
2
+ import { createRegistry } from "../providers/registry.js";
3
+ import { type StartCrablineServerParams, type StartedCrablineServer } from "../servers/index.js";
2
4
  type SetExitCode = (code: number) => void;
3
- export declare function createProgram(setExitCode?: SetExitCode): Command;
5
+ export type ReadyFileIdentity = {
6
+ birthtimeNs: bigint;
7
+ ctimeNs: bigint;
8
+ dev: bigint;
9
+ ino: bigint;
10
+ size: bigint;
11
+ };
12
+ type ProgramDependencies = {
13
+ acquireReadyFileLease?: (filePath: string) => Promise<() => Promise<void>>;
14
+ createRegistry?: typeof createRegistry;
15
+ publishReadyFile?: (filePath: string, contents: string) => Promise<ReadyFileIdentity>;
16
+ removeReadyFile?: (filePath: string, expectedContents: string, expectedIdentity: ReadyFileIdentity) => Promise<void>;
17
+ startServer?: (params: StartCrablineServerParams) => Promise<StartedCrablineServer>;
18
+ };
19
+ export declare function createProgram(setExitCode?: SetExitCode, dependencies?: ProgramDependencies): Command;
20
+ type ShutdownSignal = "SIGINT" | "SIGTERM";
21
+ type SignalTarget = {
22
+ on(event: ShutdownSignal, listener: () => void): unknown;
23
+ removeListener(event: ShutdownSignal, listener: () => void): unknown;
24
+ };
25
+ export declare function publishReadyFile(filePath: string, contents: string): Promise<ReadyFileIdentity>;
26
+ export declare function removeReadyFile(filePath: string, expectedContents: string, expectedIdentity: ReadyFileIdentity): Promise<void>;
27
+ export declare function waitForShutdown(close: () => Promise<void>, signalTarget?: SignalTarget): Promise<void>;
4
28
  export declare function runCli(argv: string[]): Promise<number>;
5
29
  export {};