Skip to content

Commit 674c90f

Browse files
sung17Deathgiverclaude
authored
feat(comment-automation): harden reply delivery and gate media steps per channel (#1121)
Two threads over the same surface: comment replies that silently never reached the customer, and media steps that a channel cannot deliver. Reply delivery (worker + sdk + channels): - Write the dedup row when *any* branch dispatched, not only when both did. A public reply that went out while the private one threw used to leave no row, so the contact's next comment posted the public reply a second time. - Roll the dedup row back when an AI reply job bails out (agent missing, no text, workspace outside active hours). It used to count as "replied", and `replyOncePerUserPerPost` then blocked that contact on that post forever. A thrown failure still keeps the row โ€” BullMQ retries it. - Skip a private reply once another automation on the same comment has spent it: Meta allows exactly one comment_id-anchored DM per comment, so the second call could only fail. Public replies of that automation still run. - Skip a private reply for a comment older than Meta's 7-day window, delay included, instead of letting the Send API reject it. - Keep a claimed private anchor travelling as `spent: true` rather than dropping it, so each channel's `sendFlowStep` can tell a comment-triggered follow-up from a plain flow message. Message two onward now sends as a normal DM inside the contact's 24-hour window and otherwise throws `comment_private_reply_already_used`, which lands on the message row as a `sendError` the inbox shows. Before, Meta rejected it and the error was swallowed, so a two-message flow looked half-delivered with no reason. - Log when the incoming comment's message row is missing: like, hide and parent threading were being skipped with no trace. Media steps (flow-config + builder + Instagram): - `media-step-rules` / `media-step-validators` describe which media a channel accepts, surfaced in the builder as a notice on the send-* step editors. - Instagram comment replies are text-only (`POST /{ig-comment-id}/replies` has no `attachment_url`), so both variants' `sendComment` now throw `PAYLOAD_INVALID` instead of returning an empty result behind a warn. - Instagram-via-Facebook collects a step's messages before sending so quick replies land on the last one, and upload failures propagate to the inbox. Co-authored-by: Deathgiver <anonymous@users.noreply.github.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
1 parent 73b8234 commit 674c90f

65 files changed

Lines changed: 3083 additions & 276 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

โ€Ž.agents/skills/fb-comment-automation/SKILL.mdโ€Ž

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,28 @@ Read it before non-trivial changes. This skill is the quick map + the traps.
8686
falls through to `automatedResponse`). Private uses
8787
`resolveDirectMessageConversationId`; public deliberately keeps `ctx.conversationId`,
8888
because the contact's next comment resolves back to that same conversation. Never
89-
"unify" the two branches. `commentAnchor` is orthogonal โ€” it only decides how the first
90-
message is delivered.
89+
"unify" the two branches. `commentAnchor` is orthogonal โ€” it decides *delivery*: a
90+
`private` anchor is one-shot (Meta allows one comment_id-anchored DM per comment, so the
91+
first message-producing step claims it), a `public` one is never consumed and every step
92+
of the run posts as a comment reply. A claimed private anchor is **not dropped** โ€” it
93+
rides on as `spent: true` so each channel's `sendFlowStep` can tell a comment-triggered
94+
follow-up from a plain flow message and gate it on `contact.lastIncomingMessageAt` via
95+
`assertCommentPrivateReplyFollowUpDeliverable` (`@chatbotx.io/sdk`): inside the 24h
96+
window it sends as a normal DM, outside it throws
97+
`comment_private_reply_already_used` โ†’ visible `sendError`. Never "restore" the drop;
98+
that turns the failure back into a Send API rejection swallowed by `sendFlowStep`.
9199

92100
8. **`options.trackUserTags` is a no-op** (defined, not implemented). Every other option
93101
(including `replyToUsersWhoCommentedOnOtherPosts`) IS enforced โ€” see the option table in
94102
the docs.
95103

104+
9. **Instagram comment replies carry text only.** `POST /{ig-comment-id}/replies` has no
105+
`attachment_url` โ€” that is Facebook-Page-only (`integrations/messenger`). Both Instagram
106+
variants' `sendComment` throw `ChannelError(PAYLOAD_INVALID)` when the message has
107+
attachments, so a media step of a public reply flow surfaces a `sendError` in the inbox
108+
instead of disappearing behind a `logger.warn`. Never "fix" that back into an empty
109+
`{ messageIds: [] }` return.
110+
96111
## Adding a new filter option (recipe)
97112

98113
1. Add the field to `fbCommentOptionsSchema` (partials) + DB default in the schema file

โ€Žapps/builder/messages/ar.jsonโ€Ž

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2524,7 +2524,11 @@
25242524
"sendText": {
25252525
"tiktokTitleTruncated": "ุนู†ุฏ ุฅุฑูุงู‚ ุฃุฒุฑุงุฑุŒ ูŠุฑุณู„ TikTok ุฃูˆู„ 40 ุญุฑูู‹ุง ูู‚ุท ู…ู† ู‡ุฐู‡ ุงู„ุฑุณุงู„ุฉุŒ ูˆุณูŠุชู… ู‚ุต ุงู„ุจุงู‚ูŠ."
25262526
},
2527-
"dataWasSaved": "ุชู… ุญูุธ ุงู„ุจูŠุงู†ุงุช"
2527+
"dataWasSaved": "ุชู… ุญูุธ ุงู„ุจูŠุงู†ุงุช",
2528+
"media": {
2529+
"stepUnsupportedOnChannel": "ู„ุง ูŠู…ูƒู† ู„ู‡ุฐู‡ ุงู„ู‚ู†ุงุฉ ุฅุฑุณุงู„ ู‡ุฐุง ุงู„ู†ูˆุน ู…ู† ุงู„ูˆุณุงุฆุท โ€” ุณูŠุชู… ุชุฎุทูŠ ุงู„ุฎุทูˆุฉ. ุฃุฒูู„ู‡ุง ุฃูˆ ุบูŠูู‘ุฑ ู‚ู†ุงุฉ ุงู„ุนู‚ุฏุฉ ุฅู„ู‰ ู‚ู†ุงุฉ ุชุฏุนู…ู‡ุง.",
2530+
"buttonsSkippedOnChannel": "ู„ุง ูŠู…ูƒู† ู„ู‡ุฐู‡ ุงู„ู‚ู†ุงุฉ ุฅุฑุณุงู„ ุฃุฒุฑุงุฑ ู…ุน ุฑุณุงู„ุฉ ูˆุณุงุฆุท โ€” ุณูŠุชู… ุชุฎุทูŠู‡ุง. ุฃุถููู‡ุง ุฅู„ู‰ ุฎุทูˆุฉ ู†ุตูŠุฉ ุชุงู„ูŠุฉ ุจุฏู„ุงู‹ ู…ู† ุฐู„ูƒ."
2531+
}
25282532
},
25292533
"folders": {
25302534
"heading": {
@@ -3179,7 +3183,9 @@
31793183
"waTemplateMpmTooManySections": "ูŠู…ูƒู† ุฃู† ูŠุญุชูˆูŠ ุฒุฑ ุงู„ู…ู†ุชุฌุงุช ุงู„ู…ุชุนุฏุฏุฉ ุนู„ู‰ 10 ุฃู‚ุณุงู… ูƒุญุฏ ุฃู‚ุตู‰. ุฃุฒู„ ุจุนุถ ุงู„ุฃู‚ุณุงู… ู‚ุจู„ ุงู„ู†ุดุฑ.",
31803184
"waTemplateMpmTooManyProducts": "ูŠู…ูƒู† ุฃู† ูŠุญุชูˆูŠ ุฒุฑ ุงู„ู…ู†ุชุฌุงุช ุงู„ู…ุชุนุฏุฏุฉ ุนู„ู‰ 30 ู…ู†ุชุฌู‹ุง ูƒุญุฏ ุฃู‚ุตู‰ ุฅุฌู…ุงู„ุงู‹. ุฃุฒู„ ุจุนุถ ุงู„ู…ู†ุชุฌุงุช ู‚ุจู„ ุงู„ู†ุดุฑ.",
31813185
"waTemplateLtoExpirationRequired": "ุงุฎุชุฑ ุชุงุฑูŠุฎ ุงู†ุชู‡ุงุก ุงู„ุนุฑุถ ุงู„ู…ุญุฏูˆุฏ ุงู„ู…ุฏุฉ ู‚ุจู„ ุงู„ุฅุฑุณุงู„.",
3182-
"waTemplateMpmIncompleteProducts": "ูŠุญุชุงุฌ ูƒู„ ู‚ุณู… ุฅู„ู‰ ู…ู†ุชุฌ ูˆุงุญุฏ ู…ุญุฏุฏ ุนู„ู‰ ุงู„ุฃู‚ู„ โ€” ุงุญุฐู ุงู„ุตููˆู ุงู„ูุงุฑุบุฉ ุฃูˆ ุงุฎุชุฑ ู…ู†ุชุฌู‹ุง ู„ู‡ุง."
3186+
"waTemplateMpmIncompleteProducts": "ูŠุญุชุงุฌ ูƒู„ ู‚ุณู… ุฅู„ู‰ ู…ู†ุชุฌ ูˆุงุญุฏ ู…ุญุฏุฏ ุนู„ู‰ ุงู„ุฃู‚ู„ โ€” ุงุญุฐู ุงู„ุตููˆู ุงู„ูุงุฑุบุฉ ุฃูˆ ุงุฎุชุฑ ู…ู†ุชุฌู‹ุง ู„ู‡ุง.",
3187+
"mediaStepUnsupported": "ู„ุง ูŠู…ูƒู† ู„ู‡ุฐู‡ ุงู„ู‚ู†ุงุฉ ุฅุฑุณุงู„ ู‡ุฐุง ุงู„ู†ูˆุน ู…ู† ุงู„ูˆุณุงุฆุท. ุฃุฒูู„ ุงู„ุฎุทูˆุฉ ุฃูˆ ูˆุฌูู‘ู‡ ู‡ุฐู‡ ุงู„ุนู‚ุฏุฉ ุฅู„ู‰ ู‚ู†ุงุฉ ุชุฏุนู…ู‡ุง.",
3188+
"mediaButtonsUnsupported": "ู„ุง ูŠู…ูƒู† ู„ู‡ุฐู‡ ุงู„ู‚ู†ุงุฉ ุฅุฑุณุงู„ ุฃุฒุฑุงุฑ ู…ุน ุฑุณุงู„ุฉ ูˆุณุงุฆุท. ุฃุฒูู„ ุงู„ุฃุฒุฑุงุฑ ุฃูˆ ุงู†ู‚ู„ู‡ุง ุฅู„ู‰ ุฎุทูˆุฉ ู†ุตูŠุฉ ุจุนุฏ ู‡ุฐู‡ ุงู„ุฎุทูˆุฉ."
31833189
},
31843190
"instagram": {
31853191
"description": "ูŠุชูŠุญ ู„ูƒ ู‡ุฐุง ุงู„ุชูƒุงู…ู„ ุฅู†ุดุงุก ุจูˆุชุงุช Instagram.",

โ€Žapps/builder/messages/da.jsonโ€Ž

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2387,7 +2387,11 @@
23872387
"sendText": {
23882388
"tiktokTitleTruncated": "Nรฅr der er tilfรธjet knapper, sender TikTok kun de fรธrste 40 tegn af denne besked โ€” resten bliver klippet vรฆk."
23892389
},
2390-
"dataWasSaved": "Data blev gemt"
2390+
"dataWasSaved": "Data blev gemt",
2391+
"media": {
2392+
"stepUnsupportedOnChannel": "Denne kanal kan ikke sende denne medietype โ€“ trinnet springes over der. Fjern det, eller skift noden til en kanal der understรธtter det.",
2393+
"buttonsSkippedOnChannel": "Denne kanal kan ikke sende knapper sammen med en mediebesked โ€“ de springes over der. Lรฆg dem i stedet pรฅ et efterfรธlgende teksttrin."
2394+
}
23912395
},
23922396
"folders": {
23932397
"heading": {
@@ -3179,7 +3183,9 @@
31793183
"waTemplateMpmTooManySections": "En multiprodukt-knap kan hรธjst have 10 sektioner. Fjern nogle sektioner fรธr udgivelse.",
31803184
"waTemplateMpmTooManyProducts": "En multiprodukt-knap kan hรธjst have 30 produkter i alt. Fjern nogle produkter fรธr udgivelse.",
31813185
"waTemplateLtoExpirationRequired": "Vรฆlg en udlรธbsdato for tilbuddet, fรธr du sender.",
3182-
"waTemplateMpmIncompleteProducts": "Hver sektion skal have mindst รฉt valgt produkt โ€” fjern tomme rรฆkker, eller vรฆlg et produkt til dem."
3186+
"waTemplateMpmIncompleteProducts": "Hver sektion skal have mindst รฉt valgt produkt โ€” fjern tomme rรฆkker, eller vรฆlg et produkt til dem.",
3187+
"mediaStepUnsupported": "Denne kanal kan ikke sende denne medietype. Fjern trinnet, eller peg noden mod en kanal der understรธtter det.",
3188+
"mediaButtonsUnsupported": "Denne kanal kan ikke sende knapper sammen med en mediebesked. Fjern knapperne, eller flyt dem til et teksttrin efter dette."
31833189
},
31843190
"instagram": {
31853191
"description": "Denne integration lets du opret Instagram bots.",

โ€Žapps/builder/messages/de.jsonโ€Ž

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2387,7 +2387,11 @@
23872387
"sendText": {
23882388
"tiktokTitleTruncated": "Wenn Schaltflรคchen angehรคngt sind, sendet TikTok nur die ersten 40 Zeichen dieser Nachricht โ€“ der Rest wird abgeschnitten."
23892389
},
2390-
"dataWasSaved": "Daten wurden gespeichert"
2390+
"dataWasSaved": "Daten wurden gespeichert",
2391+
"media": {
2392+
"stepUnsupportedOnChannel": "Dieser Kanal kann diesen Medientyp nicht senden โ€“ der Schritt wird dort รผbersprungen. Entferne ihn oder stelle den Node auf einen Kanal um, der ihn unterstรผtzt.",
2393+
"buttonsSkippedOnChannel": "Dieser Kanal kann keine Buttons mit einer Mediennachricht senden โ€“ dort werden sie รผbersprungen. Platziere sie stattdessen in einem folgenden Textschritt."
2394+
}
23912395
},
23922396
"folders": {
23932397
"heading": {
@@ -3179,7 +3183,9 @@
31793183
"waTemplateMpmTooManySections": "Eine Multi-Produkt-Schaltflรคche kann hรถchstens 10 Abschnitte haben. Entferne einige Abschnitte, bevor du verรถffentlichst.",
31803184
"waTemplateMpmTooManyProducts": "Eine Multi-Produkt-Schaltflรคche kann insgesamt hรถchstens 30 Produkte haben. Entferne einige Produkte, bevor du verรถffentlichst.",
31813185
"waTemplateLtoExpirationRequired": "Wรคhle ein Ablaufdatum fรผr das zeitlich begrenzte Angebot, bevor du sendest.",
3182-
"waTemplateMpmIncompleteProducts": "Jeder Abschnitt braucht mindestens ein ausgewรคhltes Produkt โ€” entferne leere Zeilen oder wรคhle ein Produkt aus."
3186+
"waTemplateMpmIncompleteProducts": "Jeder Abschnitt braucht mindestens ein ausgewรคhltes Produkt โ€” entferne leere Zeilen oder wรคhle ein Produkt aus.",
3187+
"mediaStepUnsupported": "Dieser Kanal kann diesen Medientyp nicht senden. Entferne den Schritt oder richte diesen Node auf einen Kanal aus, der ihn unterstรผtzt.",
3188+
"mediaButtonsUnsupported": "Dieser Kanal kann keine Buttons mit einer Mediennachricht senden. Entferne die Buttons oder verschiebe sie in einen Textschritt nach diesem."
31833189
},
31843190
"instagram": {
31853191
"description": "Mit dieser Integration kรถnnen Sie Instagram-Bots erstellen.",

โ€Žapps/builder/messages/en.jsonโ€Ž

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2711,7 +2711,11 @@
27112711
"sendText": {
27122712
"tiktokTitleTruncated": "With buttons attached, TikTok only sends the first 40 characters of this message โ€” the rest will be cut off."
27132713
},
2714-
"dataWasSaved": "Data was saved"
2714+
"dataWasSaved": "Data was saved",
2715+
"media": {
2716+
"stepUnsupportedOnChannel": "This channel can't send this media type โ€” the step is skipped there. Remove it, or switch the node to a channel that supports it.",
2717+
"buttonsSkippedOnChannel": "This channel can't send buttons with a media message โ€” they are skipped there. Put them on a following text step instead."
2718+
}
27152719
},
27162720
"folders": {
27172721
"heading": {
@@ -3366,7 +3370,9 @@
33663370
"waTemplateMpmTooManySections": "A multi-product button can have at most 10 sections. Remove some sections before publishing.",
33673371
"waTemplateMpmTooManyProducts": "A multi-product button can have at most 30 products in total. Remove some products before publishing.",
33683372
"waTemplateLtoExpirationRequired": "Pick an expiration date for the limited-time offer before sending.",
3369-
"waTemplateMpmIncompleteProducts": "Every section needs at least one selected product โ€” remove empty rows or pick a product for them."
3373+
"waTemplateMpmIncompleteProducts": "Every section needs at least one selected product โ€” remove empty rows or pick a product for them.",
3374+
"mediaStepUnsupported": "This channel can't send this media type. Remove the step, or point this node at a channel that supports it.",
3375+
"mediaButtonsUnsupported": "This channel can't send buttons with a media message. Remove the buttons, or move them to a text step after this one."
33703376
},
33713377
"instagram": {
33723378
"description": "This integration lets you create Instagram bots.",

โ€Žapps/builder/messages/es.jsonโ€Ž

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2524,7 +2524,11 @@
25242524
"sendText": {
25252525
"tiktokTitleTruncated": "Cuando se adjuntan botones, TikTok solo envรญa los primeros 40 caracteres de este mensaje; el resto se recortarรก."
25262526
},
2527-
"dataWasSaved": "Datos guardados"
2527+
"dataWasSaved": "Datos guardados",
2528+
"media": {
2529+
"stepUnsupportedOnChannel": "Este canal no puede enviar este tipo de contenido: el paso se omite allรญ. Quรญtalo o cambia el nodo a un canal que lo admita.",
2530+
"buttonsSkippedOnChannel": "Este canal no puede enviar botones junto con un mensaje multimedia: allรญ se omiten. Colรณcalos en un paso de texto posterior."
2531+
}
25282532
},
25292533
"folders": {
25302534
"heading": {
@@ -3179,7 +3183,9 @@
31793183
"waTemplateMpmTooManySections": "Un botรณn multiproducto puede tener como mรกximo 10 secciones. Elimina algunas secciones antes de publicar.",
31803184
"waTemplateMpmTooManyProducts": "Un botรณn multiproducto puede tener como mรกximo 30 productos en total. Elimina algunos productos antes de publicar.",
31813185
"waTemplateLtoExpirationRequired": "Elige una fecha de vencimiento para la oferta por tiempo limitado antes de enviar.",
3182-
"waTemplateMpmIncompleteProducts": "Cada secciรณn necesita al menos un producto seleccionado: elimina las filas vacรญas o elige un producto."
3186+
"waTemplateMpmIncompleteProducts": "Cada secciรณn necesita al menos un producto seleccionado: elimina las filas vacรญas o elige un producto.",
3187+
"mediaStepUnsupported": "Este canal no puede enviar este tipo de contenido. Quita el paso o apunta este nodo a un canal que lo admita.",
3188+
"mediaButtonsUnsupported": "Este canal no puede enviar botones junto con un mensaje multimedia. Quita los botones o muรฉvelos a un paso de texto posterior."
31833189
},
31843190
"instagram": {
31853191
"description": "This integraciรณn lets tรบ Crear Instagram bots.",

โ€Žapps/builder/messages/fi.jsonโ€Ž

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2387,7 +2387,11 @@
23872387
"sendText": {
23882388
"tiktokTitleTruncated": "Kun painikkeita on liitetty, TikTok lรคhettรครค vain tรคmรคn viestin ensimmรคiset 40 merkkiรค โ€” loput katkaistaan."
23892389
},
2390-
"dataWasSaved": "Tiedot tallennettiin"
2390+
"dataWasSaved": "Tiedot tallennettiin",
2391+
"media": {
2392+
"stepUnsupportedOnChannel": "Tรคmรค kanava ei voi lรคhettรครค tรคtรค mediatyyppiรค โ€“ vaihe ohitetaan siellรค. Poista se tai vaihda solmun kanava sellaiseen, joka tukee sitรค.",
2393+
"buttonsSkippedOnChannel": "Tรคmรค kanava ei voi lรคhettรครค painikkeita mediaviestin mukana โ€“ ne ohitetaan siellรค. Sijoita ne sen sijaan seuraavaan tekstivaiheeseen."
2394+
}
23912395
},
23922396
"folders": {
23932397
"heading": {
@@ -3179,7 +3183,9 @@
31793183
"waTemplateMpmTooManySections": "Usean tuotteen painikkeessa voi olla enintรครคn 10 osiota. Poista osioita ennen julkaisua.",
31803184
"waTemplateMpmTooManyProducts": "Usean tuotteen painikkeessa voi olla yhteensรค enintรครคn 30 tuotetta. Poista tuotteita ennen julkaisua.",
31813185
"waTemplateLtoExpirationRequired": "Valitse mรครคrรคaikaisen tarjouksen pรครคttymisaika ennen lรคhettรคmistรค.",
3182-
"waTemplateMpmIncompleteProducts": "Jokaisessa osiossa on oltava vรคhintรครคn yksi valittu tuote โ€” poista tyhjรคt rivit tai valitse niille tuote."
3186+
"waTemplateMpmIncompleteProducts": "Jokaisessa osiossa on oltava vรคhintรครคn yksi valittu tuote โ€” poista tyhjรคt rivit tai valitse niille tuote.",
3187+
"mediaStepUnsupported": "Tรคmรค kanava ei voi lรคhettรครค tรคtรค mediatyyppiรค. Poista vaihe tai osoita tรคmรค solmu kanavalle, joka tukee sitรค.",
3188+
"mediaButtonsUnsupported": "Tรคmรค kanava ei voi lรคhettรครค painikkeita mediaviestin mukana. Poista painikkeet tai siirrรค ne tรคmรคn jรคlkeiseen tekstivaiheeseen."
31833189
},
31843190
"instagram": {
31853191
"description": "Tรคmรคn integraation avulla voit luoda Instagram-botteja.",

โ€Žapps/builder/messages/fr.jsonโ€Ž

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2387,7 +2387,11 @@
23872387
"sendText": {
23882388
"tiktokTitleTruncated": "Lorsque des boutons sont ajoutรฉs, TikTok n'envoie que les 40 premiers caractรจres de ce message โ€” le reste sera coupรฉ."
23892389
},
2390-
"dataWasSaved": "Les donnรฉes ont รฉtรฉ enregistrรฉes"
2390+
"dataWasSaved": "Les donnรฉes ont รฉtรฉ enregistrรฉes",
2391+
"media": {
2392+
"stepUnsupportedOnChannel": "Ce canal ne peut pas envoyer ce type de mรฉdia : l'รฉtape y est ignorรฉe. Supprimez-la ou basculez le nล“ud vers un canal qui le prend en charge.",
2393+
"buttonsSkippedOnChannel": "Ce canal ne peut pas envoyer de boutons avec un message mรฉdia : ils y sont ignorรฉs. Placez-les plutรดt dans une รฉtape de texte suivante."
2394+
}
23912395
},
23922396
"folders": {
23932397
"heading": {
@@ -3179,7 +3183,9 @@
31793183
"waTemplateMpmTooManySections": "Un bouton multi-produits peut comporter au maximum 10 sections. Supprimez des sections avant de publier.",
31803184
"waTemplateMpmTooManyProducts": "Un bouton multi-produits peut comporter au maximum 30 produits au total. Supprimez des produits avant de publier.",
31813185
"waTemplateLtoExpirationRequired": "Choisissez une date d'expiration pour l'offre ร  durรฉe limitรฉe avant l'envoi.",
3182-
"waTemplateMpmIncompleteProducts": "Chaque section doit contenir au moins un produit sรฉlectionnรฉ โ€” supprimez les lignes vides ou choisissez un produit."
3186+
"waTemplateMpmIncompleteProducts": "Chaque section doit contenir au moins un produit sรฉlectionnรฉ โ€” supprimez les lignes vides ou choisissez un produit.",
3187+
"mediaStepUnsupported": "Ce canal ne peut pas envoyer ce type de mรฉdia. Supprimez l'รฉtape ou orientez ce nล“ud vers un canal qui le prend en charge.",
3188+
"mediaButtonsUnsupported": "Ce canal ne peut pas envoyer de boutons avec un message mรฉdia. Supprimez les boutons ou dรฉplacez-les vers une รฉtape de texte suivante."
31833189
},
31843190
"instagram": {
31853191
"description": "Cette intรฉgration permet de crรฉer des bots Instagram.",

โ€Žapps/builder/messages/he.jsonโ€Ž

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,11 @@
530530
"sendText": {
531531
"tiktokTitleTruncated": "ื›ืืฉืจ ืžืฆื•ืจืคื™ื ื›ืคืชื•ืจื™ื, ื˜ื™ืงื˜ื•ืง ืฉื•ืœื— ืจืง ืืช 40 ื”ืชื•ื•ื™ื ื”ืจืืฉื•ื ื™ื ืฉืœ ื”ื”ื•ื“ืขื” ื”ื–ื• โ€” ื”ืฉืืจ ื™ื™ื—ืชืš."
532532
},
533-
"dataWasSaved": "ื”ื ืชื•ื ื™ื ื ืฉืžืจื•"
533+
"dataWasSaved": "ื”ื ืชื•ื ื™ื ื ืฉืžืจื•",
534+
"media": {
535+
"stepUnsupportedOnChannel": "ืขืจื•ืฅ ื–ื” ืœื ื™ื›ื•ืœ ืœืฉืœื•ื— ืกื•ื’ ืžื“ื™ื” ื–ื” โ€” ื”ืฉืœื‘ ื™ื“ื•ืœื’ ืฉื. ื”ืกืจ ืื•ืชื• ืื• ื”ืขื‘ืจ ืืช ื”ืฆื•ืžืช ืœืขืจื•ืฅ ืฉืชื•ืžืš ื‘ื›ืš.",
536+
"buttonsSkippedOnChannel": "ืขืจื•ืฅ ื–ื” ืœื ื™ื›ื•ืœ ืœืฉืœื•ื— ื›ืคืชื•ืจื™ื ืขื ื”ื•ื“ืขืช ืžื“ื™ื” โ€” ื”ื ื™ื“ื•ืœื’ื• ืฉื. ื”ื•ืกืฃ ืื•ืชื ืœืฉืœื‘ ื˜ืงืกื˜ ืฉืœืื—ืจ ืžื›ืŸ."
537+
}
534538
},
535539
"folders": {
536540
"heading": {
@@ -1322,7 +1326,9 @@
13221326
"waTemplateMpmTooManySections": "ืœื›ืคืชื•ืจ ืจื‘-ืžื•ืฆืจื™ื ื™ื›ื•ืœื™ื ืœื”ื™ื•ืช ืขื“ 10 ืžืงื˜ืขื™ื ืœื›ืœ ื”ื™ื•ืชืจ. ื”ืกืจ ืžืงื˜ืขื™ื ืœืคื ื™ ื”ืคืจืกื•ื.",
13231327
"waTemplateMpmTooManyProducts": "ืœื›ืคืชื•ืจ ืจื‘-ืžื•ืฆืจื™ื ื™ื›ื•ืœื™ื ืœื”ื™ื•ืช ืขื“ 30 ืžื•ืฆืจื™ื ื‘ืกืš ื”ื›ืœ. ื”ืกืจ ืžื•ืฆืจื™ื ืœืคื ื™ ื”ืคืจืกื•ื.",
13241328
"waTemplateLtoExpirationRequired": "ื‘ื—ืจื• ืชืืจื™ืš ืชืคื•ื’ื” ืœืžื‘ืฆืข ื”ืžื•ื’ื‘ืœ ื‘ื–ืžืŸ ืœืคื ื™ ื”ืฉืœื™ื—ื”.",
1325-
"waTemplateMpmIncompleteProducts": "ื›ืœ ืžืงื˜ืข ืฆืจื™ืš ืœืคื—ื•ืช ืžื•ืฆืจ ืื—ื“ ืฉื ื‘ื—ืจ โ€” ื”ืกื™ืจื• ืฉื•ืจื•ืช ืจื™ืงื•ืช ืื• ื‘ื—ืจื• ืœื”ืŸ ืžื•ืฆืจ."
1329+
"waTemplateMpmIncompleteProducts": "ื›ืœ ืžืงื˜ืข ืฆืจื™ืš ืœืคื—ื•ืช ืžื•ืฆืจ ืื—ื“ ืฉื ื‘ื—ืจ โ€” ื”ืกื™ืจื• ืฉื•ืจื•ืช ืจื™ืงื•ืช ืื• ื‘ื—ืจื• ืœื”ืŸ ืžื•ืฆืจ.",
1330+
"mediaStepUnsupported": "ืขืจื•ืฅ ื–ื” ืœื ื™ื›ื•ืœ ืœืฉืœื•ื— ืกื•ื’ ืžื“ื™ื” ื–ื”. ื”ืกืจ ืืช ื”ืฉืœื‘ ืื• ื”ืคื ื” ืืช ื”ืฆื•ืžืช ืœืขืจื•ืฅ ืฉืชื•ืžืš ื‘ื›ืš.",
1331+
"mediaButtonsUnsupported": "ืขืจื•ืฅ ื–ื” ืœื ื™ื›ื•ืœ ืœืฉืœื•ื— ื›ืคืชื•ืจื™ื ืขื ื”ื•ื“ืขืช ืžื“ื™ื”. ื”ืกืจ ืืช ื”ื›ืคืชื•ืจื™ื ืื• ื”ืขื‘ืจ ืื•ืชื ืœืฉืœื‘ ื˜ืงืกื˜ ืฉืœืื—ืจ ืฉืœื‘ ื–ื”."
13261332
},
13271333
"instagram": {
13281334
"description": "ืฉื™ืœื•ื‘ ื–ื” ืžืืคืฉืจ ืœื™ืฆื•ืจ ื‘ื•ื˜ื™ื ืœ-Instagram.",

โ€Žapps/builder/messages/id.jsonโ€Ž

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2387,7 +2387,11 @@
23872387
"sendText": {
23882388
"tiktokTitleTruncated": "Saat tombol dilampirkan, TikTok hanya mengirim 40 karakter pertama pesan ini โ€” sisanya akan terpotong."
23892389
},
2390-
"dataWasSaved": "Data telah disimpan"
2390+
"dataWasSaved": "Data telah disimpan",
2391+
"media": {
2392+
"stepUnsupportedOnChannel": "Saluran ini tidak dapat mengirim jenis media ini โ€” langkahnya dilewati di sana. Hapus langkah ini, atau ubah node ke saluran yang mendukungnya.",
2393+
"buttonsSkippedOnChannel": "Saluran ini tidak dapat mengirim tombol bersama pesan media โ€” tombol dilewati di sana. Letakkan pada langkah teks berikutnya saja."
2394+
}
23912395
},
23922396
"folders": {
23932397
"heading": {
@@ -3179,7 +3183,9 @@
31793183
"waTemplateMpmTooManySections": "Tombol multi-produk dapat memiliki maksimal 10 bagian. Hapus beberapa bagian sebelum memublikasikan.",
31803184
"waTemplateMpmTooManyProducts": "Tombol multi-produk dapat memiliki maksimal total 30 produk. Hapus beberapa produk sebelum memublikasikan.",
31813185
"waTemplateLtoExpirationRequired": "Pilih tanggal berakhir untuk penawaran waktu terbatas sebelum mengirim.",
3182-
"waTemplateMpmIncompleteProducts": "Setiap bagian membutuhkan minimal satu produk terpilih โ€” hapus baris kosong atau pilih produknya."
3186+
"waTemplateMpmIncompleteProducts": "Setiap bagian membutuhkan minimal satu produk terpilih โ€” hapus baris kosong atau pilih produknya.",
3187+
"mediaStepUnsupported": "Saluran ini tidak dapat mengirim jenis media ini. Hapus langkahnya, atau arahkan node ini ke saluran yang mendukungnya.",
3188+
"mediaButtonsUnsupported": "Saluran ini tidak dapat mengirim tombol bersama pesan media. Hapus tombolnya, atau pindahkan ke langkah teks setelah langkah ini."
31833189
},
31843190
"instagram": {
31853191
"description": "Integrasi ini memungkinkan Anda membuat bot Instagram.",

0 commit comments

Comments
ย (0)