Skip to content

feat: align Shoppable Ads with mParticle 9.2 + unified RoktPaymentExtension#93

Merged
jamesnrokt merged 6 commits into
shoppable-adsfrom
feat/shoppable-ads-9.2
Jun 5, 2026
Merged

feat: align Shoppable Ads with mParticle 9.2 + unified RoktPaymentExtension#93
jamesnrokt merged 6 commits into
shoppable-adsfrom
feat/shoppable-ads-9.2

Conversation

@rmi22186

@rmi22186 rmi22186 commented May 29, 2026

Copy link
Copy Markdown
Member

Background

PR #83 shipped the initial Shoppable Ads implementation (into a shoppable-ads feature branch) against mParticle Apple SDK 9.0 and the Stripe-specific RoktStripePaymentExtension (0.1.x). Since then, the React Native
and Flutter mParticle wrappers moved to mParticle 9.2 + the unified RoktPaymentExtension 2.0 (the Stripe-only variant is deprecated), and MPRokt gained three new methods (setSessionId, getSessionId, handleURLCallback). This PR brings the Cordova plugin to parity.

What Has Changed

  • Native deps bumped: mParticle-Apple-SDK ~> 9.2, mParticle-Rokt ~> 9.2, android-core / android-rokt-kit to 5.79.0.
  • Stripe kit renamed to unified payment extension: Kits/RoktStripePayment/ → Kits/RoktPaymentExtension/; pod swapped to RoktPaymentExtension ~> 2.0; the host now only supplies
    the Apple Pay merchant identifier — stripeKey flows from the mParticle dashboard config through the Rokt kit at registration time.
  • Three new JS bridge methods on mparticle.Rokt: setSessionId(sessionId), getSessionId(callback), and handleURLCallback(urlString, callback). iOS wires through to the
    corresponding MPRokt 9.2 methods; Android wires setSessionId / getSessionId to MParticle.getInstance().Rokt(), with handleURLCallback a logged no-op matching the RN/Flutter
    Android shape.
  • Docs: README's Shoppable Ads section rewritten for the unified extension + new bridged methods; CHANGELOG updated under [Unreleased].
  • Example app wired for live testing: AppDelegate registers the payment extension via a Swift bridge, randomized confirmationref / email per tap (defeats Rokt dedup during local
    testing), cacheDurationInSeconds: 0, plus patched mParticle 9.2 podspecs that bump RoktContracts to ~> 1.0 so the example resolves cleanly against current Rokt-Widget.

Screenshots/Video

  • {Include any screenshots or video demonstrating the new feature or fix, if applicable}

Checklist

  • I have performed a self-review of my own code.
  • I have made corresponding changes to the documentation. (readme, not Rokt docs yet)
  • I have added tests that prove my fix is effective or that my feature works.
  • I have tested this locally. - This is not currently showing the Shopable Ad with the Upsells Prod (Partner) workspace. The API keys for this worked previously in PR#83, but now do not.

rmi22186 and others added 5 commits May 29, 2026 09:28
Aligns the Cordova plugin's pinned native versions with what the
sibling RN and Flutter wrappers shipped at the same release line:

- iOS `mParticle-Apple-SDK`     ~> 9.0    → ~> 9.2
- iOS `mParticle-Rokt`          ~> 9.0    → ~> 9.2
- Android `android-core`        5.71.0    → 5.79.0
- Android `android-rokt-kit`    5.71.0    → 5.79.0
- README Podfile note bumped to 9.2.0 or later

Apple SDK 9.2 widens the MPRokt surface (registerPaymentExtension:,
handleURLCallback:, setSessionId:/getSessionId, expanded RoktEvent
hierarchy) and stops the partner from having to thread stripeKey
through Cordova JS — the Rokt kit now reads stripePublishableKey
from kit configuration in the mParticle dashboard.

Follow-up commits in this branch bridge the new methods and rename
the Stripe-named payment kit to the unified RoktPaymentExtension.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
`RoktStripePaymentExtension 0.1.x` was the Stripe-only iOS Rokt
payment extension. Upstream Rokt has since unified its providers
into a single `RoktPaymentExtension` package (`~> 2.0`) that
internally routes to Stripe for Apple Pay / card / Afterpay /
Clearpay / PayPal — partner code no longer needs to pick a provider
at integration time.

- `Kits/RoktStripePayment/`  →  `Kits/RoktPaymentExtension/`
- npm + Cordova id `@mparticle/cordova-rokt-stripe-payment-kit`
  → `@mparticle/cordova-rokt-payment-extension`
- pod `RoktStripePaymentExtension ~> 0.1`  →  `RoktPaymentExtension ~> 2.0`
- `example/config.xml` plugin reference updated to the new id / path
- `example/platform_overrides/ios/RoktPaymentSetup.swift` imports
  the unified module and constructs `RoktPaymentExtension(applePayMerchantId:)`
  instead of `RoktStripePaymentExtension(applePayMerchantId:)`.
- AppDelegate comment + copy-hook comment updated.

The Swift helper still calls `MParticle.sharedInstance().rokt.register(_:)`
(which is the Swift form of `[[MParticle sharedInstance].rokt
registerPaymentExtension:]`). The Rokt kit on mParticle Apple SDK 9.2
pulls `stripePublishableKey` from kit configuration in the mParticle
dashboard and forwards it to Rokt at registration time, so the host
app only needs to provide the Apple Pay merchant identifier.

README still references the old Stripe-named symbols — fixed in the
docs commit later in this branch.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
mParticle Apple SDK 9.2 widened MPRokt with three pass-through
APIs that the Cordova bridge can now forward:

- `setSessionId:` / `-getSessionId` — let JS share a session id with
  a WebView leg of the same flow, matching the standalone Rokt SDK
  and the React Native wrapper.
- `handleURLCallback:` — receive deep-link return URLs from
  redirect-based Rokt payment methods (AfterPay, PayPal) and ask the
  registered payment extension(s) to claim them. Returns BOOL so the
  host can fall back to its own URL routing on no-claim.

`registerPaymentExtension:` is intentionally NOT exposed in JS.
The concrete extension class has a Swift failable initializer that
isn't `@objc`-exported, so partners need a Swift bridge file in
their app target anyway; once they have it, registering from
AppDelegate is one line. A JS API would only add plumbing without
removing the native setup, encourage per-call registration footguns,
and diverge from how the RN and Flutter wrappers handle it.

- iOS: real selectors against `[[MParticle sharedInstance].rokt …]`.
- Android: `setSessionId` and `getSessionId` are real calls
  (`MParticle.getInstance().Rokt().setSessionId / .getSessionId`);
  `handleURLCallback` is a logged no-op matching the RN/Flutter
  pattern until the Android SDK ships the same API.
- JS: `setSessionId` is fire-and-forget, `getSessionId` and
  `handleURLCallback` accept a completion that receives the
  session-id string and a BOOL `handled`, respectively.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
README's Shoppable Ads section was wired up against the old Stripe-named
plugin (`@mparticle/cordova-rokt-stripe-payment-kit`,
`RoktStripePaymentExtension`). Rewrite it for the unified
`@mparticle/cordova-rokt-payment-extension` kit and quote the
Swift bridge example partners need in their app target.

- Step 1: install the unified payment-extension kit instead of the
  Stripe-named one.
- Step 2: full Swift bridge snippet (RoktPaymentSetup.swift) plus the
  AppDelegate call. Notes that the Rokt kit on mParticle Apple SDK
  9.2 reads `stripePublishableKey` from the mParticle dashboard, so
  partners no longer need to ship a Stripe key from JS.
- New step 4 covers `handleURLCallback` for redirect-based payments
  (AfterPay, PayPal).
- New step 5 covers `setSessionId` / `getSessionId` for WebView
  session continuity.
- CHANGELOG `[Unreleased]` documents the three native bumps, the
  Stripe → unified rename, and the three new bridged JS methods.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Register the unified Rokt payment extension in the example AppDelegate,
randomize the selectShoppableAds confirmation ref / email per tap so
Rokt's dedup doesn't suppress repeat requests during local testing, and
disable the response cache. Adds patched mParticle 9.2 podspecs that
bump the RoktContracts requirement to ~> 1.0 so the example resolves
cleanly against current Rokt-Widget.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@rmi22186
rmi22186 requested a review from a team as a code owner May 29, 2026 13:48
@cursor

cursor Bot commented May 29, 2026

Copy link
Copy Markdown

PR Summary

High Risk
Touches checkout/payment registration, renames a published Cordova kit (breaking for existing installs), and bumps major native SDK/pod versions where misconfiguration can break Shoppable Ads and redirect payments.

Overview
Brings Cordova Shoppable Ads in line with mParticle 9.2 and the unified RoktPaymentExtension stack used by other wrappers.

Native dependencies move to mParticle-Apple-SDK / mParticle-Rokt ~> 9.2 and Android android-core / android-rokt-kit 5.79.x. The old Stripe-only Cordova kit is renamed to @mparticle/cordova-rokt-payment-extension with CocoaPod RoktPaymentExtension ~> 2.0; hosts register RoktPaymentExtension(applePayMerchantId:) and rely on dashboard stripePublishableKey instead of passing stripeKey from JS.

New mparticle.Rokt APIssetSessionId, getSessionId, and handleURLCallback — are wired on iOS to MPRokt; Android implements session get/set and no-ops handleURLCallback with a warning. README/CHANGELOG and the example app (plugin id, Swift bridge, dedup-friendly test attributes) are updated accordingly.

Integrators must swap the Cordova plugin id and native registration from the deprecated Stripe kit to the payment extension kit.

Reviewed by Cursor Bugbot for commit ee1435f. Bugbot is set up for automated code reviews on this repo. Configure here.

Comment thread example/platform_overrides/ios/AppDelegate.m Outdated
Comment thread example/package.json Outdated
Comment thread example/patched-podspecs/mParticle-Apple-SDK.podspec.json Outdated
- Sync example/package-lock.json with package.json so `npm ci` passes
  (was missing @mparticle/cordova-rokt-payment-extension → EUSAGE, failing
  both example build jobs before any build ran).
- Remove orphaned patched-podspecs (pinned 9.0.1, violating the plugin's
  ~> 9.2 constraint). Published mParticle-Apple-SDK 9.2.0 already declares
  RoktContracts (~> 2.0), so a clean pod install resolves to RoktContracts
  2.0.2 / RoktPaymentExtension 2.0.3 with no overrides. Verified end-to-end:
  example builds on cordova-ios 7.1.1, Rokt kit 9.2.0 inits, payment
  extension registers, selectShoppableAds renders.
- Remove the 'Strip before commit' globalEvents diagnostic from the example
  AppDelegate.
- Use file: prefix for the cordova-rokt-payment-extension dev dependency.
- Bump android-core / android-rokt-kit to 5.79.1 (latest stable 5.x).

Addresses all three Cursor Bugbot comments on #93.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@jamesnrokt

Copy link
Copy Markdown
Contributor

Picked this up while @author is out. Pushed ee1435f addressing the review feedback and the red CI:

Bugbot comments

  • globalEvents diagnostic (AppDelegate.m) — removed the "Strip before commit" block.
  • package.json file: prefix — aligned @mparticle/cordova-rokt-payment-extension with its siblings.
  • patched-podspecs 9.0.1 vs ~> 9.2 — removed the directory entirely. It was orphaned (no hook/Podfile referenced it) and stale. Published mParticle-Apple-SDK 9.2.0 now declares RoktContracts (~> 2.0), so a clean pod install resolves to RoktContracts 2.0.2 / RoktPaymentExtension 2.0.3 with no overrides needed.

Red example CI (root cause)

  • example/package-lock.json was out of sync with package.json (missing the renamed payment-extension dep) → npm ci failed with EUSAGE before any build ran, on both example jobs. Regenerated the lockfile in sync.

Dependencies

  • iOS pods float to latest 9.2.x / 2.0.x already; bumped android-core / android-rokt-kit 5.79.0 → 5.79.1 (latest stable 5.x; avoids the 6.0.0-rc.1 prerelease).

Verified locally on the pinned cordova-ios 7.1.1: clean platform add → all hooks succeed → builds; Rokt kit 9.2.0 initializes, RoktPaymentExtension registers, and selectShoppableAds renders an ad end-to-end (this was the prior testing blocker — it was the dependency-resolution breakage, not a code issue).

Rokt placement events (onEvent/events) will follow in a separate stacked PR.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit ee1435f. Configure here.

callbackContext.success(sessionId);
} else {
callbackContext.success();
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Android getSessionId returns empty string instead of null

Low Severity

When no session is active, the Android getSessionId calls callbackContext.success() (no-arg), which internally creates a PluginResult(Status.OK) whose encoded message is "" (empty string). The JS callback therefore receives "". On iOS, the equivalent resultWithStatus:CDVCommandStatus_OK (nil message) sends null to JS. The JS doc comment promises null/undefined when no session is active. Code doing strict equality checks like sessionId === null would behave differently across platforms. Using callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, (String) null)) would align the Android behavior with iOS.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit ee1435f. Configure here.

@denischilik denischilik left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGMT

Comment thread example/www/js/index.js
@jamesnrokt
jamesnrokt merged commit 2062e64 into shoppable-ads Jun 5, 2026
16 of 18 checks passed
@jamesnrokt
jamesnrokt deleted the feat/shoppable-ads-9.2 branch June 5, 2026 14:35
jamesnrokt added a commit that referenced this pull request Jun 10, 2026
…ement events (#84)

* feat: upgrade mParticle Apple SDK and Rokt kit to v9

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: Implement shoppable ads, RoktStripePaymentExtension (#83)

* feat: align Shoppable Ads with mParticle 9.2 + unified RoktPaymentExtension (#93)

* chore: bump native deps to mParticle-Apple-SDK 9.2 / android-core 5.79.0

Aligns the Cordova plugin's pinned native versions with what the
sibling RN and Flutter wrappers shipped at the same release line:

- iOS `mParticle-Apple-SDK`     ~> 9.0    → ~> 9.2
- iOS `mParticle-Rokt`          ~> 9.0    → ~> 9.2
- Android `android-core`        5.71.0    → 5.79.0
- Android `android-rokt-kit`    5.71.0    → 5.79.0
- README Podfile note bumped to 9.2.0 or later

Apple SDK 9.2 widens the MPRokt surface (registerPaymentExtension:,
handleURLCallback:, setSessionId:/getSessionId, expanded RoktEvent
hierarchy) and stops the partner from having to thread stripeKey
through Cordova JS — the Rokt kit now reads stripePublishableKey
from kit configuration in the mParticle dashboard.

Follow-up commits in this branch bridge the new methods and rename
the Stripe-named payment kit to the unified RoktPaymentExtension.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor: rename Rokt Stripe payment kit to unified RoktPaymentExtension

`RoktStripePaymentExtension 0.1.x` was the Stripe-only iOS Rokt
payment extension. Upstream Rokt has since unified its providers
into a single `RoktPaymentExtension` package (`~> 2.0`) that
internally routes to Stripe for Apple Pay / card / Afterpay /
Clearpay / PayPal — partner code no longer needs to pick a provider
at integration time.

- `Kits/RoktStripePayment/`  →  `Kits/RoktPaymentExtension/`
- npm + Cordova id `@mparticle/cordova-rokt-stripe-payment-kit`
  → `@mparticle/cordova-rokt-payment-extension`
- pod `RoktStripePaymentExtension ~> 0.1`  →  `RoktPaymentExtension ~> 2.0`
- `example/config.xml` plugin reference updated to the new id / path
- `example/platform_overrides/ios/RoktPaymentSetup.swift` imports
  the unified module and constructs `RoktPaymentExtension(applePayMerchantId:)`
  instead of `RoktStripePaymentExtension(applePayMerchantId:)`.
- AppDelegate comment + copy-hook comment updated.

The Swift helper still calls `MParticle.sharedInstance().rokt.register(_:)`
(which is the Swift form of `[[MParticle sharedInstance].rokt
registerPaymentExtension:]`). The Rokt kit on mParticle Apple SDK 9.2
pulls `stripePublishableKey` from kit configuration in the mParticle
dashboard and forwards it to Rokt at registration time, so the host
app only needs to provide the Apple Pay merchant identifier.

README still references the old Stripe-named symbols — fixed in the
docs commit later in this branch.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat: bridge setSessionId / getSessionId / handleURLCallback on Rokt

mParticle Apple SDK 9.2 widened MPRokt with three pass-through
APIs that the Cordova bridge can now forward:

- `setSessionId:` / `-getSessionId` — let JS share a session id with
  a WebView leg of the same flow, matching the standalone Rokt SDK
  and the React Native wrapper.
- `handleURLCallback:` — receive deep-link return URLs from
  redirect-based Rokt payment methods (AfterPay, PayPal) and ask the
  registered payment extension(s) to claim them. Returns BOOL so the
  host can fall back to its own URL routing on no-claim.

`registerPaymentExtension:` is intentionally NOT exposed in JS.
The concrete extension class has a Swift failable initializer that
isn't `@objc`-exported, so partners need a Swift bridge file in
their app target anyway; once they have it, registering from
AppDelegate is one line. A JS API would only add plumbing without
removing the native setup, encourage per-call registration footguns,
and diverge from how the RN and Flutter wrappers handle it.

- iOS: real selectors against `[[MParticle sharedInstance].rokt …]`.
- Android: `setSessionId` and `getSessionId` are real calls
  (`MParticle.getInstance().Rokt().setSessionId / .getSessionId`);
  `handleURLCallback` is a logged no-op matching the RN/Flutter
  pattern until the Android SDK ships the same API.
- JS: `setSessionId` is fire-and-forget, `getSessionId` and
  `handleURLCallback` accept a completion that receives the
  session-id string and a BOOL `handled`, respectively.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: align README + CHANGELOG with 9.2 / unified payment-extension flow

README's Shoppable Ads section was wired up against the old Stripe-named
plugin (`@mparticle/cordova-rokt-stripe-payment-kit`,
`RoktStripePaymentExtension`). Rewrite it for the unified
`@mparticle/cordova-rokt-payment-extension` kit and quote the
Swift bridge example partners need in their app target.

- Step 1: install the unified payment-extension kit instead of the
  Stripe-named one.
- Step 2: full Swift bridge snippet (RoktPaymentSetup.swift) plus the
  AppDelegate call. Notes that the Rokt kit on mParticle Apple SDK
  9.2 reads `stripePublishableKey` from the mParticle dashboard, so
  partners no longer need to ship a Stripe key from JS.
- New step 4 covers `handleURLCallback` for redirect-based payments
  (AfterPay, PayPal).
- New step 5 covers `setSessionId` / `getSessionId` for WebView
  session continuity.
- CHANGELOG `[Unreleased]` documents the three native bumps, the
  Stripe → unified rename, and the three new bridged JS methods.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: wire example app for Shoppable Ads testing

Register the unified Rokt payment extension in the example AppDelegate,
randomize the selectShoppableAds confirmation ref / email per tap so
Rokt's dedup doesn't suppress repeat requests during local testing, and
disable the response cache. Adds patched mParticle 9.2 podspecs that
bump the RoktContracts requirement to ~> 1.0 so the example resolves
cleanly against current Rokt-Widget.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: address review feedback and fix red example CI on Shoppable Ads 9.2

- Sync example/package-lock.json with package.json so `npm ci` passes
  (was missing @mparticle/cordova-rokt-payment-extension → EUSAGE, failing
  both example build jobs before any build ran).
- Remove orphaned patched-podspecs (pinned 9.0.1, violating the plugin's
  ~> 9.2 constraint). Published mParticle-Apple-SDK 9.2.0 already declares
  RoktContracts (~> 2.0), so a clean pod install resolves to RoktContracts
  2.0.2 / RoktPaymentExtension 2.0.3 with no overrides. Verified end-to-end:
  example builds on cordova-ios 7.1.1, Rokt kit 9.2.0 inits, payment
  extension registers, selectShoppableAds renders.
- Remove the 'Strip before commit' globalEvents diagnostic from the example
  AppDelegate.
- Use file: prefix for the cordova-rokt-payment-extension dev dependency.
- Bump android-core / android-rokt-kit to 5.79.1 (latest stable 5.x).

Addresses all three Cursor Bugbot comments on #93.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: James Newman <james.newman@rokt.com>

* feat: bridge Rokt placement events (onEvent) to JS (#94)

Add mparticle.Rokt.events(identifier, onEvent) — a standalone subscriber
mirroring the native events API shape (not folded into selectPlacements) —
plus mparticle.Rokt.EventType constants.

iOS (CDVMParticle.m): roktEvents: forwards to MPRokt events:onEvent:;
dictionaryFromRoktEvent: serializes every RoktEvent subclass from
RoktContracts 2.0.2 to a dict and streams via CDVPluginResult with
setKeepCallback:YES for multi-shot delivery.

Android (MParticleCordovaPlugin.java): roktEvents subscribes to the
events(identifier) Flow via onEach/launchIn, serializes each event to JSON,
and streams with keepCallback. Each placement's collection scope is tracked
in a map keyed by identifier: re-subscribing the same identifier cancels the
prior scope instead of stacking a second collector, and onDestroy cancels
every active scope so collectors stop running and never deliver through a
callbackContext bound to a destroyed WebView.

README + example: Placement Events section and a Subscribe to Events button.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: address Bugbot review comments on shoppable-ads

- Android selectShoppableAds/purchaseFinalized now accept a callbackContext and
  send a PluginResult, so the JS promises resolve instead of dangling (#3).
- purchaseFinalized is a no-op + warning on Android, matching selectShoppableAds
  (unsupported) and handleURLCallback — avoids calling the Rokt SDK with no
  active shoppable session (#2).
- Quote iosPath/script path in the platform-add hook so project roots containing
  spaces don't break `cordova platform add ios` (#1).
- Make configure_xcode_swift.rb idempotent: reuse an existing RoktPaymentSetup.swift
  reference and skip re-adding it, so re-runs don't create duplicate compile sources (#5).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: set iOS wrapper SDK version and cover RoktPaymentExtension in release flow (#95)

The release workflow only ever versioned/published the plugin and Rokt kit,
leaving two gaps:

- CDVMParticle.m reported an empty wrapper version to mParticle
  (_setWrapperSdk_internal version:@""). Seed it with the current version and
  add a release-workflow step that bumps it alongside plugin.xml, so it tracks
  every release instead of going stale.
- Kits/RoktPaymentExtension (new this release) was not managed by the release
  flow at all, so it had drifted to 3.0.0 and would never be version-bumped or
  published. Add version-bump + plugin.xml + dry-run-publish steps mirroring the
  Rokt kit, align it to 3.0.1, and list the extra files in the release PR body.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: James Newman <james.newman@rokt.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants