@openclaw/crabline 0.1.9 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -22
- package/assets/crabline-banner.svg +20 -0
- package/dist/src/bin/crabline.js.map +1 -1
- package/dist/src/cli/program.d.ts +25 -1
- package/dist/src/cli/program.js +579 -82
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/config/load.js +59 -6
- package/dist/src/config/load.js.map +1 -1
- package/dist/src/config/schema.d.ts +116 -92
- package/dist/src/config/schema.js +179 -73
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/core/errors.js +9 -2
- package/dist/src/core/errors.js.map +1 -1
- package/dist/src/core/exit-codes.js.map +1 -1
- package/dist/src/core/matcher.js +7 -6
- package/dist/src/core/matcher.js.map +1 -1
- package/dist/src/core/message-template.js.map +1 -1
- package/dist/src/core/nonces.d.ts +1 -0
- package/dist/src/core/nonces.js +4 -2
- package/dist/src/core/nonces.js.map +1 -1
- package/dist/src/core/reporters.d.ts +1 -0
- package/dist/src/core/reporters.js +42 -4
- package/dist/src/core/reporters.js.map +1 -1
- package/dist/src/core/run.d.ts +3 -0
- package/dist/src/core/run.js +415 -107
- package/dist/src/core/run.js.map +1 -1
- package/dist/src/core/safe-regex.d.ts +3 -0
- package/dist/src/core/safe-regex.js +21 -0
- package/dist/src/core/safe-regex.js.map +1 -0
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/openclaw/artifact-generation.d.ts +43 -0
- package/dist/src/openclaw/artifact-generation.js +363 -0
- package/dist/src/openclaw/artifact-generation.js.map +1 -0
- package/dist/src/openclaw/bridges/matrix.js +97 -12
- package/dist/src/openclaw/bridges/matrix.js.map +1 -1
- package/dist/src/openclaw/bridges/mattermost.js +32 -10
- package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
- package/dist/src/openclaw/bridges/signal.js +55 -18
- package/dist/src/openclaw/bridges/signal.js.map +1 -1
- package/dist/src/openclaw/bridges/slack.js +85 -7
- package/dist/src/openclaw/bridges/slack.js.map +1 -1
- package/dist/src/openclaw/bridges/telegram.js +124 -30
- package/dist/src/openclaw/bridges/telegram.js.map +1 -1
- package/dist/src/openclaw/bridges/whatsapp.js +78 -17
- package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
- package/dist/src/openclaw/bridges/zalo.js +14 -5
- package/dist/src/openclaw/bridges/zalo.js.map +1 -1
- package/dist/src/openclaw/outbound-contract.d.ts +5 -0
- package/dist/src/openclaw/outbound-contract.js +40 -0
- package/dist/src/openclaw/outbound-contract.js.map +1 -0
- package/dist/src/openclaw/private-file.d.ts +28 -0
- package/dist/src/openclaw/private-file.js +465 -0
- package/dist/src/openclaw/private-file.js.map +1 -0
- package/dist/src/openclaw/shared.d.ts +21 -2
- package/dist/src/openclaw/shared.js +115 -18
- package/dist/src/openclaw/shared.js.map +1 -1
- package/dist/src/openclaw/smoke-lock.d.ts +63 -0
- package/dist/src/openclaw/smoke-lock.js +1004 -0
- package/dist/src/openclaw/smoke-lock.js.map +1 -0
- package/dist/src/openclaw.d.ts +16 -8
- package/dist/src/openclaw.js +334 -52
- package/dist/src/openclaw.js.map +1 -1
- package/dist/src/providers/builtin/discord.d.ts +10 -1
- package/dist/src/providers/builtin/discord.js +144 -18
- package/dist/src/providers/builtin/discord.js.map +1 -1
- package/dist/src/providers/builtin/external-webhook-auth.d.ts +11 -0
- package/dist/src/providers/builtin/external-webhook-auth.js +10 -0
- package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -0
- package/dist/src/providers/builtin/feishu.d.ts +19 -2
- package/dist/src/providers/builtin/feishu.js +307 -25
- package/dist/src/providers/builtin/feishu.js.map +1 -1
- package/dist/src/providers/builtin/googlechat.d.ts +20 -1
- package/dist/src/providers/builtin/googlechat.js +178 -19
- package/dist/src/providers/builtin/googlechat.js.map +1 -1
- package/dist/src/providers/builtin/imessage.d.ts +4 -0
- package/dist/src/providers/builtin/imessage.js +26 -11
- package/dist/src/providers/builtin/imessage.js.map +1 -1
- package/dist/src/providers/builtin/loopback.js +92 -30
- package/dist/src/providers/builtin/loopback.js.map +1 -1
- package/dist/src/providers/builtin/matrix.d.ts +11 -1
- package/dist/src/providers/builtin/matrix.js +53 -29
- package/dist/src/providers/builtin/matrix.js.map +1 -1
- package/dist/src/providers/builtin/mattermost.d.ts +10 -0
- package/dist/src/providers/builtin/mattermost.js +38 -15
- package/dist/src/providers/builtin/mattermost.js.map +1 -1
- package/dist/src/providers/builtin/msteams.d.ts +17 -1
- package/dist/src/providers/builtin/msteams.js +113 -14
- package/dist/src/providers/builtin/msteams.js.map +1 -1
- package/dist/src/providers/builtin/native-local-mock.d.ts +2 -9
- package/dist/src/providers/builtin/native-local-mock.js +12 -35
- package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
- package/dist/src/providers/builtin/script.d.ts +11 -15
- package/dist/src/providers/builtin/script.js +566 -104
- package/dist/src/providers/builtin/script.js.map +1 -1
- package/dist/src/providers/builtin/slack.d.ts +6 -0
- package/dist/src/providers/builtin/slack.js +99 -40
- package/dist/src/providers/builtin/slack.js.map +1 -1
- package/dist/src/providers/builtin/telegram.d.ts +6 -0
- package/dist/src/providers/builtin/telegram.js +64 -43
- package/dist/src/providers/builtin/telegram.js.map +1 -1
- package/dist/src/providers/builtin/whatsapp.d.ts +28 -8
- package/dist/src/providers/builtin/whatsapp.js +567 -30
- package/dist/src/providers/builtin/whatsapp.js.map +1 -1
- package/dist/src/providers/builtin/zalo.js +30 -19
- package/dist/src/providers/builtin/zalo.js.map +1 -1
- package/dist/src/providers/catalog.d.ts +3 -3
- package/dist/src/providers/catalog.js +3 -3
- package/dist/src/providers/catalog.js.map +1 -1
- package/dist/src/providers/local-mock.d.ts +11 -2
- package/dist/src/providers/local-mock.js +322 -96
- package/dist/src/providers/local-mock.js.map +1 -1
- package/dist/src/providers/native-ids.d.ts +1 -0
- package/dist/src/providers/native-ids.js +6 -1
- package/dist/src/providers/native-ids.js.map +1 -1
- package/dist/src/providers/recorder.d.ts +30 -2
- package/dist/src/providers/recorder.js +549 -70
- package/dist/src/providers/recorder.js.map +1 -1
- package/dist/src/providers/registry.d.ts +25 -1
- package/dist/src/providers/registry.js +280 -40
- package/dist/src/providers/registry.js.map +1 -1
- package/dist/src/providers/signed-jwt.d.ts +29 -0
- package/dist/src/providers/signed-jwt.js +202 -0
- package/dist/src/providers/signed-jwt.js.map +1 -0
- package/dist/src/providers/slack-ids.js.map +1 -1
- package/dist/src/providers/target-normalizers.d.ts +26 -0
- package/dist/src/providers/target-normalizers.js +276 -0
- package/dist/src/providers/target-normalizers.js.map +1 -0
- package/dist/src/providers/types.d.ts +5 -0
- package/dist/src/providers/types.js.map +1 -1
- package/dist/src/providers/webhook-server.d.ts +2 -0
- package/dist/src/providers/webhook-server.js +72 -25
- package/dist/src/providers/webhook-server.js.map +1 -1
- package/dist/src/servers/http.d.ts +23 -3
- package/dist/src/servers/http.js +213 -20
- package/dist/src/servers/http.js.map +1 -1
- package/dist/src/servers/index.js +20 -21
- package/dist/src/servers/index.js.map +1 -1
- package/dist/src/servers/matrix.js +465 -51
- package/dist/src/servers/matrix.js.map +1 -1
- package/dist/src/servers/mattermost.d.ts +5 -0
- package/dist/src/servers/mattermost.js +306 -58
- package/dist/src/servers/mattermost.js.map +1 -1
- package/dist/src/servers/pending-events.d.ts +2 -0
- package/dist/src/servers/pending-events.js +11 -0
- package/dist/src/servers/pending-events.js.map +1 -0
- package/dist/src/servers/recorder.d.ts +5 -0
- package/dist/src/servers/recorder.js +262 -3
- package/dist/src/servers/recorder.js.map +1 -1
- package/dist/src/servers/signal.d.ts +2 -0
- package/dist/src/servers/signal.js +444 -56
- package/dist/src/servers/signal.js.map +1 -1
- package/dist/src/servers/slack.d.ts +5 -0
- package/dist/src/servers/slack.js +515 -49
- package/dist/src/servers/slack.js.map +1 -1
- package/dist/src/servers/telegram.d.ts +111 -0
- package/dist/src/servers/telegram.js +830 -158
- package/dist/src/servers/telegram.js.map +1 -1
- package/dist/src/servers/webhook-target.d.ts +40 -0
- package/dist/src/servers/webhook-target.js +349 -0
- package/dist/src/servers/webhook-target.js.map +1 -0
- package/dist/src/servers/websocket.d.ts +2 -0
- package/dist/src/servers/websocket.js +29 -0
- package/dist/src/servers/websocket.js.map +1 -0
- package/dist/src/servers/whatsapp-baileys-websocket.d.ts +65 -1
- package/dist/src/servers/whatsapp-baileys-websocket.js +723 -99
- package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
- package/dist/src/servers/whatsapp-jid.d.ts +5 -0
- package/dist/src/servers/whatsapp-jid.js +32 -0
- package/dist/src/servers/whatsapp-jid.js.map +1 -0
- package/dist/src/servers/whatsapp-wire/binary-node.d.ts +5 -0
- package/dist/src/servers/whatsapp-wire/binary-node.js +87 -20
- package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/crypto.d.ts +6 -1
- package/dist/src/servers/whatsapp-wire/crypto.js +99 -45
- package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/handshake.js +39 -4
- package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
- package/dist/src/servers/whatsapp.d.ts +12 -7
- package/dist/src/servers/whatsapp.js +269 -107
- package/dist/src/servers/whatsapp.js.map +1 -1
- package/dist/src/servers/zalo.d.ts +14 -0
- package/dist/src/servers/zalo.js +521 -88
- package/dist/src/servers/zalo.js.map +1 -1
- package/docs/channel-setup.md +197 -19
- package/fixtures/examples/crabline.example.yaml +10 -0
- package/package.json +20 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"script.js","sourceRoot":"","sources":["../../../../src/providers/builtin/script.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAyCzE,SAAS,SAAS,CAAI,OAAe,EAAE,OAAgB,EAAE,GAAY,EAAE,KAAc;IACnF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE;YAC3B,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YAC5C,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,KAAK,IAAI,IAAI;YACpB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAChC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAChC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,MAAM,CACJ,IAAI,aAAa,CACf,0BAA0B,OAAO,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,EACtE;oBACE,IAAI,EAAE,cAAc;iBACrB,CACF,CACF,CAAC;gBACF,OAAO;YACT,CAAC;YAED,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAM,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CACJ,IAAI,aAAa,CACf,6CAA6C,OAAO,KAAK,kBAAkB,CAAC,KAAK,CAAC,EAAE,EACpF,EAAE,IAAI,EAAE,QAAQ,EAAE,CACnB,CACF,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,OAAO,qBAAqB;IACvB,EAAE,CAAC;IACH,QAAQ,CAAC;IACT,MAAM,GAAG,QAAiB,CAAC;IAC3B,QAAQ,CAAC;IACT,OAAO,CAAC;IAEjB,YAAY,OAAwB;QAClC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,aAAa,CAAC,aAAa,OAAO,CAAC,UAAU,oCAAoC,EAAE;gBAC3F,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;IACvC,CAAC;IAED,eAAe,CAAC,MAA4C;QAC1D,MAAM,UAAU,GAAG;YACjB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,QAAQ,EAAE,MAAM,CAAC,QAAQ;SACwB,CAAC;QACpD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,UAAU,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAC1C,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,UAAU,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACxC,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAwB;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,8BAA8B,CAAC;gBACzC,OAAO,EAAE,KAAK;aACf,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAC5B,OAAO,EACP,aAAa,CAAC,OAAO,CAAC,EACtB,IAAI,CAAC,OAAO,CAAC,GAAG,EAChB,IAAI,CAAC,OAAO,CAAC,KAAK,CACnB,CAAC;QACF,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;YAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,aAAa,CAAC,aAAa,IAAI,CAAC,EAAE,4BAA4B,EAAE;gBACxE,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC;QAED,OAAO,SAAS,CACd,OAAO,EACP;YACE,GAAG,aAAa,CAAC,OAAO,CAAC;YACzB,QAAQ,EAAE;gBACR,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;gBACpD,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB;SACF,EACD,IAAI,CAAC,OAAO,CAAC,GAAG,EAChB,IAAI,CAAC,OAAO,CAAC,KAAK,CACnB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAoB;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;QACrD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAC5B,OAAO,EACP;YACE,GAAG,aAAa,CAAC,OAAO,CAAC;YACzB,IAAI,EAAE;gBACJ,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;gBACpD,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B;SACF,EACD,IAAI,CAAC,OAAO,CAAC,GAAG,EAChB,IAAI,CAAC,OAAO,CAAC,KAAK,CACnB,CAAC;QAEF,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,GAAG,MAAM,CAAC,OAAO;YACjB,QAAQ,EAAE,IAAI,CAAC,EAAE;SAClB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,CAAC,KAAK,CAAC,OAAqB;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,aAAa,CAAC,aAAa,IAAI,CAAC,EAAE,6BAA6B,EAAE;gBACzE,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE;YAC3B,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACtE,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI;YACjC,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;YACtC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC;SACnC,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,CAAC,GAAG,CACb,IAAI,CAAC,SAAS,CAAC;YACb,GAAG,aAAa,CAAC,OAAO,CAAC;YACzB,KAAK,EAAE;gBACL,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;aACrD;SACF,CAAC,CACH,CAAC;QAEF,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,MAAM,WAAW,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAChD,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;gBACzD,OAAO,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACvC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;gBACxB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;wBACjB,SAAS;oBACX,CAAC;oBACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmC,CAAC;oBAClE,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,SAAS;oBACX,CAAC;oBACD,MAAM;wBACJ,GAAG,MAAM;wBACT,QAAQ,EAAE,IAAI,CAAC,EAAE;qBAClB,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBAClB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAmC,CAAC;gBACpE,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM;wBACJ,GAAG,MAAM;wBACT,QAAQ,EAAE,IAAI,CAAC,EAAE;qBAClB,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACtB,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;gBACzD,KAAK,CAAC,IAAI,EAAE,CAAC;gBACb,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;oBAC9C,IAAI,CAAC;wBACH,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;oBACtC,CAAC;oBAAC,MAAM,CAAC;wBACP,4DAA4D;oBAC9D,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,WAAW,CAAC;QACpB,CAAC;IACH,CAAC;CACF;AAED,SAAS,aAAa,CAAC,OAAwB;IAC7C,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,QAAQ,EAAE;YACR,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,EAAE,EAAE,OAAO,CAAC,UAAU;YACtB,YAAY,EAAE,OAAO,CAAC,YAAY;SACnC;KACF,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"script.js","sourceRoot":"","sources":["../../../../src/providers/builtin/script.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn, type ChildProcess, type ChildProcessByStdio } from \"node:child_process\";\nimport path from \"node:path\";\nimport type { Readable, Writable } from \"node:stream\";\nimport { z } from \"zod\";\nimport { CrablineError, ensureErrorMessage } from \"../../core/errors.js\";\nimport type {\n InboundEnvelope,\n ProviderAdapter,\n ProviderContext,\n SendContext,\n WaitContext,\n WatchContext,\n} from \"../types.js\";\n\nconst MAX_SCRIPT_OUTPUT_BYTES = 1024 * 1024;\nconst SCRIPT_WAIT_EXIT_GRACE_MS = 250;\nconst WINDOWS_TERMINATION_TIMEOUT_MS = 5_000;\n\ntype ScriptWatchIterator = AsyncIterableIterator<InboundEnvelope> & {\n [Symbol.asyncIterator](): ScriptWatchIterator;\n return(): Promise<IteratorResult<InboundEnvelope, undefined>>;\n throw(error?: unknown): Promise<IteratorResult<InboundEnvelope, undefined>>;\n};\n\ntype ScriptPayload = {\n fixture: ProviderContext[\"fixture\"];\n provider: {\n config: ProviderContext[\"config\"];\n id: string;\n manifestPath: string;\n };\n};\n\ntype ScriptDiagnosticsSnapshot = {\n configuredCommands: string[];\n sensitiveEnvironmentValues: string[];\n sensitivePayloadValues: string[];\n};\n\ntype SpawnedScriptChild = ChildProcessByStdio<Writable, Readable, Readable>;\n\nconst ScriptMessageSchema = z.object({\n author: z.enum([\"assistant\", \"system\", \"user\"]),\n id: z.string().min(1),\n raw: z.unknown().optional(),\n sentAt: z.string().min(1),\n text: z.string(),\n threadId: z.string().min(1),\n});\n\nconst ScriptProbeResultSchema = z.object({\n details: z.array(z.string()).optional(),\n healthy: z.boolean(),\n});\n\nconst ScriptSendResultSchema = z.object({\n accepted: z.boolean(),\n messageId: z.string().min(1),\n threadId: z.string().min(1),\n});\n\nconst ScriptInboundResultSchema = z\n .object({\n message: ScriptMessageSchema.optional(),\n timeout: z.boolean().optional(),\n })\n .refine(\n (result) =>\n (result.timeout === true && result.message === undefined) ||\n (result.timeout !== true && result.message !== undefined),\n { message: \"result must contain either a message or timeout: true\" },\n );\n\nasync function terminateChild(child: ChildProcess): Promise<void> {\n if (process.platform === \"win32\" && child.pid) {\n await new Promise<void>((resolve) => {\n let taskkill: ChildProcess;\n try {\n taskkill = spawn(\"taskkill.exe\", [\"/PID\", String(child.pid), \"/T\", \"/F\"], {\n stdio: \"ignore\",\n windowsHide: true,\n });\n } catch {\n resolve();\n return;\n }\n let settled = false;\n const finish = () => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeout);\n resolve();\n };\n const timeout = setTimeout(() => {\n taskkill.kill(\"SIGKILL\");\n finish();\n }, WINDOWS_TERMINATION_TIMEOUT_MS);\n timeout.unref();\n taskkill.once(\"close\", finish);\n taskkill.once(\"error\", finish);\n });\n } else if (child.pid) {\n try {\n process.kill(-child.pid, \"SIGKILL\");\n } catch {\n // The process group may have exited with the shell.\n }\n }\n\n if (child.exitCode === null && child.signalCode === null) {\n child.kill(\"SIGKILL\");\n }\n}\n\nfunction formatValidationError(error: z.ZodError): string {\n return error.issues\n .map((issue) => `${issue.path.length > 0 ? issue.path.join(\".\") : \"result\"}: ${issue.message}`)\n .join(\"; \");\n}\n\nconst sensitiveEnvironmentNameFragmentPattern =\n /(?:AUTH|BEARER|CREDENTIAL|KEY|PASS|PRIVATE|SECRET|TOKEN)/iu;\nconst nonSensitiveWorkingDirectoryNames = new Set([\"PWD\", \"OLDPWD\"]);\n\nfunction isSensitiveEnvironmentName(name: string): boolean {\n const upperName = name.toUpperCase();\n return (\n sensitiveEnvironmentNameFragmentPattern.test(upperName) ||\n (!nonSensitiveWorkingDirectoryNames.has(upperName) && upperName.includes(\"PWD\")) ||\n /PAT(?!H)/u.test(upperName)\n );\n}\n\nfunction commandContainsSensitiveValue(command: string): boolean {\n const assignments = [\n ...command.matchAll(/(?:^|[\\s;&|])[\"']?([A-Za-z_][A-Za-z0-9_]*)\\s*\\+?=/gu),\n ...command.matchAll(/\\$env:([A-Za-z_][A-Za-z0-9_]*)\\s*\\+?=/giu),\n ...command.matchAll(/\\$\\{env:([A-Za-z_][A-Za-z0-9_]*)\\}\\s*\\+?=/giu),\n ];\n if (assignments.some((match) => isSensitiveEnvironmentName(match[1] ?? \"\"))) {\n return true;\n }\n return [...command.matchAll(/(?:^|[\\s;&|])[\"']?--([A-Za-z0-9][A-Za-z0-9_-]*)(?:=|\\s)/gu)].some(\n (match) => isSensitiveEnvironmentName((match[1] ?? \"\").replaceAll(\"-\", \"_\")),\n );\n}\n\nfunction snapshotSensitiveEnvironmentValues(): string[] {\n const representations = new Set<string>();\n const values = Object.entries(process.env)\n .filter(\n ([name, value]) =>\n isSensitiveEnvironmentName(name) && value !== undefined && value.length > 0,\n )\n .map(([, value]) => value!)\n .sort((left, right) => right.length - left.length);\n for (const value of values) {\n representations.add(value);\n representations.add(JSON.stringify(value));\n representations.add(JSON.stringify(value).slice(1, -1));\n }\n return [...representations].sort((left, right) => right.length - left.length);\n}\n\nfunction redactSensitiveEnvironmentValues(\n detail: string,\n sensitiveEnvironmentValues: string[],\n): string {\n let redacted = detail;\n for (const representation of sensitiveEnvironmentValues) {\n redacted = redacted.split(representation).join(\"[redacted environment value]\");\n }\n return redacted;\n}\n\nfunction collectSensitivePayloadValues(\n value: unknown,\n values: Set<string>,\n seen: { nonSensitive: WeakSet<object>; sensitive: WeakSet<object> },\n sensitive = false,\n): void {\n if (typeof value === \"string\") {\n if (sensitive && value.length > 0) {\n values.add(value);\n const serialized = JSON.stringify(value);\n values.add(serialized);\n values.add(serialized.slice(1, -1));\n }\n return;\n }\n if (sensitive && typeof value === \"number\" && Number.isFinite(value)) {\n values.add(String(value));\n return;\n }\n if (!value || typeof value !== \"object\") {\n return;\n }\n const visited = sensitive ? seen.sensitive : seen.nonSensitive;\n if (visited.has(value)) {\n return;\n }\n visited.add(value);\n if (Array.isArray(value)) {\n for (const entry of value) {\n collectSensitivePayloadValues(entry, values, seen, sensitive);\n }\n return;\n }\n for (const [name, entry] of Object.entries(value)) {\n collectSensitivePayloadValues(\n entry,\n values,\n seen,\n sensitive || isSensitiveEnvironmentName(name),\n );\n }\n}\n\nfunction snapshotSensitivePayloadValues(payload: unknown): string[] {\n const values = new Set<string>();\n collectSensitivePayloadValues(payload, values, {\n nonSensitive: new WeakSet(),\n sensitive: new WeakSet(),\n });\n return [...values].sort((left, right) => right.length - left.length);\n}\n\nfunction redactSensitivePayloadValues(detail: string, sensitivePayloadValues: string[]): string {\n let redacted = detail;\n for (const value of sensitivePayloadValues) {\n redacted = redacted.split(value).join(\"[redacted configured value]\");\n }\n return redacted;\n}\n\nfunction formatScriptError(\n summary: string,\n detail: string,\n command: string,\n diagnostics: ScriptDiagnosticsSnapshot,\n): string {\n if (!detail.trim()) {\n return summary;\n }\n if (commandContainsSensitiveValue(command)) {\n return `${summary}\\n[script diagnostics redacted]`;\n }\n let redacted = redactSensitivePayloadValues(\n redactSensitiveEnvironmentValues(detail, diagnostics.sensitiveEnvironmentValues),\n diagnostics.sensitivePayloadValues,\n );\n for (const configuredCommand of diagnostics.configuredCommands) {\n redacted = redacted.split(configuredCommand).join(\"[configured script command]\");\n }\n redacted = redacted.trim();\n return redacted ? `${summary}\\n${redacted}` : summary;\n}\n\nfunction createScriptDiagnosticsSnapshot(\n command: string,\n serializedPayload: string,\n): ScriptDiagnosticsSnapshot {\n const payload = JSON.parse(serializedPayload) as unknown;\n const configuredCommands = new Set([command]);\n const commands = (\n payload as {\n provider?: { config?: { script?: { commands?: Record<string, unknown> } } };\n }\n ).provider?.config?.script?.commands;\n for (const configuredCommand of Object.values(commands ?? {})) {\n if (typeof configuredCommand === \"string\" && configuredCommand.length > 0) {\n configuredCommands.add(configuredCommand);\n }\n }\n return {\n configuredCommands: [...configuredCommands].sort((left, right) => right.length - left.length),\n sensitiveEnvironmentValues: snapshotSensitiveEnvironmentValues(),\n sensitivePayloadValues: snapshotSensitivePayloadValues(payload),\n };\n}\n\nfunction parseScriptJson<T>(params: {\n command: string;\n diagnostics: ScriptDiagnosticsSnapshot;\n output: string;\n schema: z.ZodType<T>;\n}): T {\n let parsed: unknown;\n try {\n parsed = JSON.parse(params.output);\n } catch (error) {\n throw new CrablineError(\n formatScriptError(\n \"Script command did not return valid JSON.\",\n ensureErrorMessage(error),\n params.command,\n params.diagnostics,\n ),\n { kind: \"config\" },\n );\n }\n\n const result = params.schema.safeParse(parsed);\n if (!result.success) {\n throw new CrablineError(\n `Script command returned invalid result.\\n${formatValidationError(result.error)}`,\n { kind: \"config\" },\n );\n }\n return result.data;\n}\n\nfunction runScript<T>(params: {\n acceptResultDuringTimeoutGrace?: ((result: T) => boolean) | undefined;\n command: string;\n cwd?: string | undefined;\n payload: unknown;\n schema: z.ZodType<T>;\n shell?: string | undefined;\n signal?: AbortSignal | undefined;\n timeoutGraceMs?: number | undefined;\n timeoutMs: number;\n}): Promise<T> {\n if (params.signal?.aborted) {\n return Promise.reject(params.signal.reason ?? new Error(\"Script command aborted.\"));\n }\n const serializedPayload = JSON.stringify(params.payload);\n const diagnostics = createScriptDiagnosticsSnapshot(params.command, serializedPayload);\n return new Promise((resolve, reject) => {\n let child: SpawnedScriptChild;\n try {\n child = spawn(params.command, {\n cwd: params.cwd ? path.resolve(params.cwd) : process.cwd(),\n env: process.env,\n shell: params.shell ?? true,\n detached: process.platform !== \"win32\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n } catch (error) {\n reject(\n new CrablineError(\n formatScriptError(\n \"Script command failed to start.\",\n ensureErrorMessage(error),\n params.command,\n diagnostics,\n ),\n { kind: \"connectivity\" },\n ),\n );\n return;\n }\n\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n let deadlineExceeded = false;\n let outputBytes = 0;\n let settled = false;\n let timeoutGrace: NodeJS.Timeout | undefined;\n const abort = () => {\n finish(async () => {\n await terminateChild(child);\n reject(params.signal?.reason ?? new Error(\"Script command aborted.\"));\n });\n };\n\n const finish = (callback: () => Promise<void> | void) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeout);\n clearTimeout(timeoutGrace);\n params.signal?.removeEventListener(\"abort\", abort);\n void callback();\n };\n\n const failForOutputLimit = () => {\n finish(async () => {\n await terminateChild(child);\n reject(\n new CrablineError(`Script command exceeded ${MAX_SCRIPT_OUTPUT_BYTES} bytes of output.`, {\n kind: \"connectivity\",\n }),\n );\n });\n };\n\n child.stdout.on(\"data\", (chunk) => {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n outputBytes += buffer.length;\n if (outputBytes > MAX_SCRIPT_OUTPUT_BYTES) {\n failForOutputLimit();\n return;\n }\n stdout.push(buffer);\n });\n\n child.stderr.on(\"data\", (chunk) => {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n outputBytes += buffer.length;\n if (outputBytes > MAX_SCRIPT_OUTPUT_BYTES) {\n failForOutputLimit();\n return;\n }\n stderr.push(buffer);\n });\n\n child.stdin.on(\"error\", () => {\n // Child closure is reported through the process error/close handlers.\n });\n child.once(\"error\", (error) => {\n finish(() => {\n reject(\n new CrablineError(\n formatScriptError(\n \"Script command failed to start.\",\n ensureErrorMessage(error),\n params.command,\n diagnostics,\n ),\n { kind: \"connectivity\" },\n ),\n );\n });\n });\n child.once(\"close\", (code, signal) => {\n finish(() => {\n const stdoutText = Buffer.concat(stdout).toString(\"utf8\");\n const stderrText = Buffer.concat(stderr).toString(\"utf8\");\n if (code !== 0) {\n reject(\n new CrablineError(\n formatScriptError(\n `Script command failed${signal ? ` (${signal})` : \"\"}.`,\n stderrText.trim() ? stderrText : stdoutText,\n params.command,\n diagnostics,\n ),\n { kind: \"connectivity\" },\n ),\n );\n return;\n }\n\n try {\n const result = parseScriptJson({\n command: params.command,\n diagnostics,\n output: stdoutText,\n schema: params.schema,\n });\n if (deadlineExceeded && !params.acceptResultDuringTimeoutGrace?.(result)) {\n reject(\n new CrablineError(`Script command timed out after ${params.timeoutMs}ms.`, {\n kind: \"timeout\",\n }),\n );\n return;\n }\n resolve(result);\n } catch (error) {\n reject(error);\n }\n });\n });\n\n const failForTimeout = () => {\n finish(async () => {\n await terminateChild(child);\n reject(\n new CrablineError(`Script command timed out after ${params.timeoutMs}ms.`, {\n kind: \"timeout\",\n }),\n );\n });\n };\n const timeout = setTimeout(() => {\n const timeoutGraceMs = params.timeoutGraceMs ?? 0;\n if (timeoutGraceMs <= 0) {\n failForTimeout();\n return;\n }\n deadlineExceeded = true;\n timeoutGrace = setTimeout(failForTimeout, timeoutGraceMs);\n timeoutGrace.unref();\n }, params.timeoutMs);\n timeout.unref();\n\n if (params.signal?.aborted) {\n abort();\n return;\n }\n params.signal?.addEventListener(\"abort\", abort, { once: true });\n child.stdin.end(serializedPayload);\n });\n}\n\nfunction watchScript(params: {\n cancelSignal: AbortSignal;\n command: string;\n context: WatchContext;\n cwd?: string | undefined;\n id: string;\n normalizeTarget: ProviderAdapter[\"normalizeTarget\"];\n shell?: string | undefined;\n}): AsyncGenerator<InboundEnvelope> {\n return (async function* () {\n if (params.cancelSignal.aborted) {\n return;\n }\n if (params.context.signal?.aborted) {\n throw params.context.signal.reason ?? new Error(\"Script watch command aborted.\");\n }\n const payload = {\n ...createPayload(params.context),\n watch: {\n since: params.context.since,\n target: params.normalizeTarget(params.context.fixture.target),\n },\n };\n const serializedPayload = JSON.stringify(payload);\n const diagnostics = createScriptDiagnosticsSnapshot(params.command, serializedPayload);\n let child: SpawnedScriptChild;\n try {\n child = spawn(params.command, {\n cwd: params.cwd ? path.resolve(params.cwd) : process.cwd(),\n env: process.env,\n shell: params.shell ?? true,\n detached: process.platform !== \"win32\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n } catch (error) {\n throw new CrablineError(\n formatScriptError(\n \"Script watch command failed to start.\",\n ensureErrorMessage(error),\n params.command,\n diagnostics,\n ),\n { kind: \"connectivity\" },\n );\n }\n\n let buffer = \"\";\n let stderr = \"\";\n let childError: unknown;\n let outputLimitError: CrablineError | undefined;\n const stopChild = () => {\n void terminateChild(child);\n };\n params.cancelSignal.addEventListener(\"abort\", stopChild, { once: true });\n params.context.signal?.addEventListener(\"abort\", stopChild, { once: true });\n if (params.cancelSignal.aborted || params.context.signal?.aborted) {\n stopChild();\n }\n child.stdout.setEncoding(\"utf8\");\n child.stderr.setEncoding(\"utf8\");\n child.stdin.on(\"error\", () => {\n // Child closure is reported through the process error/close handlers.\n });\n child.stderr.on(\"data\", (chunk) => {\n if (outputLimitError) {\n return;\n }\n stderr += chunk;\n if (Buffer.byteLength(stderr) > MAX_SCRIPT_OUTPUT_BYTES) {\n outputLimitError = new CrablineError(\n `Script watch command exceeded ${MAX_SCRIPT_OUTPUT_BYTES} bytes of stderr.`,\n { kind: \"connectivity\" },\n );\n void terminateChild(child);\n }\n });\n child.once(\"error\", (error) => {\n childError = error;\n });\n let childCloseObserved = false;\n const childClosed = new Promise<{ code: number | null; signal: NodeJS.Signals | null }>(\n (resolve) => {\n child.once(\"close\", (code, signal) => {\n childCloseObserved = true;\n resolve({ code, signal });\n });\n },\n );\n child.stdin.end(serializedPayload);\n\n try {\n for await (const chunk of child.stdout) {\n buffer += chunk;\n if (Buffer.byteLength(buffer) > MAX_SCRIPT_OUTPUT_BYTES && !buffer.includes(\"\\n\")) {\n throw new CrablineError(\n `Script watch command exceeded ${MAX_SCRIPT_OUTPUT_BYTES} bytes without a newline.`,\n { kind: \"config\" },\n );\n }\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n if (!line.trim()) {\n continue;\n }\n if (Buffer.byteLength(line) > MAX_SCRIPT_OUTPUT_BYTES) {\n throw new CrablineError(\n `Script watch command emitted a JSON line larger than ${MAX_SCRIPT_OUTPUT_BYTES} bytes.`,\n { kind: \"config\" },\n );\n }\n const parsed = parseScriptJson({\n command: params.command,\n diagnostics,\n output: line,\n schema: ScriptMessageSchema,\n });\n yield {\n ...parsed,\n provider: params.id,\n };\n }\n }\n\n if (params.context.signal?.aborted) {\n throw params.context.signal.reason ?? new Error(\"Script watch command aborted.\");\n }\n if (params.cancelSignal.aborted) {\n return;\n }\n if (buffer.trim()) {\n const parsed = parseScriptJson({\n command: params.command,\n diagnostics,\n output: buffer,\n schema: ScriptMessageSchema,\n });\n yield {\n ...parsed,\n provider: params.id,\n };\n }\n\n const exit = await childClosed;\n if (outputLimitError) {\n throw outputLimitError;\n }\n if (childError) {\n throw new CrablineError(\n formatScriptError(\n \"Script watch command failed to start.\",\n ensureErrorMessage(childError),\n params.command,\n diagnostics,\n ),\n { kind: \"connectivity\" },\n );\n }\n if (exit.code !== 0) {\n throw new CrablineError(\n formatScriptError(\n `Script watch command failed${exit.signal ? ` (${exit.signal})` : \"\"}.`,\n stderr,\n params.command,\n diagnostics,\n ),\n { kind: \"connectivity\" },\n );\n }\n } catch (error) {\n if (params.cancelSignal.aborted) {\n return;\n }\n if (outputLimitError) {\n throw outputLimitError;\n }\n if (childError) {\n throw new CrablineError(\n formatScriptError(\n \"Script watch command failed to start.\",\n ensureErrorMessage(childError),\n params.command,\n diagnostics,\n ),\n { kind: \"connectivity\" },\n );\n }\n throw error;\n } finally {\n params.cancelSignal.removeEventListener(\"abort\", stopChild);\n params.context.signal?.removeEventListener(\"abort\", stopChild);\n child.stdin.destroy();\n if (!childCloseObserved) {\n await terminateChild(child);\n }\n await childClosed;\n }\n })();\n}\n\nfunction failedScriptWatch(error: unknown): ScriptWatchIterator {\n return {\n [Symbol.asyncIterator]() {\n return this;\n },\n next() {\n return Promise.reject(error);\n },\n return() {\n return Promise.resolve({ done: true, value: undefined });\n },\n throw(thrown?: unknown) {\n return Promise.reject(thrown);\n },\n };\n}\n\nexport class ScriptProviderAdapter implements ProviderAdapter {\n readonly id;\n readonly platform;\n readonly status = \"bridge\" as const;\n readonly supports;\n readonly #config;\n\n constructor(context: ProviderContext) {\n if (!context.config.script) {\n throw new CrablineError(`Provider \"${context.providerId}\" is missing script configuration.`, {\n kind: \"config\",\n });\n }\n\n this.id = context.providerId;\n this.platform = context.config.platform;\n this.supports = [...context.config.capabilities];\n this.#config = context.config.script;\n }\n\n normalizeTarget(target: ProviderContext[\"fixture\"][\"target\"]) {\n const normalized = {\n id: target.id,\n metadata: target.metadata,\n } as ReturnType<ProviderAdapter[\"normalizeTarget\"]>;\n if (target.channelId) {\n normalized.channelId = target.channelId;\n }\n if (target.threadId) {\n normalized.threadId = target.threadId;\n }\n return normalized;\n }\n\n async probe(context: ProviderContext) {\n const command = this.#config.commands.probe;\n if (!command) {\n return {\n details: [\"probe command not configured\"],\n healthy: false,\n };\n }\n\n const result = await runScript({\n command,\n cwd: this.#config.cwd,\n payload: createPayload(context),\n schema: ScriptProbeResultSchema,\n shell: this.#config.shell,\n signal: context.signal,\n timeoutMs: context.fixture.timeoutMs,\n });\n return {\n details: result.details ?? [],\n healthy: result.healthy,\n };\n }\n\n async send(context: SendContext) {\n const command = this.#config.commands.send;\n if (!command) {\n throw new CrablineError(`Provider \"${this.id}\" is missing send command.`, {\n kind: \"config\",\n });\n }\n\n return runScript({\n command,\n cwd: this.#config.cwd,\n payload: {\n ...createPayload(context),\n outbound: {\n mode: context.mode,\n nonce: context.nonce,\n target: this.normalizeTarget(context.fixture.target),\n text: context.text,\n },\n },\n schema: ScriptSendResultSchema,\n shell: this.#config.shell,\n signal: context.signal,\n timeoutMs: context.fixture.timeoutMs,\n });\n }\n\n async waitForInbound(context: WaitContext) {\n const command = this.#config.commands.waitForInbound;\n if (!command) {\n return null;\n }\n\n const result = await runScript({\n acceptResultDuringTimeoutGrace: (candidate) => candidate.timeout === true,\n command,\n cwd: this.#config.cwd,\n payload: {\n ...createPayload(context),\n wait: {\n excludeIds: context.excludeIds ?? [],\n nonce: context.nonce,\n since: context.since,\n target: this.normalizeTarget(context.fixture.target),\n threadId: context.threadId,\n timeoutMs: context.timeoutMs,\n },\n },\n schema: ScriptInboundResultSchema,\n shell: this.#config.shell,\n signal: context.signal,\n timeoutGraceMs: SCRIPT_WAIT_EXIT_GRACE_MS,\n timeoutMs: context.timeoutMs,\n });\n\n if (result.timeout || !result.message) {\n return null;\n }\n\n return {\n ...result.message,\n provider: this.id,\n };\n }\n\n watch(context: WatchContext): ScriptWatchIterator {\n const command = this.#config.commands.watch;\n if (!command) {\n return failedScriptWatch(\n new CrablineError(`Provider \"${this.id}\" is missing watch command.`, {\n kind: \"config\",\n }),\n );\n }\n\n const controller = new AbortController();\n const source = watchScript({\n cancelSignal: controller.signal,\n command,\n context,\n cwd: this.#config.cwd,\n id: this.id,\n normalizeTarget: (target) => this.normalizeTarget(target),\n shell: this.#config.shell,\n });\n const iterator: ScriptWatchIterator = {\n [Symbol.asyncIterator]() {\n return this;\n },\n next() {\n return source.next();\n },\n async return() {\n if (!controller.signal.aborted) {\n controller.abort();\n }\n await source.return(undefined);\n return { done: true, value: undefined };\n },\n async throw(error?: unknown) {\n if (!controller.signal.aborted) {\n controller.abort();\n }\n await source.return(undefined);\n throw error;\n },\n };\n return iterator;\n }\n}\n\nfunction createPayload(context: ProviderContext): ScriptPayload {\n return {\n fixture: context.fixture,\n provider: {\n config: context.config,\n id: context.providerId,\n manifestPath: context.manifestPath,\n },\n };\n}\n"]}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import type { ProviderConfig } from "../../config/schema.js";
|
|
2
2
|
import { LocalMockProviderAdapter } from "../local-mock.js";
|
|
3
3
|
import type { ProviderAdapter } from "../types.js";
|
|
4
|
+
type SlackEnvironment = Partial<Pick<NodeJS.ProcessEnv, "SLACK_SIGNING_SECRET">>;
|
|
5
|
+
export declare function resolveSlackAdapterConfig(config: ProviderConfig, env?: SlackEnvironment): {
|
|
6
|
+
signingSecret: string | undefined;
|
|
7
|
+
};
|
|
8
|
+
export declare function handleSlackWebhookPayload(payload: unknown): Response | undefined;
|
|
4
9
|
export declare class SlackProviderAdapter extends LocalMockProviderAdapter implements ProviderAdapter {
|
|
5
10
|
constructor(id: string, config: ProviderConfig, _userName: string, _runtime?: unknown);
|
|
6
11
|
}
|
|
12
|
+
export {};
|
|
@@ -1,21 +1,37 @@
|
|
|
1
|
+
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
1
2
|
import path from "node:path";
|
|
2
3
|
import { CrablineError } from "../../core/errors.js";
|
|
3
4
|
import { LocalMockProviderAdapter } from "../local-mock.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
return
|
|
5
|
+
import { slackTargetKey, SLACK_CHANNEL_ID_RULE, SLACK_TS_RULE } from "../slack-ids.js";
|
|
6
|
+
import { getBuiltinTargetCodec } from "../target-normalizers.js";
|
|
7
|
+
import { genericMockPayloadWithNativeThread, isRecord, optionalString, requireNativeInboundId, } from "./native-local-mock.js";
|
|
8
|
+
import { requireExternalWebhookAuthentication } from "./external-webhook-auth.js";
|
|
9
|
+
const SLACK_SIGNATURE_TOLERANCE_SECONDS = 5 * 60;
|
|
10
|
+
export function resolveSlackAdapterConfig(config, env = process.env) {
|
|
11
|
+
return {
|
|
12
|
+
signingSecret: config.slack?.signingSecret ?? env.SLACK_SIGNING_SECRET,
|
|
13
|
+
};
|
|
11
14
|
}
|
|
12
|
-
function
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
function authenticateSlackWebhook(request, rawBody, signingSecret) {
|
|
16
|
+
const timestamp = request.headers.get("x-slack-request-timestamp");
|
|
17
|
+
const signature = request.headers.get("x-slack-signature");
|
|
18
|
+
const timestampSeconds = timestamp ? Number(timestamp) : Number.NaN;
|
|
19
|
+
if (!timestamp ||
|
|
20
|
+
!signature ||
|
|
21
|
+
!Number.isSafeInteger(timestampSeconds) ||
|
|
22
|
+
Math.abs(Date.now() / 1000 - timestampSeconds) > SLACK_SIGNATURE_TOLERANCE_SECONDS) {
|
|
23
|
+
return new Response("unauthorized", { status: 401 });
|
|
17
24
|
}
|
|
18
|
-
|
|
25
|
+
const expected = `v0=${createHmac("sha256", signingSecret)
|
|
26
|
+
.update(`v0:${timestamp}:${rawBody}`)
|
|
27
|
+
.digest("hex")}`;
|
|
28
|
+
const actualBuffer = Buffer.from(signature);
|
|
29
|
+
const expectedBuffer = Buffer.from(expected);
|
|
30
|
+
if (actualBuffer.length !== expectedBuffer.length ||
|
|
31
|
+
!timingSafeEqual(actualBuffer, expectedBuffer)) {
|
|
32
|
+
return new Response("unauthorized", { status: 401 });
|
|
33
|
+
}
|
|
34
|
+
return undefined;
|
|
19
35
|
}
|
|
20
36
|
function slackAuthorFromEvent(event) {
|
|
21
37
|
if (typeof event.bot_id === "string" || event.subtype === "bot_message") {
|
|
@@ -29,60 +45,103 @@ function normalizeSlackEventsPayload(payload) {
|
|
|
29
45
|
}
|
|
30
46
|
if (isRecord(payload.event)) {
|
|
31
47
|
const event = payload.event;
|
|
48
|
+
const changedMessage = isRecord(event.message) ? event.message : undefined;
|
|
49
|
+
const isMessageChanged = event.subtype === "message_changed" && changedMessage !== undefined;
|
|
50
|
+
const message = isMessageChanged ? changedMessage : event;
|
|
32
51
|
const channel = event.channel;
|
|
33
|
-
const text =
|
|
52
|
+
const text = message.text;
|
|
34
53
|
if (typeof channel !== "string" || typeof text !== "string") {
|
|
35
54
|
throw new CrablineError("Slack event payload requires event.channel and event.text", {
|
|
36
55
|
kind: "inbound",
|
|
37
56
|
});
|
|
38
57
|
}
|
|
39
|
-
const threadTs =
|
|
40
|
-
const
|
|
58
|
+
const threadTs = message.thread_ts;
|
|
59
|
+
const eventId = isMessageChanged
|
|
60
|
+
? optionalString(event, "event_ts")
|
|
61
|
+
: optionalString(message, "ts");
|
|
41
62
|
return {
|
|
42
|
-
author: slackAuthorFromEvent(
|
|
43
|
-
...(
|
|
44
|
-
? { id: requireNativeInboundId(
|
|
63
|
+
author: slackAuthorFromEvent(message),
|
|
64
|
+
...(eventId
|
|
65
|
+
? { id: requireNativeInboundId(eventId, SLACK_TS_RULE, "Slack event timestamp") }
|
|
45
66
|
: {}),
|
|
46
67
|
raw: payload,
|
|
47
68
|
text,
|
|
48
69
|
threadId: typeof threadTs === "string"
|
|
49
|
-
? requireNativeInboundId(threadTs, SLACK_TS_RULE, "Slack event.thread_ts")
|
|
70
|
+
? slackTargetKey(requireNativeInboundId(channel, SLACK_CHANNEL_ID_RULE, "Slack event.channel"), requireNativeInboundId(threadTs, SLACK_TS_RULE, "Slack event.thread_ts"))
|
|
50
71
|
: requireNativeInboundId(channel, SLACK_CHANNEL_ID_RULE, "Slack event.channel"),
|
|
51
72
|
};
|
|
52
73
|
}
|
|
53
|
-
|
|
74
|
+
const normalized = genericMockPayloadWithNativeThread({
|
|
54
75
|
channelRule: SLACK_CHANNEL_ID_RULE,
|
|
55
76
|
payload,
|
|
56
77
|
threadRule: SLACK_TS_RULE,
|
|
57
78
|
});
|
|
58
|
-
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
79
|
+
const message = isRecord(payload.message) ? payload.message : undefined;
|
|
80
|
+
const channelId = (message ? optionalString(message, "channelId") : undefined) ??
|
|
81
|
+
optionalString(payload, "channelId") ??
|
|
82
|
+
optionalString(payload, "channel");
|
|
83
|
+
const threadId = (message ? optionalString(message, "threadId") : undefined) ??
|
|
84
|
+
optionalString(payload, "threadId");
|
|
85
|
+
if (threadId && SLACK_TS_RULE.pattern.test(threadId) && !channelId) {
|
|
86
|
+
throw new CrablineError("Slack timestamp threadId requires a native channelId", {
|
|
87
|
+
kind: "inbound",
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
if (!channelId || !threadId || !SLACK_TS_RULE.pattern.test(threadId)) {
|
|
70
91
|
return normalized;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
92
|
+
}
|
|
93
|
+
const scopedThreadId = slackTargetKey(requireNativeInboundId(channelId, SLACK_CHANNEL_ID_RULE, "Slack channelId"), threadId);
|
|
94
|
+
return {
|
|
95
|
+
...normalized,
|
|
96
|
+
...("message" in normalized && isRecord(normalized.message)
|
|
97
|
+
? { message: { ...normalized.message, threadId: scopedThreadId } }
|
|
98
|
+
: {}),
|
|
99
|
+
threadId: scopedThreadId,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function matchesSlackThread(candidateThreadId, expectedThreadId, target) {
|
|
103
|
+
if (!expectedThreadId) {
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
const scopedExpectedThreadId = target.channelId && SLACK_TS_RULE.pattern.test(expectedThreadId)
|
|
107
|
+
? slackTargetKey(target.channelId, expectedThreadId)
|
|
108
|
+
: expectedThreadId;
|
|
109
|
+
return (candidateThreadId === scopedExpectedThreadId ||
|
|
110
|
+
candidateThreadId.startsWith(`${scopedExpectedThreadId}:`));
|
|
111
|
+
}
|
|
112
|
+
export function handleSlackWebhookPayload(payload) {
|
|
113
|
+
if (isRecord(payload) &&
|
|
114
|
+
payload.type === "url_verification" &&
|
|
115
|
+
typeof payload.challenge === "string") {
|
|
116
|
+
return Response.json({ challenge: payload.challenge });
|
|
117
|
+
}
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
77
120
|
export class SlackProviderAdapter extends LocalMockProviderAdapter {
|
|
78
121
|
constructor(id, config, _userName, _runtime) {
|
|
122
|
+
const resolvedConfig = resolveSlackAdapterConfig(config);
|
|
123
|
+
requireExternalWebhookAuthentication({
|
|
124
|
+
authenticated: Boolean(resolvedConfig.signingSecret),
|
|
125
|
+
provider: "Slack",
|
|
126
|
+
requirement: "slack.signingSecret or SLACK_SIGNING_SECRET",
|
|
127
|
+
webhook: config.slack?.webhook,
|
|
128
|
+
});
|
|
79
129
|
super({
|
|
80
|
-
codec:
|
|
130
|
+
codec: getBuiltinTargetCodec("slack"),
|
|
81
131
|
config,
|
|
82
132
|
id,
|
|
83
133
|
options: {
|
|
134
|
+
...(resolvedConfig.signingSecret
|
|
135
|
+
? {
|
|
136
|
+
authenticateWebhookRequest(request, rawBody) {
|
|
137
|
+
return authenticateSlackWebhook(request, rawBody, resolvedConfig.signingSecret);
|
|
138
|
+
},
|
|
139
|
+
}
|
|
140
|
+
: {}),
|
|
84
141
|
defaultWebhook: { host: "127.0.0.1", path: "/slack/events", port: 8787 },
|
|
85
142
|
endpointLabel: "events endpoint",
|
|
143
|
+
handleWebhookPayload: handleSlackWebhookPayload,
|
|
144
|
+
matchesThread: matchesSlackThread,
|
|
86
145
|
normalizeWebhookPayload: normalizeSlackEventsPayload,
|
|
87
146
|
platform: "slack",
|
|
88
147
|
publicUrl: config.slack?.webhook.publicUrl,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../../src/providers/builtin/slack.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../../src/providers/builtin/slack.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHmac, timingSafeEqual } from \"node:crypto\";\nimport path from \"node:path\";\nimport { CrablineError } from \"../../core/errors.js\";\nimport type { ProviderConfig } from \"../../config/schema.js\";\nimport { LocalMockProviderAdapter } from \"../local-mock.js\";\nimport { slackTargetKey, SLACK_CHANNEL_ID_RULE, SLACK_TS_RULE } from \"../slack-ids.js\";\nimport { getBuiltinTargetCodec } from \"../target-normalizers.js\";\nimport type { InboundEnvelope, ProviderAdapter } from \"../types.js\";\nimport {\n genericMockPayloadWithNativeThread,\n isRecord,\n optionalString,\n requireNativeInboundId,\n} from \"./native-local-mock.js\";\nimport { requireExternalWebhookAuthentication } from \"./external-webhook-auth.js\";\n\nconst SLACK_SIGNATURE_TOLERANCE_SECONDS = 5 * 60;\n\ntype SlackEnvironment = Partial<Pick<NodeJS.ProcessEnv, \"SLACK_SIGNING_SECRET\">>;\n\nexport function resolveSlackAdapterConfig(\n config: ProviderConfig,\n env: SlackEnvironment = process.env,\n) {\n return {\n signingSecret: config.slack?.signingSecret ?? env.SLACK_SIGNING_SECRET,\n };\n}\n\nfunction authenticateSlackWebhook(\n request: Request,\n rawBody: string,\n signingSecret: string,\n): Response | undefined {\n const timestamp = request.headers.get(\"x-slack-request-timestamp\");\n const signature = request.headers.get(\"x-slack-signature\");\n const timestampSeconds = timestamp ? Number(timestamp) : Number.NaN;\n if (\n !timestamp ||\n !signature ||\n !Number.isSafeInteger(timestampSeconds) ||\n Math.abs(Date.now() / 1000 - timestampSeconds) > SLACK_SIGNATURE_TOLERANCE_SECONDS\n ) {\n return new Response(\"unauthorized\", { status: 401 });\n }\n\n const expected = `v0=${createHmac(\"sha256\", signingSecret)\n .update(`v0:${timestamp}:${rawBody}`)\n .digest(\"hex\")}`;\n const actualBuffer = Buffer.from(signature);\n const expectedBuffer = Buffer.from(expected);\n if (\n actualBuffer.length !== expectedBuffer.length ||\n !timingSafeEqual(actualBuffer, expectedBuffer)\n ) {\n return new Response(\"unauthorized\", { status: 401 });\n }\n return undefined;\n}\n\nfunction slackAuthorFromEvent(event: Record<string, unknown>): InboundEnvelope[\"author\"] {\n if (typeof event.bot_id === \"string\" || event.subtype === \"bot_message\") {\n return \"assistant\";\n }\n return \"user\";\n}\n\nfunction normalizeSlackEventsPayload(payload: unknown) {\n if (!isRecord(payload)) {\n throw new CrablineError(\"Slack webhook payload must be an object\", { kind: \"inbound\" });\n }\n\n if (isRecord(payload.event)) {\n const event = payload.event;\n const changedMessage = isRecord(event.message) ? event.message : undefined;\n const isMessageChanged = event.subtype === \"message_changed\" && changedMessage !== undefined;\n const message = isMessageChanged ? changedMessage : event;\n const channel = event.channel;\n const text = message.text;\n if (typeof channel !== \"string\" || typeof text !== \"string\") {\n throw new CrablineError(\"Slack event payload requires event.channel and event.text\", {\n kind: \"inbound\",\n });\n }\n const threadTs = message.thread_ts;\n const eventId = isMessageChanged\n ? optionalString(event, \"event_ts\")\n : optionalString(message, \"ts\");\n return {\n author: slackAuthorFromEvent(message),\n ...(eventId\n ? { id: requireNativeInboundId(eventId, SLACK_TS_RULE, \"Slack event timestamp\") }\n : {}),\n raw: payload,\n text,\n threadId:\n typeof threadTs === \"string\"\n ? slackTargetKey(\n requireNativeInboundId(channel, SLACK_CHANNEL_ID_RULE, \"Slack event.channel\"),\n requireNativeInboundId(threadTs, SLACK_TS_RULE, \"Slack event.thread_ts\"),\n )\n : requireNativeInboundId(channel, SLACK_CHANNEL_ID_RULE, \"Slack event.channel\"),\n };\n }\n\n const normalized = genericMockPayloadWithNativeThread({\n channelRule: SLACK_CHANNEL_ID_RULE,\n payload,\n threadRule: SLACK_TS_RULE,\n });\n const message = isRecord(payload.message) ? payload.message : undefined;\n const channelId =\n (message ? optionalString(message, \"channelId\") : undefined) ??\n optionalString(payload, \"channelId\") ??\n optionalString(payload, \"channel\");\n const threadId =\n (message ? optionalString(message, \"threadId\") : undefined) ??\n optionalString(payload, \"threadId\");\n if (threadId && SLACK_TS_RULE.pattern.test(threadId) && !channelId) {\n throw new CrablineError(\"Slack timestamp threadId requires a native channelId\", {\n kind: \"inbound\",\n });\n }\n if (!channelId || !threadId || !SLACK_TS_RULE.pattern.test(threadId)) {\n return normalized;\n }\n const scopedThreadId = slackTargetKey(\n requireNativeInboundId(channelId, SLACK_CHANNEL_ID_RULE, \"Slack channelId\"),\n threadId,\n );\n return {\n ...normalized,\n ...(\"message\" in normalized && isRecord(normalized.message)\n ? { message: { ...normalized.message, threadId: scopedThreadId } }\n : {}),\n threadId: scopedThreadId,\n };\n}\n\nfunction matchesSlackThread(\n candidateThreadId: string,\n expectedThreadId: string | undefined,\n target: { channelId?: string | undefined },\n): boolean {\n if (!expectedThreadId) {\n return true;\n }\n const scopedExpectedThreadId =\n target.channelId && SLACK_TS_RULE.pattern.test(expectedThreadId)\n ? slackTargetKey(target.channelId, expectedThreadId)\n : expectedThreadId;\n return (\n candidateThreadId === scopedExpectedThreadId ||\n candidateThreadId.startsWith(`${scopedExpectedThreadId}:`)\n );\n}\n\nexport function handleSlackWebhookPayload(payload: unknown): Response | undefined {\n if (\n isRecord(payload) &&\n payload.type === \"url_verification\" &&\n typeof payload.challenge === \"string\"\n ) {\n return Response.json({ challenge: payload.challenge });\n }\n return undefined;\n}\n\nexport class SlackProviderAdapter extends LocalMockProviderAdapter implements ProviderAdapter {\n constructor(id: string, config: ProviderConfig, _userName: string, _runtime?: unknown) {\n const resolvedConfig = resolveSlackAdapterConfig(config);\n requireExternalWebhookAuthentication({\n authenticated: Boolean(resolvedConfig.signingSecret),\n provider: \"Slack\",\n requirement: \"slack.signingSecret or SLACK_SIGNING_SECRET\",\n webhook: config.slack?.webhook,\n });\n super({\n codec: getBuiltinTargetCodec(\"slack\"),\n config,\n id,\n options: {\n ...(resolvedConfig.signingSecret\n ? {\n authenticateWebhookRequest(request: Request, rawBody: string) {\n return authenticateSlackWebhook(request, rawBody, resolvedConfig.signingSecret!);\n },\n }\n : {}),\n defaultWebhook: { host: \"127.0.0.1\", path: \"/slack/events\", port: 8787 },\n endpointLabel: \"events endpoint\",\n handleWebhookPayload: handleSlackWebhookPayload,\n matchesThread: matchesSlackThread,\n normalizeWebhookPayload: normalizeSlackEventsPayload,\n platform: \"slack\",\n publicUrl: config.slack?.webhook.publicUrl,\n recorderPath: config.slack?.recorder.path\n ? path.resolve(config.slack.recorder.path)\n : undefined,\n webhook: config.slack?.webhook,\n },\n });\n }\n}\n"]}
|
|
@@ -14,6 +14,12 @@ export declare function normalizeTelegramWebhookPayload(payload: unknown): {
|
|
|
14
14
|
id?: string | undefined;
|
|
15
15
|
raw: {};
|
|
16
16
|
text?: string | undefined;
|
|
17
|
+
} | {
|
|
18
|
+
author: "assistant" | "system" | "user";
|
|
19
|
+
id?: string | undefined;
|
|
20
|
+
raw: Record<string, unknown>;
|
|
21
|
+
text: string;
|
|
22
|
+
threadId: string;
|
|
17
23
|
};
|
|
18
24
|
export declare class TelegramProviderAdapter extends LocalMockProviderAdapter implements ProviderAdapter {
|
|
19
25
|
constructor(id: string, config: ProviderConfig, _userName: string);
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { CrablineError } from "../../core/errors.js";
|
|
3
3
|
import { LocalMockProviderAdapter } from "../local-mock.js";
|
|
4
|
-
import {
|
|
4
|
+
import { getBuiltinTargetCodec, parseCanonicalTelegramTopic, TELEGRAM_CHAT_ID_RULE, TELEGRAM_MESSAGE_THREAD_ID_RULE, } from "../target-normalizers.js";
|
|
5
|
+
import { authorFromBotFlag, createSecretVerifier, genericMockPayloadWithNativeThread, isRecord, optionalRecord, optionalString, optionalStringish, requireNativeInboundId, } from "./native-local-mock.js";
|
|
5
6
|
export function resolveTelegramAdapterConfig(config, env = process.env) {
|
|
6
7
|
const telegramConfig = config.telegram;
|
|
7
8
|
return {
|
|
@@ -23,55 +24,62 @@ function toRecorderPath(providerId, config) {
|
|
|
23
24
|
? path.resolve(configuredPath)
|
|
24
25
|
: path.resolve(".crabline", "recorders", `${providerId}.jsonl`);
|
|
25
26
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
27
|
+
function normalizeGenericTelegramPayload(payload) {
|
|
28
|
+
const message = optionalRecord(payload, "message");
|
|
29
|
+
const threadId = message
|
|
30
|
+
? optionalString(message, "threadId")
|
|
31
|
+
: optionalString(payload, "threadId");
|
|
32
|
+
const canonicalTopic = threadId ? parseCanonicalTelegramTopic(threadId) : undefined;
|
|
33
|
+
const genericPayload = canonicalTopic
|
|
34
|
+
? message
|
|
35
|
+
? {
|
|
36
|
+
...payload,
|
|
37
|
+
message: {
|
|
38
|
+
...message,
|
|
39
|
+
threadId: canonicalTopic.topicId,
|
|
40
|
+
},
|
|
41
|
+
}
|
|
42
|
+
: {
|
|
43
|
+
...payload,
|
|
44
|
+
threadId: canonicalTopic.topicId,
|
|
45
|
+
}
|
|
46
|
+
: payload;
|
|
47
|
+
const normalized = genericMockPayloadWithNativeThread({
|
|
48
|
+
channelRule: TELEGRAM_CHAT_ID_RULE,
|
|
49
|
+
payload: genericPayload,
|
|
50
|
+
threadRule: TELEGRAM_MESSAGE_THREAD_ID_RULE,
|
|
51
|
+
});
|
|
52
|
+
if (!canonicalTopic) {
|
|
53
|
+
return normalized;
|
|
54
|
+
}
|
|
55
|
+
const normalizedRecord = normalized;
|
|
56
|
+
const raw = payload.raw ?? payload;
|
|
57
|
+
return message
|
|
58
|
+
? {
|
|
59
|
+
...normalizedRecord,
|
|
60
|
+
raw,
|
|
61
|
+
threadId: `${canonicalTopic.chatId}:${canonicalTopic.topicId}`,
|
|
62
|
+
message: {
|
|
63
|
+
...(isRecord(normalizedRecord.message) ? normalizedRecord.message : {}),
|
|
64
|
+
threadId: `${canonicalTopic.chatId}:${canonicalTopic.topicId}`,
|
|
65
|
+
},
|
|
50
66
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
threadId: `${
|
|
67
|
+
: {
|
|
68
|
+
...normalizedRecord,
|
|
69
|
+
raw,
|
|
70
|
+
threadId: `${canonicalTopic.chatId}:${canonicalTopic.topicId}`,
|
|
55
71
|
};
|
|
56
|
-
|
|
57
|
-
resolveThreadId(target) {
|
|
58
|
-
const normalized = this.normalize(target);
|
|
59
|
-
return normalized.threadId ?? normalized.channelId ?? normalized.id;
|
|
60
|
-
},
|
|
61
|
-
};
|
|
72
|
+
}
|
|
62
73
|
export function normalizeTelegramWebhookPayload(payload) {
|
|
63
74
|
if (!isRecord(payload)) {
|
|
64
75
|
throw new CrablineError("Telegram webhook payload must be an object", { kind: "inbound" });
|
|
65
76
|
}
|
|
66
77
|
const message = optionalRecord(payload, "message") ??
|
|
67
78
|
optionalRecord(payload, "edited_message") ??
|
|
68
|
-
optionalRecord(payload, "channel_post")
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
payload,
|
|
73
|
-
threadRule: TELEGRAM_MESSAGE_THREAD_ID_RULE,
|
|
74
|
-
});
|
|
79
|
+
optionalRecord(payload, "channel_post") ??
|
|
80
|
+
optionalRecord(payload, "edited_channel_post");
|
|
81
|
+
if (!message || optionalString(message, "threadId")) {
|
|
82
|
+
return normalizeGenericTelegramPayload(payload);
|
|
75
83
|
}
|
|
76
84
|
const chat = optionalRecord(message, "chat");
|
|
77
85
|
const chatId = chat ? optionalStringish(chat, "id") : undefined;
|
|
@@ -100,11 +108,24 @@ export function normalizeTelegramWebhookPayload(payload) {
|
|
|
100
108
|
}
|
|
101
109
|
export class TelegramProviderAdapter extends LocalMockProviderAdapter {
|
|
102
110
|
constructor(id, config, _userName) {
|
|
111
|
+
const resolvedConfig = resolveTelegramAdapterConfig(config);
|
|
112
|
+
const authenticateWebhook = resolvedConfig.secretToken
|
|
113
|
+
? createSecretVerifier(resolvedConfig.secretToken)
|
|
114
|
+
: undefined;
|
|
103
115
|
super({
|
|
104
|
-
codec:
|
|
116
|
+
codec: getBuiltinTargetCodec("telegram"),
|
|
105
117
|
config,
|
|
106
118
|
id,
|
|
107
119
|
options: {
|
|
120
|
+
...(authenticateWebhook
|
|
121
|
+
? {
|
|
122
|
+
authenticateWebhookRequest(request) {
|
|
123
|
+
return authenticateWebhook(request.headers.get("x-telegram-bot-api-secret-token"))
|
|
124
|
+
? undefined
|
|
125
|
+
: new Response("unauthorized", { status: 401 });
|
|
126
|
+
},
|
|
127
|
+
}
|
|
128
|
+
: {}),
|
|
108
129
|
defaultWebhook: {
|
|
109
130
|
host: "127.0.0.1",
|
|
110
131
|
path: "/telegram/webhook",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../../../src/providers/builtin/telegram.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../../../src/providers/builtin/telegram.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EACL,qBAAqB,EACrB,2BAA2B,EAC3B,qBAAqB,EACrB,+BAA+B,GAChC,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,kCAAkC,EAClC,QAAQ,EACR,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAShC,MAAM,UAAU,4BAA4B,CAC1C,MAAsB,EACtB,GAAG,GAAwB,OAAO,CAAC,GAAG;IAEtC,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC;IACvC,OAAO;QACL,IAAI,EAAE,cAAc,EAAE,IAAI,IAAI,MAAM;QACpC,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,IAAI,GAAG,CAAC,qBAAqB,CAAC;YACvD,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,IAAI,GAAG,CAAC,qBAAsB,EAAE;YAClE,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,CAAC,cAAc,EAAE,WAAW,IAAI,GAAG,CAAC,6BAA6B,CAAC;YACpE,CAAC,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,IAAI,GAAG,CAAC,6BAA8B,EAAE;YACpF,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,CAAC,cAAc,EAAE,QAAQ,IAAI,GAAG,CAAC,qBAAqB,CAAC;YACzD,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,IAAI,GAAG,CAAC,qBAAsB,EAAE;YACtE,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,UAAkB,EAAE,MAAsB;IAChE,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC;IACtD,OAAO,cAAc;QACnB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;QAC9B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,UAAU,QAAQ,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,+BAA+B,CAAC,OAAgC;IACvE,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,OAAO;QACtB,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,UAAU,CAAC;QACrC,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACxC,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,2BAA2B,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACpF,MAAM,cAAc,GAAG,cAAc;QACnC,CAAC,CAAC,OAAO;YACP,CAAC,CAAC;gBACE,GAAG,OAAO;gBACV,OAAO,EAAE;oBACP,GAAG,OAAO;oBACV,QAAQ,EAAE,cAAc,CAAC,OAAO;iBACjC;aACF;YACH,CAAC,CAAC;gBACE,GAAG,OAAO;gBACV,QAAQ,EAAE,cAAc,CAAC,OAAO;aACjC;QACL,CAAC,CAAC,OAAO,CAAC;IACZ,MAAM,UAAU,GAAG,kCAAkC,CAAC;QACpD,WAAW,EAAE,qBAAqB;QAClC,OAAO,EAAE,cAAc;QACvB,UAAU,EAAE,+BAA+B;KAC5C,CAAC,CAAC;IACH,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,MAAM,gBAAgB,GAAG,UAAqC,CAAC;IAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC;IACnC,OAAO,OAAO;QACZ,CAAC,CAAC;YACE,GAAG,gBAAgB;YACnB,GAAG;YACH,QAAQ,EAAE,GAAG,cAAc,CAAC,MAAM,IAAI,cAAc,CAAC,OAAO,EAAE;YAC9D,OAAO,EAAE;gBACP,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvE,QAAQ,EAAE,GAAG,cAAc,CAAC,MAAM,IAAI,cAAc,CAAC,OAAO,EAAE;aAC/D;SACF;QACH,CAAC,CAAC;YACE,GAAG,gBAAgB;YACnB,GAAG;YACH,QAAQ,EAAE,GAAG,cAAc,CAAC,MAAM,IAAI,cAAc,CAAC,OAAO,EAAE;SAC/D,CAAC;AACR,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,OAAgB;IAC9D,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,aAAa,CAAC,4CAA4C,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,MAAM,OAAO,GACX,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC;QAClC,cAAc,CAAC,OAAO,EAAE,gBAAgB,CAAC;QACzC,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC;QACvC,cAAc,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;IACjD,IAAI,CAAC,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,CAAC;QACpD,OAAO,+BAA+B,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACnF,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,aAAa,CAAC,2DAA2D,EAAE;YACnF,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAChE,MAAM,gBAAgB,GAAG,sBAAsB,CAC7C,MAAM,EACN,qBAAqB,EACrB,0BAA0B,CAC3B,CAAC;IACF,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7C,OAAO;QACL,MAAM,EAAE,iBAAiB,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;QAChD,GAAG,CAAC,iBAAiB,CAAC,OAAO,EAAE,YAAY,CAAC;YAC1C,CAAC,CAAC,EAAE,EAAE,EAAE,iBAAiB,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE;YAClD,CAAC,CAAC,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC;gBACvC,CAAC,CAAC,EAAE,EAAE,EAAE,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE;gBACjD,CAAC,CAAC,EAAE,CAAC;QACT,GAAG,EAAE,OAAO;QACZ,IAAI;QACJ,QAAQ,EAAE,OAAO;YACf,CAAC,CAAC,GAAG,gBAAgB,IAAI,sBAAsB,CAC3C,OAAO,EACP,+BAA+B,EAC/B,oCAAoC,CACrC,EAAE;YACL,CAAC,CAAC,gBAAgB;KACrB,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,uBAAwB,SAAQ,wBAAwB;IACnE,YAAY,EAAU,EAAE,MAAsB,EAAE,SAAiB;QAC/D,MAAM,cAAc,GAAG,4BAA4B,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,mBAAmB,GAAG,cAAc,CAAC,WAAW;YACpD,CAAC,CAAC,oBAAoB,CAAC,cAAc,CAAC,WAAW,CAAC;YAClD,CAAC,CAAC,SAAS,CAAC;QACd,KAAK,CAAC;YACJ,KAAK,EAAE,qBAAqB,CAAC,UAAU,CAAC;YACxC,MAAM;YACN,EAAE;YACF,OAAO,EAAE;gBACP,GAAG,CAAC,mBAAmB;oBACrB,CAAC,CAAC;wBACE,0BAA0B,CAAC,OAAgB;4BACzC,OAAO,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;gCAChF,CAAC,CAAC,SAAS;gCACX,CAAC,CAAC,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;wBACpD,CAAC;qBACF;oBACH,CAAC,CAAC,EAAE,CAAC;gBACP,cAAc,EAAE;oBACd,IAAI,EAAE,WAAW;oBACjB,IAAI,EAAE,mBAAmB;oBACzB,IAAI,EAAE,IAAI;iBACX;gBACD,aAAa,EAAE,kBAAkB;gBACjC,uBAAuB,EAAE,+BAA+B;gBACxD,QAAQ,EAAE,UAAU;gBACpB,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS;gBAC7C,YAAY,EAAE,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC;gBACxC,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO;aAClC;SACF,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import path from \"node:path\";\nimport { CrablineError } from \"../../core/errors.js\";\nimport type { ProviderConfig } from \"../../config/schema.js\";\nimport { LocalMockProviderAdapter } from \"../local-mock.js\";\nimport {\n getBuiltinTargetCodec,\n parseCanonicalTelegramTopic,\n TELEGRAM_CHAT_ID_RULE,\n TELEGRAM_MESSAGE_THREAD_ID_RULE,\n} from \"../target-normalizers.js\";\nimport type { ProviderAdapter } from \"../types.js\";\nimport {\n authorFromBotFlag,\n createSecretVerifier,\n genericMockPayloadWithNativeThread,\n isRecord,\n optionalRecord,\n optionalString,\n optionalStringish,\n requireNativeInboundId,\n} from \"./native-local-mock.js\";\n\ntype TelegramEnvironment = Partial<\n Pick<\n NodeJS.ProcessEnv,\n \"TELEGRAM_API_BASE_URL\" | \"TELEGRAM_BOT_USERNAME\" | \"TELEGRAM_WEBHOOK_SECRET_TOKEN\"\n >\n>;\n\nexport function resolveTelegramAdapterConfig(\n config: ProviderConfig,\n env: TelegramEnvironment = process.env,\n) {\n const telegramConfig = config.telegram;\n return {\n mode: telegramConfig?.mode ?? \"auto\",\n ...((telegramConfig?.apiUrl ?? env.TELEGRAM_API_BASE_URL)\n ? { apiUrl: telegramConfig?.apiUrl ?? env.TELEGRAM_API_BASE_URL! }\n : {}),\n ...((telegramConfig?.secretToken ?? env.TELEGRAM_WEBHOOK_SECRET_TOKEN)\n ? { secretToken: telegramConfig?.secretToken ?? env.TELEGRAM_WEBHOOK_SECRET_TOKEN! }\n : {}),\n ...((telegramConfig?.userName ?? env.TELEGRAM_BOT_USERNAME)\n ? { userName: telegramConfig?.userName ?? env.TELEGRAM_BOT_USERNAME! }\n : {}),\n };\n}\n\nfunction toRecorderPath(providerId: string, config: ProviderConfig): string {\n const configuredPath = config.telegram?.recorder.path;\n return configuredPath\n ? path.resolve(configuredPath)\n : path.resolve(\".crabline\", \"recorders\", `${providerId}.jsonl`);\n}\n\nfunction normalizeGenericTelegramPayload(payload: Record<string, unknown>) {\n const message = optionalRecord(payload, \"message\");\n const threadId = message\n ? optionalString(message, \"threadId\")\n : optionalString(payload, \"threadId\");\n const canonicalTopic = threadId ? parseCanonicalTelegramTopic(threadId) : undefined;\n const genericPayload = canonicalTopic\n ? message\n ? {\n ...payload,\n message: {\n ...message,\n threadId: canonicalTopic.topicId,\n },\n }\n : {\n ...payload,\n threadId: canonicalTopic.topicId,\n }\n : payload;\n const normalized = genericMockPayloadWithNativeThread({\n channelRule: TELEGRAM_CHAT_ID_RULE,\n payload: genericPayload,\n threadRule: TELEGRAM_MESSAGE_THREAD_ID_RULE,\n });\n if (!canonicalTopic) {\n return normalized;\n }\n const normalizedRecord = normalized as Record<string, unknown>;\n const raw = payload.raw ?? payload;\n return message\n ? {\n ...normalizedRecord,\n raw,\n threadId: `${canonicalTopic.chatId}:${canonicalTopic.topicId}`,\n message: {\n ...(isRecord(normalizedRecord.message) ? normalizedRecord.message : {}),\n threadId: `${canonicalTopic.chatId}:${canonicalTopic.topicId}`,\n },\n }\n : {\n ...normalizedRecord,\n raw,\n threadId: `${canonicalTopic.chatId}:${canonicalTopic.topicId}`,\n };\n}\n\nexport function normalizeTelegramWebhookPayload(payload: unknown) {\n if (!isRecord(payload)) {\n throw new CrablineError(\"Telegram webhook payload must be an object\", { kind: \"inbound\" });\n }\n\n const message =\n optionalRecord(payload, \"message\") ??\n optionalRecord(payload, \"edited_message\") ??\n optionalRecord(payload, \"channel_post\") ??\n optionalRecord(payload, \"edited_channel_post\");\n if (!message || optionalString(message, \"threadId\")) {\n return normalizeGenericTelegramPayload(payload);\n }\n\n const chat = optionalRecord(message, \"chat\");\n const chatId = chat ? optionalStringish(chat, \"id\") : undefined;\n const text = optionalString(message, \"text\") ?? optionalString(message, \"caption\");\n if (!chatId || !text) {\n throw new CrablineError(\"Telegram update requires message.chat.id and message.text\", {\n kind: \"inbound\",\n });\n }\n\n const topicId = optionalStringish(message, \"message_thread_id\");\n const normalizedChatId = requireNativeInboundId(\n chatId,\n TELEGRAM_CHAT_ID_RULE,\n \"Telegram message.chat.id\",\n );\n const from = optionalRecord(message, \"from\");\n return {\n author: authorFromBotFlag(from?.is_bot === true),\n ...(optionalStringish(message, \"message_id\")\n ? { id: optionalStringish(message, \"message_id\") }\n : optionalStringish(payload, \"update_id\")\n ? { id: optionalStringish(payload, \"update_id\") }\n : {}),\n raw: payload,\n text,\n threadId: topicId\n ? `${normalizedChatId}:${requireNativeInboundId(\n topicId,\n TELEGRAM_MESSAGE_THREAD_ID_RULE,\n \"Telegram message.message_thread_id\",\n )}`\n : normalizedChatId,\n };\n}\n\nexport class TelegramProviderAdapter extends LocalMockProviderAdapter implements ProviderAdapter {\n constructor(id: string, config: ProviderConfig, _userName: string) {\n const resolvedConfig = resolveTelegramAdapterConfig(config);\n const authenticateWebhook = resolvedConfig.secretToken\n ? createSecretVerifier(resolvedConfig.secretToken)\n : undefined;\n super({\n codec: getBuiltinTargetCodec(\"telegram\"),\n config,\n id,\n options: {\n ...(authenticateWebhook\n ? {\n authenticateWebhookRequest(request: Request) {\n return authenticateWebhook(request.headers.get(\"x-telegram-bot-api-secret-token\"))\n ? undefined\n : new Response(\"unauthorized\", { status: 401 });\n },\n }\n : {}),\n defaultWebhook: {\n host: \"127.0.0.1\",\n path: \"/telegram/webhook\",\n port: 8790,\n },\n endpointLabel: \"webhook endpoint\",\n normalizeWebhookPayload: normalizeTelegramWebhookPayload,\n platform: \"telegram\",\n publicUrl: config.telegram?.webhook.publicUrl,\n recorderPath: toRecorderPath(id, config),\n webhook: config.telegram?.webhook,\n },\n });\n }\n}\n"]}
|
|
@@ -1,6 +1,24 @@
|
|
|
1
1
|
import type { ProviderConfig } from "../../config/schema.js";
|
|
2
2
|
import { LocalMockProviderAdapter } from "../local-mock.js";
|
|
3
|
-
import type { ProviderAdapter } from "../types.js";
|
|
3
|
+
import type { InboundEnvelope, ProbeResult, ProviderAdapter, ProviderContext, SendContext, SendResult, WaitContext, WatchContext } from "../types.js";
|
|
4
|
+
type NormalizedWhatsAppWebhookMessage = {
|
|
5
|
+
author?: "assistant" | "system" | "user";
|
|
6
|
+
authorIsBot?: boolean;
|
|
7
|
+
id?: string;
|
|
8
|
+
message?: {
|
|
9
|
+
author?: "assistant" | "system" | "user";
|
|
10
|
+
authorIsBot?: boolean;
|
|
11
|
+
id?: string;
|
|
12
|
+
raw?: unknown;
|
|
13
|
+
sentAt?: string;
|
|
14
|
+
text?: string;
|
|
15
|
+
threadId?: string;
|
|
16
|
+
};
|
|
17
|
+
raw?: unknown;
|
|
18
|
+
sentAt?: string;
|
|
19
|
+
text?: string;
|
|
20
|
+
threadId?: string;
|
|
21
|
+
};
|
|
4
22
|
export declare function resolveWhatsAppAdapterConfig(config: ProviderConfig, env?: NodeJS.ProcessEnv): {
|
|
5
23
|
accessToken: string;
|
|
6
24
|
appSecret: string;
|
|
@@ -8,12 +26,14 @@ export declare function resolveWhatsAppAdapterConfig(config: ProviderConfig, env
|
|
|
8
26
|
verifyToken: string;
|
|
9
27
|
};
|
|
10
28
|
export declare class WhatsAppProviderAdapter extends LocalMockProviderAdapter implements ProviderAdapter {
|
|
29
|
+
#private;
|
|
11
30
|
constructor(id: string, config: ProviderConfig, _userName: string, _runtime?: unknown);
|
|
31
|
+
probe(context: ProviderContext): Promise<ProbeResult>;
|
|
32
|
+
send(context: SendContext): Promise<SendResult>;
|
|
33
|
+
waitForInbound(context: WaitContext): Promise<InboundEnvelope | null>;
|
|
34
|
+
watch(context: WatchContext): AsyncIterable<InboundEnvelope>;
|
|
35
|
+
beginCleanup(): void;
|
|
36
|
+
cleanup(): Promise<void>;
|
|
12
37
|
}
|
|
13
|
-
export declare function normalizeWhatsAppWebhookPayload(payload: unknown):
|
|
14
|
-
|
|
15
|
-
authorIsBot?: boolean;
|
|
16
|
-
id?: string | undefined;
|
|
17
|
-
raw: {};
|
|
18
|
-
text?: string | undefined;
|
|
19
|
-
};
|
|
38
|
+
export declare function normalizeWhatsAppWebhookPayload(payload: unknown, expectedPhoneNumberId?: string): NormalizedWhatsAppWebhookMessage[];
|
|
39
|
+
export {};
|