Commit Graph

617 Commits

Author SHA1 Message Date
Arnas Donauskas
6e1d729312
Merge pull request #435 from ArnasDon/dependabot/npm_and_yarn/next-intl-4.13.4
chore(deps): bump next-intl from 4.13.2 to 4.13.4
2026-07-29 09:34:13 +03:00
Arnas Donauskas
71c40954e1
Merge pull request #436 from ArnasDon/dependabot/npm_and_yarn/lucide-react-1.27.0
chore(deps): bump lucide-react from 1.22.0 to 1.27.0
2026-07-29 09:34:07 +03:00
Arnas Donauskas
1e238e870e
Merge pull request #437 from ArnasDon/dependabot/npm_and_yarn/xyflow/react-12.11.2
chore(deps): bump @xyflow/react from 12.11.0 to 12.11.2
2026-07-29 09:34:00 +03:00
Arnas Donauskas
fc1f19b72a
Merge pull request #444 from ArnasDon/fix/409-automation-dispatch-reliability
fix(automations): stop inbound runs being dropped and mislogged
2026-07-29 09:33:49 +03:00
Arnas Donauskas
6739808fdb
Merge pull request #434 from ArnasDon/dependabot/npm_and_yarn/dev-dependencies-cfca897456
chore(deps-dev): bump the dev-dependencies group with 3 updates
2026-07-29 09:33:28 +03:00
Arnas Donauskas
77d37fb023 Merge main into dev-dependencies bump, resolving the conflicts
`main` moved next 16.2.6 → 16.2.12 (#441) and applied transitive audit
fixes (#442) since this branch was cut, so both manifests conflicted.

Resolved by taking main's manifests and re-applying the group's bumps on
top: prettier ^3.9.6 and prettier-plugin-tailwindcss ^0.8.1 in
package.json, plus tailwindcss and @tailwindcss/postcss 4.3.2 → 4.3.3,
which are lockfile-only here because both are specced as `^4`. Lockfile
regenerated with npm 10 — the version CI's Node 20 ships, so the nested
optional-peer @swc/helpers entry `npm ci` needs is preserved.

Verified next 16.2.12 and #442's transitive versions all hold, and
`npm ci` succeeds.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-29 09:29:22 +03:00
Arnas Donauskas
220fcaf846 Merge main into lucide-react bump, resolving the dependency conflicts
`main` moved next 16.2.6 → 16.2.12 (#441) and applied transitive audit
fixes (#442) since this branch was cut, so both manifests conflicted.

Resolved by taking main's manifests and re-applying only this branch's
`lucide-react` bump, then regenerating package-lock.json with npm 10 —
the version CI's Node 20 ships, so the nested optional-peer @swc/helpers
entry `npm ci` needs is preserved. Verified next 16.2.12, lucide-react
1.27.0, and #442's transitive versions all hold, and `npm ci` succeeds.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-29 09:27:33 +03:00
Arnas Donauskas
2c0a7b602e Merge main into next-intl bump, resolving the dependency conflicts
`main` moved next 16.2.6 → 16.2.12 (#441) and applied transitive audit
fixes (#442) since this branch was cut, so both manifests conflicted.

Resolved by keeping main's `next` and this branch's `next-intl`, then
regenerating package-lock.json from the merged package.json with npm 10 —
the version CI's Node 20 ships, so the nested optional-peer @swc/helpers
entry `npm ci` needs is preserved. Verified next 16.2.12, next-intl
4.13.4, and every audit-fixed transitive version from #442 survive, and
`npm ci` succeeds.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-29 09:25:22 +03:00
Arnas Donauskas
e406761aae
Merge pull request #442 from ArnasDon/chore/audit-fix-transitive-deps
chore(deps): audit-fix transitive deps to clear 7 open advisories
2026-07-29 09:19:06 +03:00
Arnas Donauskas
64f7611bc5
Merge pull request #441 from ArnasDon/chore/next-16.2.12-security
chore(deps): bump next to 16.2.12 to clear 8 open security advisories
2026-07-29 09:18:56 +03:00
Arnas Donauskas
840089f8cc
Merge pull request #440 from ArnasDon/fix/ghsa-6fr5-template-header-ssrf
fix(whatsapp): guard the template image-header fetch against SSRF
2026-07-28 16:31:25 +03:00
Arnas Donauskas
59dbf27f43 fix(automations): stop inbound runs being dropped and mislogged
Two defects that together produce the reported symptom — automation logs
that read `status: 'success'` with `steps_executed: []`.

1. The dispatch loop in the inbound webhook was fire-and-forget inside the
   route's `after()` block. `after()` only keeps the function alive for
   promises it can see, so the run could be frozen after the log row was
   inserted but before any step executed. This is the same failure mode as
   issue #301, recurring one level down — the comments on the AI auto-reply
   and `message.received` dispatches immediately below already spell out
   the invariant this violated. Now awaited; the per-iteration `.catch` is
   kept so one trigger type can't skip the rest of the loop.

2. `executeAutomation` seeded the log row with `status: 'success'` before
   running anything. A run that died mid-flight therefore left a permanent
   success with no steps, indistinguishable from an automation that
   genuinely had nothing to do. Seeded as `'failed'` instead, so the status
   only becomes success if execution actually reaches a terminal path. No
   migration needed — 'failed' is already in the column's CHECK constraint,
   and every terminal path overwrites it.

Two more points from the issue are deliberately not addressed here, as
both change existing behaviour and want a maintainer decision: switching
`contains` keyword matching to word boundaries (would alter which
automations fire for current users) and re-opening a closed conversation
on an inbound reply.

Refs #409.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 15:21:28 +03:00
Arnas Donauskas
6fdd2736e5 chore: regenerate package-lock.json with npm 10
CI installs with Node 20 (npm 10), which keeps next-intl's nested
optional-peer @swc/helpers entry; Dependabot generates the lockfile with
npm 11, which drops it, so `npm ci` fails as out-of-sync before any of
lint/typecheck/test/build runs. Regenerated with npm 10 — the only diff
is re-adding that nested entry.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 14:03:19 +03:00
Arnas Donauskas
f6e05b398e chore: regenerate package-lock.json with npm 10
CI installs with Node 20 (npm 10), which keeps next-intl's nested
optional-peer @swc/helpers entry; Dependabot generates the lockfile with
npm 11, which drops it, so `npm ci` fails as out-of-sync before any of
lint/typecheck/test/build runs. Regenerated with npm 10 — the only diff
is re-adding that nested entry.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 14:03:03 +03:00
Arnas Donauskas
c27e47a671 chore: regenerate package-lock.json with npm 10
CI installs with Node 20 (npm 10), which keeps next-intl's nested
optional-peer @swc/helpers entry; Dependabot generates the lockfile with
npm 11, which drops it, so `npm ci` fails as out-of-sync before any of
lint/typecheck/test/build runs. Regenerated with npm 10 — the only diff
is re-adding that nested entry.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 14:02:48 +03:00
Arnas Donauskas
ce33757362 chore: regenerate package-lock.json with npm 10
CI installs with Node 20 (npm 10), which keeps next-intl's nested
optional-peer @swc/helpers entry; Dependabot generates the lockfile with
npm 11, which drops it, so `npm ci` fails as out-of-sync before any of
lint/typecheck/test/build runs. Regenerated with npm 10 — the only diff
is re-adding that nested entry.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 14:02:33 +03:00
Arnas Donauskas
b751581bf4 chore(deps): audit-fix transitive deps to clear 7 open advisories
Lockfile-only bumps of indirect dependencies flagged by Dependabot;
no direct dependency or `package.json` entry changes.

- fast-uri 3.1.3 → 3.1.4 (two host-confusion advisories, high)
- js-yaml → 4.3.0 (quadratic CPU via YAML merge-key chains, high)
- hono → 4.12.32 and @hono/node-server → 2.0.12 (cross-request context
  disclosure in hono/jsx, serve-static path traversal on Windows)
- body-parser → 2.3.0 (size enforcement silently disabled on an invalid
  limit value)
- postcss → 8.5.24

Regenerated with npm 10 to match CI's Node 20, so the nested
`@swc/helpers` optional-peer entry `npm ci` needs is preserved.

Verified: `npm ci`, lint (39 warnings, unchanged from main), typecheck,
645 tests, and `next build` all pass.

Still open after this, and deliberately left alone: `next` (needs a
direct bump — separate branch), `sharp` (major, `--force` only), and
`brace-expansion` nested under the dev-only `@ts-morph/common`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 13:12:55 +03:00
Arnas Donauskas
6b4ddf6d6e chore(deps): bump next to 16.2.12 to clear 8 open security advisories
16.2.6 is in the vulnerable range for eight advisories, all patched in
16.2.11: SSRF in rewrites via an attacker-controlled destination
hostname, SSRF in Server Actions on custom servers, middleware/proxy
bypass in App Router, DoS in App Router Server Actions, DoS in the image
optimizer via SVG, unauthenticated disclosure of internal Server
Function endpoints, and two response-body cache-confusion issues.

`eslint-config-next` moves with it to keep the pair on one version.
Lockfile regenerated with npm 10 to match CI's Node 20 — the default
npm 11 drops next-intl's nested optional-peer `@swc/helpers` entry and
breaks `npm ci`.

Verified: lint (39 warnings, unchanged from main), typecheck, 645 tests,
and `next build` all pass on 16.2.12.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 13:11:24 +03:00
Arnas Donauskas
44183bc750 fix(whatsapp): guard the template image-header fetch against SSRF
`ensureImageHeaderHandle` fetched the caller-supplied `header_media_url`
server-side with no validation, so a template submit — an action any
authenticated member can perform — could reach loopback, RFC1918 and
cloud-metadata addresses, with the response status and content-type
echoed back through the thrown error.

Wire in the project's existing `isDeliverableUrl` guard, which the two
other outbound-fetch call sites (webhook delivery, automation
`send_webhook`) already use, and reuse their `redirect: 'manual'` +
timeout so a public URL can't 3xx-bounce to an internal one. The
rejection reuses the unreachable-host message verbatim so the failure
doesn't distinguish "blocked" from "down".

Addresses GHSA-6fr5-pxw7-r3xw.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 13:07:09 +03:00
dependabot[bot]
e6fb8d4751
chore(deps): bump @xyflow/react from 12.11.0 to 12.11.2
Bumps [@xyflow/react](https://github.com/xyflow/xyflow/tree/HEAD/packages/react) from 12.11.0 to 12.11.2.
- [Release notes](https://github.com/xyflow/xyflow/releases)
- [Changelog](https://github.com/xyflow/xyflow/blob/main/packages/react/CHANGELOG.md)
- [Commits](https://github.com/xyflow/xyflow/commits/@xyflow/react@12.11.2/packages/react)

---
updated-dependencies:
- dependency-name: "@xyflow/react"
  dependency-version: 12.11.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-27 10:35:48 +00:00
dependabot[bot]
dd843f7849
chore(deps): bump lucide-react from 1.22.0 to 1.27.0
Bumps [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) from 1.22.0 to 1.27.0.
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.27.0/packages/lucide-react)

---
updated-dependencies:
- dependency-name: lucide-react
  dependency-version: 1.27.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-27 10:35:41 +00:00
dependabot[bot]
f9c1d91024
chore(deps): bump next-intl from 4.13.2 to 4.13.4
Bumps [next-intl](https://github.com/amannn/next-intl) from 4.13.2 to 4.13.4.
- [Release notes](https://github.com/amannn/next-intl/releases)
- [Changelog](https://github.com/amannn/next-intl/blob/main/CHANGELOG.md)
- [Commits](https://github.com/amannn/next-intl/compare/v4.13.2...v4.13.4)

---
updated-dependencies:
- dependency-name: next-intl
  dependency-version: 4.13.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-27 10:35:34 +00:00
dependabot[bot]
12cfff5688
chore(deps-dev): bump the dev-dependencies group with 3 updates
Bumps the dev-dependencies group with 3 updates: [@tailwindcss/postcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-postcss), [prettier](https://github.com/prettier/prettier) and [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss).


Updates `@tailwindcss/postcss` from 4.3.2 to 4.3.3
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.3/packages/@tailwindcss-postcss)

Updates `prettier` from 3.9.5 to 3.9.6
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.9.5...3.9.6)

Updates `prettier-plugin-tailwindcss` from 0.8.0 to 0.8.1
- [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.8.0...v0.8.1)

---
updated-dependencies:
- dependency-name: "@tailwindcss/postcss"
  dependency-version: 4.3.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: prettier
  dependency-version: 3.9.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: prettier-plugin-tailwindcss
  dependency-version: 0.8.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-27 10:35:25 +00:00
Arnas Donauskas
3180f06da6
Merge pull request #411 from ArnasDon/dependabot/github_actions/actions/setup-node-7
chore(deps): bump actions/setup-node from 6 to 7
2026-07-21 14:40:10 +03:00
dependabot[bot]
b14637c1c3
chore(deps): bump actions/setup-node from 6 to 7
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6 to 7.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-20 10:35:02 +00:00
Arnas Donauskas
b24aa794b5
Merge pull request #399 from ArnasDon/fix/settings-nav-suspense
fix(settings): wrap useSearchParams pages in Suspense so navigation works in prod
2026-07-17 15:10:50 +03:00
Arnas Donauskas
8bbbe0a471
fix(settings): wrap useSearchParams pages in Suspense so nav works in prod
The settings page derived its active panel from `useSearchParams()` but
wasn't wrapped in a Suspense boundary. In Next 16 that fails the
production build ("missing Suspense with CSR bailout") and forces the
page to bail to full client-side rendering — shipping a settings screen
whose rail click handlers never wire up. Because the account-menu
Settings link targets `?tab=whatsapp`, users land on the WhatsApp panel
and can't navigate to any other section ("locked on WhatsApp").

Wrap the `useSearchParams` consumer in `<Suspense>` on the three
affected dashboard pages — settings, inbox, automations/new — mirroring
the split login/signup already use. Also add the missing
`Settings.sections.quick-replies` label, which was rendering as a raw
translation key in the settings rail.

Verified: production build now succeeds (previously errored out during
static generation); every settings rail section navigates correctly in a
production build.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 15:08:25 +03:00
Arnas Donauskas
8bbda771ce
Merge pull request #386 from Andeveling/contrib/feat-colombian-peso-currency
feat: add Colombian Peso (COP) currency option
2026-07-17 13:47:55 +03:00
Arnas Donauskas
27b0acf0d5
Merge pull request #366 from moduvoice/i18n/add-korean
feat(i18n): add Korean (ko) translation
2026-07-17 13:37:18 +03:00
Arnas Donauskas
b18b5fa8e0
Merge pull request #380 from ArnasDon/dependabot/npm_and_yarn/dev-dependencies-b44e82a8cb
chore(deps-dev): bump the dev-dependencies group with 4 updates
2026-07-17 13:36:02 +03:00
Arnas Donauskas
3e4ed3714d
Merge pull request #382 from ArnasDon/dependabot/npm_and_yarn/recharts-3.9.2
chore(deps): bump recharts from 3.8.1 to 3.9.2
2026-07-17 13:35:49 +03:00
Arnas Donauskas
3ca3ff512a
Merge pull request #383 from ArnasDon/dependabot/npm_and_yarn/next-intl-4.13.2
chore(deps): bump next-intl from 4.13.1 to 4.13.2
2026-07-17 13:35:40 +03:00
Arnas Donauskas
8725865198
fix(deps): restore nested @swc/helpers entry in lockfile
Dependabot's lockfile regeneration drops the nested
node_modules/next-intl/node_modules/@swc/helpers@0.5.23 optional-peer
entry that CI's `npm ci` (Node 20 / npm 10) requires, so the job failed
at install before lint/typecheck/test/build ran. Regenerated
package-lock.json with npm 10 to restore it; no dependency versions change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 13:31:54 +03:00
Arnas Donauskas
75a082cfe4
fix(deps): restore nested @swc/helpers entry in lockfile
Dependabot's lockfile regeneration drops the nested
node_modules/next-intl/node_modules/@swc/helpers@0.5.23 optional-peer
entry that CI's `npm ci` (Node 20 / npm 10) requires, so the job failed
at install before lint/typecheck/test/build ran. Regenerated
package-lock.json with npm 10 to restore it; no dependency versions change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 13:31:49 +03:00
Arnas Donauskas
356e198f93
fix(deps): restore nested @swc/helpers entry in lockfile
Dependabot's lockfile regeneration drops the nested
node_modules/next-intl/node_modules/@swc/helpers@0.5.23 optional-peer
entry that CI's `npm ci` (Node 20 / npm 10) requires, so the job failed
at install before lint/typecheck/test/build ran. Regenerated
package-lock.json with npm 10 to restore it; no dependency versions change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 13:31:44 +03:00
Arnas Donauskas
17cd16a52a
Merge pull request #391 from mooouuu/fix/missing-tags-translation
fix(i18n): add missing contact tags tab label
2026-07-17 12:48:26 +03:00
Arnas Donauskas
5413dd634a
Merge pull request #393 from mooouuu/feat/tag-added-trigger
feat(automations): dispatch tag added triggers
2026-07-17 12:48:18 +03:00
Arnas Donauskas
96e60adecf
Merge pull request #396 from opastorello/fix/cron-timing-safe
fix: use timing-safe compare for cron secret
2026-07-17 12:48:10 +03:00
Arnas Donauskas
f69c82aea0
Merge pull request #398 from ArnasDon/fix/365-login-ngrok-redirect
fix: full-page navigation after login so the session is applied (#365)
2026-07-17 12:41:47 +03:00
Arnas Donauskas
1110f1fb45
fix: full-page navigation after login so the session is applied (#365)
Login signed in client-side then soft-navigated with router.push into
/dashboard, a route the middleware gates on the Supabase session cookie.
The soft navigation can reach the protected route before the server
observes the freshly written cookies, so the middleware bounces it back
to /login -- which looks like the page "just refreshing" instead of
signing in. It surfaced over ngrok/HTTPS tunnels (added latency widens
the window) while staying hidden on localhost.

- login: navigate with window.location.href after signInWithPassword,
  mirroring the deliberate full reload the invite-accept flow already
  uses in join/[token]/page.tsx; drops the now-unused useRouter.
- next.config: allow-list common dev tunnel origins (ngrok, cloudflared,
  localtunnel) so Next 16 stops 403-ing dev-only resources over the
  tunnel, extendable via ALLOWED_DEV_ORIGINS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 12:29:01 +03:00
Nicolas Pastorello
ed4ce6b52e fix: use timing-safe compare for cron secret
Match flows cron implementation (timingSafeEqual).
2026-07-16 13:03:21 -03:00
Mauricio Martinez
292f52f903 feat(automations): dispatch tag added triggers 2026-07-16 00:26:21 -06:00
Mauricio Martinez
6a8744c003 fix(i18n): add missing contact tags tab label 2026-07-15 23:41:29 -06:00
Fabian Andres Parra Sanchez
3b48b6e3f4 feat: add Colombian Peso (COP) currency option 2026-07-14 06:55:31 -05:00
dependabot[bot]
eb3c6fdc20
chore(deps): bump next-intl from 4.13.1 to 4.13.2
Bumps [next-intl](https://github.com/amannn/next-intl) from 4.13.1 to 4.13.2.
- [Release notes](https://github.com/amannn/next-intl/releases)
- [Changelog](https://github.com/amannn/next-intl/blob/main/CHANGELOG.md)
- [Commits](https://github.com/amannn/next-intl/compare/v4.13.1...v4.13.2)

---
updated-dependencies:
- dependency-name: next-intl
  dependency-version: 4.13.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-13 10:36:42 +00:00
dependabot[bot]
0ec5de789a
chore(deps): bump recharts from 3.8.1 to 3.9.2
Bumps [recharts](https://github.com/recharts/recharts) from 3.8.1 to 3.9.2.
- [Release notes](https://github.com/recharts/recharts/releases)
- [Changelog](https://github.com/recharts/recharts/blob/main/CHANGELOG.md)
- [Commits](https://github.com/recharts/recharts/compare/v3.8.1...v3.9.2)

---
updated-dependencies:
- dependency-name: recharts
  dependency-version: 3.9.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-13 10:36:33 +00:00
dependabot[bot]
d9c1f5cc4a
chore(deps-dev): bump the dev-dependencies group with 4 updates
---
updated-dependencies:
- dependency-name: "@tailwindcss/postcss"
  dependency-version: 4.3.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: "@types/node"
  dependency-version: 26.1.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-dependencies
- dependency-name: prettier
  dependency-version: 3.9.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: vitest
  dependency-version: 4.1.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-13 10:35:52 +00:00
moduvoice
b8a0a99bdb feat(i18n): add Korean (ko) translation
Adds messages/ko.json — full next-intl translation covering all 12
namespaces (LoginPage, Sidebar, Header, ModeToggle, Dashboard, Inbox,
Contacts, Pipelines, Broadcasts, Automations, Flows, Settings).

Scoped to the language file only, per maintainer guidance on PR #362:
no changes to the default locale, component text, or any other file.

Verified 1:1 key parity with messages/en.json (1426/1426 leaf keys)
and exact preservation of all interpolation variables and HTML-ish
tags across every message.
2026-07-12 00:06:31 +07:00
Arnas Donauskas
b867760801
Merge pull request #364 from ArnasDon/fix/duplicate-conversations
fix: stop inbox creating duplicate chats for one contact (#363)
2026-07-10 16:27:12 +03:00
Arnas Donauskas
faf0f740a4
fix: stop inbound chats fragmenting into duplicate conversations (#363)
An inbound message could create a second conversation for a contact
under a race (Meta retries a delivery, or a batch fans out to concurrent
after() runs). There was no UNIQUE index and no unique-violation
backstop on conversations, unlike contacts (migration 022). Worse, once
two conversations existed the `.single()` lookup errored on every later
message and the webhook created yet another conversation each time,
snowballing into a wall of duplicate chats.

- findOrCreateConversation now resolves oldest-first with .limit(1)
  instead of .single(), so pre-existing duplicates converge, and catches
  23505 on insert to re-resolve the winning row.
- Same hardening applied to the public-API resolver (resolve-conversation).
- Migration 036 merges existing duplicate conversations into the oldest
  thread (re-pointing messages, reactions, deals, flow_runs,
  notifications, ai_usage_log — no data loss) then adds a
  UNIQUE (account_id, contact_id) index as the authoritative guarantee.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-10 12:27:46 +03:00