Skip to content

Add deeper network connectivity: WiFi info/scan/connect, Bonjour, WiFi Direct, USB, network-type events#5021

Merged
shai-almog merged 14 commits into
masterfrom
feature/deeper-network-connectivity
May 24, 2026
Merged

Add deeper network connectivity: WiFi info/scan/connect, Bonjour, WiFi Direct, USB, network-type events#5021
shai-almog merged 14 commits into
masterfrom
feature/deeper-network-connectivity

Conversation

@shai-almog
Copy link
Copy Markdown
Collaborator

@shai-almog shai-almog commented May 23, 2026

Summary

Adds a new set of APIs under com.codename1.io.{wifi,bonjour,usb} plus NetworkManager.addNetworkTypeListener for apps that need more than HTTP. Each API surface is implemented natively on Android, iOS, and (best-effort) the JavaSE simulator, with auto-injection of all matching Android permissions and iOS entitlements / Info.plist strings based on classpath scanning.

What's new

  • com.codename1.io.wifi.WiFi - getCurrentSSID(), getBSSID(), getGateway(), getIp(), scan(...), connect(SSID, password, security).
  • com.codename1.io.wifi.WiFiDirect - peer-to-peer (Android only).
  • com.codename1.io.bonjour.{BonjourBrowser, BonjourPublisher} - mDNS / zeroconf.
  • com.codename1.io.usb.Usb - USB host (Android only).
  • NetworkManager.addNetworkTypeListener(NetworkTypeListener) + NETWORK_TYPE_* constants + getCurrentNetworkType().

Platform implementations

  • Android: WifiManager / ConnectivityManager / WifiNetworkSpecifier (API 29+) + legacy WifiConfiguration fallback / NsdManager / WifiP2pManager / UsbManager.
  • iOS: CNCopySupportedInterfaces + CNCopyCurrentNetworkInfo for SSID/BSSID, getifaddrs for IP/gateway, NEHotspotConfiguration for connect, NSNetServiceBrowser / NSNetService for Bonjour, SCNetworkReachability for type tracking. Scan / WiFi Direct / USB report UnsupportedOperationException.
  • JavaSE: derives WiFi info from NetworkInterface, returns fabricated scan results, no-op connect with logging, optional JmDNS Bonjour, prints required production permissions on first call + a summary at JVM shutdown.

Build-tool auto-injection

The maven plugin scanners (AndroidGradleBuilder / IPhoneBuilder) detect the new API usage and inject:

  • Android - ACCESS_WIFI_STATE, CHANGE_WIFI_STATE, ACCESS_NETWORK_STATE, CHANGE_NETWORK_STATE, ACCESS_FINE_LOCATION (maxSdkVersion=32), NEARBY_WIFI_DEVICES (targetSDK>=33), CHANGE_WIFI_MULTICAST_STATE for Bonjour, android.hardware.usb.host feature for USB.
  • iOS - com.apple.developer.networking.wifi-info entitlement, com.apple.developer.networking.HotspotConfiguration entitlement (only when WiFi.connect is referenced), NSLocationWhenInUseUsageDescription, NSLocalNetworkUsageDescription, NSBonjourServices array (defaulted to _http._tcp.; configurable via ios.NSBonjourServices).

Objective-C gating

All entitlement-requiring iOS native code is #ifdef'd behind three new defines and only switched on by IPhoneBuilder when the corresponding API surface is referenced:

  • CN1_INCLUDE_WIFI_INFO - CNCopyCurrentNetworkInfo (CaptiveNetwork)
  • CN1_INCLUDE_HOTSPOT - NEHotspotConfigurationManager (NetworkExtension.framework)
  • CN1_INCLUDE_BONJOUR - NSNetServiceBrowser / NSNetService

Apps that never reference the new packages compile without any of these symbols -- so Apple's API-usage scanner does not flag them and no dangling entitlements need explanation during App Store review. Mirrors the existing CN1_INCLUDE_NFC pattern.

Documentation

  • New chapter: docs/developer-guide/Network-Connectivity.asciidoc with quick-starts for each API, per-platform notes, required permissions/entitlements tables, simulator behaviour, and lifecycle guidance.
  • Wired into developer-guide.asciidoc between NFC and signing.

Companion PR

The cloud build server has a divergent copy of IPhoneBuilder.java / AndroidGradleBuilder.java that must be updated in lockstep. That's tracked in: https://github.com/codenameone/BuildDaemon/pull/83

Test plan

  • Maven plugin builds cleanly (mvn -pl core,ios,android,codenameone-maven-plugin install)
  • PR CI passes (Android port tests, iOS port packaging, ParparVM tests, JavaSE tests, developer-guide docs)
  • Manually verify in a sample app: reference com.codename1.io.wifi.WiFi.getCurrentSSID() and confirm AndroidManifest.xml gains ACCESS_WIFI_STATE / ACCESS_NETWORK_STATE, iOS entitlements gains com.apple.developer.networking.wifi-info, Info.plist gains NSLocationWhenInUseUsageDescription, and IOSNative.m flips CN1_INCLUDE_WIFI_INFO on
  • Reference BonjourBrowser and confirm NSLocalNetworkUsageDescription + NSBonjourServices land in Info.plist and CN1_INCLUDE_BONJOUR is enabled
  • Confirm an app that doesn't reference any new packages is identical to its pre-PR build (no extra permissions, no extra entitlements, no extra symbols)

🤖 Generated with Claude Code

shai-almog and others added 2 commits May 23, 2026 22:02
…jour, WiFi Direct, USB, network type events

New core API surface under com.codename1.io.{wifi,bonjour,usb} plus
NetworkManager.addNetworkTypeListener. Each API surface is implemented
on Android (WifiManager / NsdManager / WifiP2pManager / UsbManager /
ConnectivityManager), iOS (CaptiveNetwork / NEHotspotConfiguration /
NSNetService / SCNetworkReachability), and JavaSE (best-effort
NetworkInterface + simulated scan results + JmDNS hook).

The maven plugin builders auto-inject the matching Android permissions
(ACCESS_WIFI_STATE, CHANGE_WIFI_STATE, ACCESS_NETWORK_STATE,
CHANGE_NETWORK_STATE, ACCESS_FINE_LOCATION, NEARBY_WIFI_DEVICES,
CHANGE_WIFI_MULTICAST_STATE, usb.host feature) and iOS
entitlements/Info.plist strings (wifi-info, HotspotConfiguration,
NSLocalNetworkUsageDescription, NSBonjourServices) only when the
relevant classes are referenced from the classpath -- so apps that
never touch these APIs see no manifest, entitlement, or Info.plist
change.

The Objective-C native bridge is gated by CN1_INCLUDE_WIFI_INFO,
CN1_INCLUDE_HOTSPOT, and CN1_INCLUDE_BONJOUR defines that IPhoneBuilder
flips on only when the corresponding API surface is referenced. Stock
apps therefore ship without any CaptiveNetwork, NetworkExtension, or
NSNetServiceBrowser symbols and pass Apple's API-usage scan cleanly.

The simulator prints a one-shot warning the first time each API is
called, listing the permissions/entitlements production builds will
need; a JVM shutdown hook summarises everything used during the run.

Documented in docs/developer-guide/Network-Connectivity.asciidoc.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The Android port compiles against the API 25 android.jar shipped in
cn1-binaries, so the named constants Build.VERSION_CODES.Q (29) and
Build.VERSION_CODES.S (31) and the WifiNetworkSpecifier class don't
exist at build time. Switch to integer SDK_INT comparisons and reach
WifiNetworkSpecifier.Builder via reflection so the file builds on the
legacy SDK while the runtime path still works on Android 10+.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

Cloudflare Preview

Older javac (the JavaSE simulator port compiles at -source 1.7; the
Android port at -source 1.6) requires anonymous-inner-class captures
to be on final locals. Java 8's effectively-final inference is not in
play. Hoist the captured Throwable / int into named final locals
before referencing them from the inner class.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@shai-almog
Copy link
Copy Markdown
Collaborator Author

shai-almog commented May 23, 2026

Compared 20 screenshots: 20 matched.
✅ JavaScript-port screenshot tests passed.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 23, 2026

Developer Guide build artifacts are available for download from this workflow run:

Developer Guide quality checks:

  • AsciiDoc linter: No issues found (report)
  • Vale: No alerts found (report)
  • Paragraph capitalization: No paragraph capitalization issues (report)
  • LanguageTool: No grammar matches (report)
  • Image references: No unused images detected (report)

…pter

Vale (Microsoft style) and LanguageTool (US-English) each surface
build-breaking issues. Apply the recommended substitutions:

- Microsoft.Wordiness: "All of these" -> "These"
- Microsoft.Adverbs: drop "accidentally" / "silently"
- Microsoft.Auto: "auto-injected" -> "injected automatically"
- Microsoft.Contractions: does not -> doesn't, cannot -> can't,
  will not -> won't, are not -> aren't, It is -> It's
- LanguageTool MORFOLOGIK_RULE_EN_US: normalises -> normalizes,
  synthesised -> synthesized

Verified locally with vale (10 -> 0 issues) and grepping for the
British spellings (2 -> 0).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@shai-almog
Copy link
Copy Markdown
Collaborator Author

shai-almog commented May 23, 2026

Compared 110 screenshots: 110 matched.

Native Android coverage

  • 📊 Line coverage: 11.79% (6771/57442 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 9.59% (34020/354705), branch 4.11% (1385/33724), complexity 5.15% (1668/32362), method 8.99% (1362/15142), class 14.44% (303/2098)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6327 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.ClassReader – 0.00% (0/1519 lines covered)
      • kotlin.collections.kotlin.collections.CollectionsKt___CollectionsKt – 0.00% (0/1148 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.MethodWriter – 0.00% (0/923 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/730 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/623 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.Frame – 0.00% (0/564 lines covered)
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysJvmKt – 0.00% (0/495 lines covered)
      • kotlinx.coroutines.kotlinx.coroutines.JobSupport – 0.00% (0/423 lines covered)

✅ Native Android screenshot tests passed.

Native Android coverage

  • 📊 Line coverage: 11.79% (6771/57442 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 9.59% (34020/354705), branch 4.11% (1385/33724), complexity 5.15% (1668/32362), method 8.99% (1362/15142), class 14.44% (303/2098)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6327 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.ClassReader – 0.00% (0/1519 lines covered)
      • kotlin.collections.kotlin.collections.CollectionsKt___CollectionsKt – 0.00% (0/1148 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.MethodWriter – 0.00% (0/923 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/730 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/623 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.Frame – 0.00% (0/564 lines covered)
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysJvmKt – 0.00% (0/495 lines covered)
      • kotlinx.coroutines.kotlinx.coroutines.JobSupport – 0.00% (0/423 lines covered)

Benchmark Results

Detailed Performance Metrics

Metric Duration
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 native encode 807.000 ms
Base64 CN1 encode 90.000 ms
Base64 encode ratio (CN1/native) 0.112x (88.8% faster)
Base64 native decode 1232.000 ms
Base64 CN1 decode 289.000 ms
Base64 decode ratio (CN1/native) 0.235x (76.5% faster)
Image encode benchmark status skipped (SIMD unsupported)

@shai-almog
Copy link
Copy Markdown
Collaborator Author

shai-almog commented May 23, 2026

Compared 11 screenshots: 11 matched.
✅ JavaSE simulator integration screenshots matched stored baselines.

shai-almog and others added 4 commits May 23, 2026 23:26
ParparVM mangles each public static Java method into a C symbol but the
.m file that calls it still needs a prototype. Without the include the
clang compiler emits "call to undeclared function" -- a hard error under
ISO C99+. Mirror the existing pattern used for IOSImplementation /
IOSBiometrics / IOSSecureStorage / IOSNfc and pull in the generated
header.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The default-encoding String/byte[] constructor and the no-locale
toLowerCase / toUpperCase / String.format methods are flagged as
high-priority SpotBugs violations under the quality gate. Pin every
new call site to UTF-8 / Locale.US.

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

AndroidConnectivity and AndroidUsb hold platform BroadcastReceivers and
NetworkCallbacks in static fields, populated when the first listener
registers and torn down when the last detaches. The lifecycle matches
AndroidImplementation's existing EDT-scoped cache pattern, which is
already excluded for the same SpotBugs categories. Scope the new
exclusion narrowly to these two classes.

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

The empty 'if (targetSDKVersionInt >= 33 && !contains(INTERNET))' block
was placeholder for a never-needed double-check. INTERNET is already in
basePermissions and Bonjour over IPv6 multicast inherits it
transparently. Drop the dead conditional.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@shai-almog
Copy link
Copy Markdown
Collaborator Author

shai-almog commented May 23, 2026

Compared 110 screenshots: 110 matched.
✅ Native iOS Metal screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 175 seconds

Build and Run Timing

Metric Duration
Simulator Boot 76000 ms
Simulator Boot (Run) 1000 ms
App Install 18000 ms
App Launch 8000 ms
Test Execution 309000 ms

Detailed Performance Metrics

Metric Duration
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 native encode 1047.000 ms
Base64 CN1 encode 2332.000 ms
Base64 encode ratio (CN1/native) 2.227x (122.7% slower)
Base64 native decode 704.000 ms
Base64 CN1 decode 1612.000 ms
Base64 decode ratio (CN1/native) 2.290x (129.0% slower)
Base64 SIMD encode 585.000 ms
Base64 encode ratio (SIMD/native) 0.559x (44.1% faster)
Base64 encode ratio (SIMD/CN1) 0.251x (74.9% faster)
Base64 SIMD decode 420.000 ms
Base64 decode ratio (SIMD/native) 0.597x (40.3% faster)
Base64 decode ratio (SIMD/CN1) 0.261x (73.9% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 126.000 ms
Image createMask (SIMD on) 17.000 ms
Image createMask ratio (SIMD on/off) 0.135x (86.5% faster)
Image applyMask (SIMD off) 193.000 ms
Image applyMask (SIMD on) 127.000 ms
Image applyMask ratio (SIMD on/off) 0.658x (34.2% faster)
Image modifyAlpha (SIMD off) 265.000 ms
Image modifyAlpha (SIMD on) 124.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.468x (53.2% faster)
Image modifyAlpha removeColor (SIMD off) 179.000 ms
Image modifyAlpha removeColor (SIMD on) 417.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 2.330x (133.0% slower)
Image PNG encode (SIMD off) 1785.000 ms
Image PNG encode (SIMD on) 1212.000 ms
Image PNG encode ratio (SIMD on/off) 0.679x (32.1% faster)
Image JPEG encode 863.000 ms

@shai-almog
Copy link
Copy Markdown
Collaborator Author

shai-almog commented May 23, 2026

Compared 110 screenshots: 110 matched.
✅ Native iOS screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 280 seconds

Build and Run Timing

Metric Duration
Simulator Boot 95000 ms
Simulator Boot (Run) 2000 ms
App Install 17000 ms
App Launch 9000 ms
Test Execution 361000 ms

Detailed Performance Metrics

Metric Duration
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 native encode 1074.000 ms
Base64 CN1 encode 2346.000 ms
Base64 encode ratio (CN1/native) 2.184x (118.4% slower)
Base64 native decode 682.000 ms
Base64 CN1 decode 1483.000 ms
Base64 decode ratio (CN1/native) 2.174x (117.4% slower)
Base64 SIMD encode 625.000 ms
Base64 encode ratio (SIMD/native) 0.582x (41.8% faster)
Base64 encode ratio (SIMD/CN1) 0.266x (73.4% faster)
Base64 SIMD decode 827.000 ms
Base64 decode ratio (SIMD/native) 1.213x (21.3% slower)
Base64 decode ratio (SIMD/CN1) 0.558x (44.2% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 81.000 ms
Image createMask (SIMD on) 11.000 ms
Image createMask ratio (SIMD on/off) 0.136x (86.4% faster)
Image applyMask (SIMD off) 250.000 ms
Image applyMask (SIMD on) 82.000 ms
Image applyMask ratio (SIMD on/off) 0.328x (67.2% faster)
Image modifyAlpha (SIMD off) 204.000 ms
Image modifyAlpha (SIMD on) 108.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.529x (47.1% faster)
Image modifyAlpha removeColor (SIMD off) 385.000 ms
Image modifyAlpha removeColor (SIMD on) 164.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.426x (57.4% faster)
Image PNG encode (SIMD off) 1630.000 ms
Image PNG encode (SIMD on) 1134.000 ms
Image PNG encode ratio (SIMD on/off) 0.696x (30.4% faster)
Image JPEG encode 726.000 ms

…e, UnnecessaryImport)

- NetworkManager.fireNetworkTypeChange: convert indexed for to foreach
- CodenameOneImplementation: drop java.* qualifiers on Map / InputStream
  / OutputStream / IOException now that the imports are already in scope
- BonjourService: drop the unused java.util.Hashtable import

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 23, 2026

✅ Continuous Quality Report

Test & Coverage

Static Analysis

  • SpotBugs [Report archive]
    • ByteCodeTranslator: 0 findings (no issues)
    • android: 0 findings (no issues)
    • codenameone-maven-plugin: 0 findings (no issues)
    • core-unittests: 0 findings (no issues)
    • ios: 0 findings (no issues)
  • PMD: 0 findings (no issues) [Report archive]
  • Checkstyle: 0 findings (no issues) [Report archive]

Generated automatically by the PR CI workflow.

shai-almog and others added 5 commits May 24, 2026 10:49
…PI 21+ on Android

Addresses review feedback on PR #5021:

1) Encapsulation: drop the IOImpl backdoor that exposed
   CodenameOneImplementation publicly. Instead each new API group has a
   narrow platform interface (WifiPlatform, WifiDirectPlatform,
   BonjourPlatform, UsbPlatform, NetworkTypePlatform) obtained from
   Display.getInstance().getXxxPlatform(). CodenameOneImplementation
   only carries small createXxxPlatform() factories; each port returns
   its concrete subclass, so the base implementation stays modular.

2) Old-device safety: AndroidConnectivity held static fields of type
   ConnectivityManager.NetworkCallback (API 21) which would fail
   class verification on KitKat (minSdkVersion 19). The Lollipop-only
   bits now live in *Lollipop helper classes that are only referenced
   from inside Build.VERSION.SDK_INT guards, so the KitKat verifier
   never loads them.

3) NetworkManager.isConnected(): cheap EDT-safe reachability check
   that returns false only when NETWORK_TYPE_NONE, avoiding the HTTP
   probe against autoDetectURL.

4) Documentation:
   - Drop the version "Codename One 8" mention.
   - Clarify JmDNS belongs in the application's executable-jar /
     simulator profile, not in the cn1app common pom (which would
     ship JmDNS to devices that already have native mDNS).
   - Replace the deinitializeImpl() lifecycle note with a battery-
     drain warning -- deinitializeImpl is internal API and shouldn't
     show up in developer docs.
   - Add a quick-check example for NetworkManager.isConnected().

5) SpotBugs exclusion comment: rewrite the rationale to explain why
   LI_LAZY_INIT_* doesn't apply (EDT-bound install pattern, no
   actual race) instead of just "matches existing convention".

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

The empty 'new WifiPlatform() {}' anonymous classes I used as defaults
were instance inner classes that implicitly captured the enclosing
CodenameOneImplementation. Drop 'abstract' from each platform base class
so the default can be 'new WifiPlatform()' directly (no enclosing-this
capture). Move the NetworkTypePlatform fallback that bridges to the
legacy access-point API into a named static nested class for the same
reason.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The em-dash-style '--' inside the previous commit's exclude comment is
illegal inside an XML <!-- comment --> (the parser reads it as the
start of the closing delimiter). SpotBugs silently rejected the entire
exclude file, which surfaced as a long list of pre-existing
ST_WRITE_TO_STATIC / NP_BOOLEAN_RETURN_NULL / LI_LAZY_INIT_* findings
in AndroidImplementation suddenly failing CI for this PR.

Replace the offending '--' with ':' so the file parses again.

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

* AndroidUsbPlatform.UsbStream: marked static; the inner class never
  reads outer state so pinning the platform instance for the stream's
  lifetime is unnecessary. Added a tiny staticUsb() shim so the static
  nested class can fetch UsbManager from AndroidImplementation context.
* IOSWifiPlatform.scan / IOSBonjourPlatform.startBrowse: moved the
  anonymous Runnable into a private static helper so it no longer
  carries an implicit reference to the enclosing platform instance.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
UnnecessaryFullyQualifiedName: Display is already imported at the top
of NetworkManager.java; the three new call sites for getCurrentNetworkType
/ install / uninstall don't need the package prefix.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@shai-almog shai-almog merged commit 9032603 into master May 24, 2026
26 checks passed
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.

1 participant