Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions .changeset/fifty-paws-divide.md

This file was deleted.

5 changes: 0 additions & 5 deletions .changeset/fixed-cli-permissions.md

This file was deleted.

5 changes: 0 additions & 5 deletions .changeset/green-clouds-wash.md

This file was deleted.

5 changes: 0 additions & 5 deletions .changeset/guard-convex-worker-leases.md

This file was deleted.

5 changes: 0 additions & 5 deletions .changeset/jolly-bananas-sneeze.md

This file was deleted.

5 changes: 0 additions & 5 deletions .changeset/large-loops-retire.md

This file was deleted.

5 changes: 0 additions & 5 deletions .changeset/perky-glasses-invite.md

This file was deleted.

5 changes: 0 additions & 5 deletions .changeset/secure-convex-attachments.md

This file was deleted.

5 changes: 0 additions & 5 deletions .changeset/secure-convex-public-api.md

This file was deleted.

7 changes: 0 additions & 7 deletions .changeset/smtp-retry-classification.md

This file was deleted.

5 changes: 0 additions & 5 deletions .changeset/tenki-smtp-commonjs-telemetry.md

This file was deleted.

5 changes: 0 additions & 5 deletions .changeset/two-buses-find.md

This file was deleted.

5 changes: 0 additions & 5 deletions .changeset/young-deserts-behave.md

This file was deleted.

22 changes: 22 additions & 0 deletions packages/convex-email/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,27 @@
# @opencoredev/convex-email

## 4.0.0

### Major Changes

- 32e98c9: Secure `exposeApi()` with authenticated ownership checks. Unauthenticated callers can no longer send, read, cancel, or retry email records; use `authorize` for custom tenant or operation policy, and `authorizeConfig` for explicitly authorized configuration access.

### Patch Changes

- 308074d: Prevent stale recovered email workers from overwriting the active worker's result.
- 3e07cf2: Require Email SDK ^1.3.0 for the shared webhook export used by the component. SDK 1.2.0 does not provide this entry point; the accumulated SDK minor changesets introduce it in 1.3.0.
- 3e07cf2: Reuse the SDK webhook normalizer for Resend, Postmark, and Mailgun, reject malformed non-object payloads, and handle Resend delivery headers case-insensitively while preserving optional application verification and generic-provider compatibility.
- bcf0306: Harden remote attachment downloads by validating every redirect, limiting redirects and response size, and applying a fetch timeout.
- Updated dependencies [3e07cf2]
- Updated dependencies [bcf0306]
- Updated dependencies [97ab553]
- Updated dependencies [3e07cf2]
- Updated dependencies [4381362]
- Updated dependencies [e0827a3]
- Updated dependencies [3e07cf2]
- Updated dependencies [14a6dc0]
- @opencoredev/email-sdk@2.0.0

## 3.0.0

### Minor Changes
Expand Down
4 changes: 2 additions & 2 deletions packages/convex-email/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@opencoredev/convex-email",
"version": "3.0.0",
"version": "4.0.0",
"description": "Provider-portable transactional email for Convex with durable queues, retries, fallback adapters, idempotency, webhooks, and reactive status.",
"keywords": [
"convex",
Expand Down Expand Up @@ -98,7 +98,7 @@
"convex-test": "0.0.53"
},
"peerDependencies": {
"@opencoredev/email-sdk": "^1.3.0",
"@opencoredev/email-sdk": "^2.0.0",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Stale lockfile blocks release install

Changing the peer range to ^2.0.0 leaves bun.lock at ^1.3.0. The frozen release install exits before validation or publishing.

Learn more

The committed lockfile records each workspace manifest, including the Convex package's peer range. It still records @opencoredev/email-sdk: ^1.3.0, while this line changes the manifest to ^2.0.0. The release workflow installs with --frozen-lockfile, which forbids bringing that entry up to date.

Example: A fresh release runner checks out this commit and runs bun install --frozen-lockfile. Bun detects the peer dependency mismatch and exits before release:ci and changeset publish run.

Recommended fix: Regenerate and commit bun.lock with the repository's pinned Bun 1.3.14 after applying the version changes. Verify the lockfile workspace versions and the Convex peer range both match their manifests.

Devin Review


Was this helpful? React with 👍 or 👎 to provide feedback.

"convex": "^1.36.1"
},
"engines": {
Expand Down
21 changes: 21 additions & 0 deletions packages/email-sdk/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,26 @@
# @opencoredev/email-sdk

## 2.0.0

### Major Changes

- e0827a3: Replace the hand-rolled SMTP protocol and MIME implementation with Nodemailer-backed delivery, including RFC-safe subject encoding, transfer encoding, and attachments. Add first-class CommonJS entry points alongside ESM. Telemetry remains enabled by default with the existing `telemetry: false`, `EMAIL_SDK_TELEMETRY=0`, and `DO_NOT_TRACK=1` opt-outs; events use a stable installation identifier and never include message content, addresses, or credentials. Move repository CI workflows to Tenki Cloud runners and add Node 20/22/24 package-compatibility coverage.

### Minor Changes

- 3e07cf2: Add opt-in `doctor --live`, `--from`, and `--json` diagnostics with independently reported `configuration`, `authentication`, and `sender` checks. Default `doctor` stays configuration-only and makes no network request. Live probes use documented non-sending endpoints for Resend, Sequenzy, JetEmail, Primitive, Lettermint, and Lettr; Resend additionally supports paginated sender-domain readiness via `--from`, while other adapters report sender readiness as `unsupported`. Results distinguish `invalid_credentials`, `insufficient_permissions`, `inconclusive`, `rate_limited`, `network_failure`, `timeout`, `unsupported`, and `not_ready`; generic HTTP 400/422 responses are never treated as authentication success. Probes are bounded by a timeout, reject redirects and non-loopback base URL overrides, and never print credentials, response bodies, or account identifiers. The live verification scripts reuse the same probes.
- 3e07cf2: Add a separate webhooks entry point with Web Crypto Resend and Mailgun signature verification, timestamp checks and key rotation, plus delivery event normalization for Resend, Postmark, and Mailgun.
- 14a6dc0: Allow CommonJS applications on Node.js `^20.19.0 || >=22.12.0` (20.19+ on 20.x, or 22.12+) to load every SDK entry point with `require()`. ESM imports still support Node.js 20+. Typed CommonJS consumers need TypeScript 5.8+ with `module: nodenext`, or a compiler supporting `module: node20`. On older supported runtimes, use dynamic `import()` instead.

### Patch Changes

- bcf0306: Ensure the packaged CLI is executable when builds run with a restrictive file-creation mask.
- 97ab553: Ensure per-send idempotency keys override static Resend and JetEmail adapter headers.
- 3e07cf2: Correct anonymous usage measurements by separating logical send outcomes, adapter attempts, submitted volume, and explicit provider acceptance. Version the counting schema, replace the misleading `delivered_count` metric, exclude built-in test adapters from provider volume even when renamed, and preserve acceptance evidence when later middleware fails. Default-on telemetry and existing opt-outs remain unchanged. Document aggregation rules and why provider acceptance does not establish delivery.
- 4381362: Fix the SMTP adapter marking every send failure as retryable. Permanent SMTP rejections (5xx replies), authentication and envelope errors, protocol errors, and TLS certificate failures are now classified as non-retryable, while transient failures (4xx replies, connection failures, timeouts, DNS resolution failures, and non-certificate TLS failures) remain retryable.

SMTP failures that prove the server never accepted the message now also report `delivery: "not_sent"`. Failures that could have happened after the server queued the message continue to report `delivery: "unknown"`.

## 1.2.0

### Minor Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/email-sdk/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@opencoredev/email-sdk",
"version": "1.2.0",
"version": "2.0.0",
Comment thread
devin-ai-integration[bot] marked this conversation as resolved.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 Major migration paths remain undocumented

The 2.0.0 and 4.0.0 releases lack current migration guides with before-and-after examples. Existing guides cover SDK v0-to-v1 and label exposeApi() as a v3 migration.

Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Align Docs Major

This release changes the SDK to 2.0.0, but the active documentation configuration still tracks v1. The required documentation-version check rejects that mismatch, so release CI cannot complete and the package cannot be published until the v2 documentation configuration is updated or the v1 line is archived.

Artifacts

Package-version diff

  • Compared the supplied SHA with the candidate package and showed the actual package version transition is 1.3.0 to 2.0.0, confirming the supplied SHA does not contain 1.2.0.

Documentation-version gate harness

  • Authored and executed this shell harness to run the identical repository gate for the prior SHA’s real package version and the current candidate without modifying repository source, preserving comparable output.

Prior v1 gate output

  • Ran the docs-version gate with its supported package-version simulation set to the supplied SHA’s actual 1.3.0 version; it did not report the v2-versus-v1 current-track mismatch.

Current v2 gate output

  • Ran the repository docs-version gate against current package metadata and captured its exit-1 major/docs-track error, confirming the candidate is blocked specifically by 2.0.0 exceeding v1.

View artifacts

T-Rex Ran code and verified through T-Rex

Fix in Claude Code

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Release validation rejects v2

Version 2.0.0 makes docs:versions:check reject the release. currentDocsMajorVersion remains 1, so release:ci stops before publishing.

Learn more

The release workflow runs release:ci before invoking Changesets. Its docs-version validator compares the package major with currentDocsMajorVersion and fails whenever the package major is greater. This version bump therefore makes every release workflow run fail before the publish step.

Example: With the manifest at 2.0.0, the validator reads published major 2 and current docs major 1. It prints that the package is 2.0.0 while current docs still track v1, then exits with status 1.

Recommended fix: Add and configure the v2 docs line, archive the prior v1 docs as required, and include the required v2 migration guide before merging this release PR. Then run bun run release:ci against the versioned tree.

Devin Review


Was this helpful? React with 👍 or 👎 to provide feedback.

"description": "A TypeScript email SDK for unified transactional sending.",
"keywords": [
"bun",
Expand Down