@elizaos/capacitor-wifi 2.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,27 @@
1
+ ext {
2
+ junitVersion = project.hasProperty('junitVersion') ? rootProject.ext.junitVersion : '4.13.2'
3
+ }
4
+
5
+ apply plugin: 'com.android.library'
6
+ android {
7
+ namespace = "ai.eliza.plugins.wifi"
8
+ compileSdk project.hasProperty('compileSdkVersion') ? rootProject.ext.compileSdkVersion : 34
9
+ defaultConfig {
10
+ minSdkVersion project.hasProperty('minSdkVersion') ? rootProject.ext.minSdkVersion : 23
11
+ targetSdkVersion project.hasProperty('targetSdkVersion') ? rootProject.ext.targetSdkVersion : 34
12
+ }
13
+ compileOptions {
14
+ sourceCompatibility JavaVersion.VERSION_17
15
+ targetCompatibility JavaVersion.VERSION_17
16
+ }
17
+ }
18
+
19
+ repositories {
20
+ google()
21
+ maven { url = uri(rootProject.ext.has('mavenCentralMirrorUrl') ? rootProject.ext.mavenCentralMirrorUrl : 'https://repo.maven.apache.org/maven2') }
22
+ mavenCentral()
23
+ }
24
+
25
+ dependencies {
26
+ implementation project(':capacitor-android')
27
+ }
@@ -0,0 +1,14 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
3
+ <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
4
+ <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
5
+ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
6
+ <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
7
+ <!--
8
+ ACCESS_FINE_LOCATION is required for `WifiManager.scanResults` on
9
+ API 26+ — without a granted runtime location permission the platform
10
+ returns an empty list. Declared as normal `uses-permission`; runtime
11
+ grant is the responsibility of the host app at first scan.
12
+ -->
13
+ <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
14
+ </manifest>
@@ -0,0 +1,301 @@
1
+ package ai.eliza.plugins.wifi
2
+
3
+ import android.Manifest
4
+ import android.content.Context
5
+ import android.net.ConnectivityManager
6
+ import android.net.NetworkRequest
7
+ import android.net.wifi.ScanResult
8
+ import android.net.wifi.WifiConfiguration
9
+ import android.net.wifi.WifiManager
10
+ import android.net.wifi.WifiNetworkSpecifier
11
+ import android.net.wifi.WifiNetworkSuggestion
12
+ import android.os.Build
13
+ import com.getcapacitor.JSArray
14
+ import com.getcapacitor.JSObject
15
+ import com.getcapacitor.Plugin
16
+ import com.getcapacitor.PluginCall
17
+ import com.getcapacitor.PluginMethod
18
+ import com.getcapacitor.annotation.CapacitorPlugin
19
+
20
+ /**
21
+ * Wi-Fi bridge for ElizaOS.
22
+ *
23
+ * Exposes a small set of methods over the standard `WifiManager` /
24
+ * `ConnectivityManager` APIs. The connect path branches on API level:
25
+ * - API 29+ (Android 10+): `WifiNetworkSuggestion` is the supported way to
26
+ * request a connection without holding a system-signature permission.
27
+ * Legacy `WifiConfiguration.addNetwork` is deprecated and returns -1.
28
+ * - API 23–28: legacy `WifiConfiguration` + `enableNetwork` is still
29
+ * permitted for system / privileged callers like Eliza.
30
+ */
31
+ @CapacitorPlugin(name = "ElizaWiFi")
32
+ class WiFiPlugin : Plugin() {
33
+ private val wifiManager: WifiManager?
34
+ get() = context.applicationContext
35
+ .getSystemService(Context.WIFI_SERVICE) as? WifiManager
36
+
37
+ private val connectivityManager: ConnectivityManager?
38
+ get() = context.applicationContext
39
+ .getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager
40
+
41
+ /** Cache of the last scan completion timestamp for the `maxAge` shortcut. */
42
+ private var lastScanCompletedAtMs: Long = 0L
43
+
44
+ @PluginMethod
45
+ fun getWifiState(call: PluginCall) {
46
+ val manager = wifiManager
47
+ if (manager == null) {
48
+ call.reject("Wi-Fi service is unavailable on this device")
49
+ return
50
+ }
51
+ val info = manager.connectionInfo
52
+ val connected = info != null && info.networkId != -1
53
+ val result = JSObject()
54
+ result.put("enabled", manager.isWifiEnabled)
55
+ result.put("connected", connected)
56
+ if (connected && info != null) {
57
+ result.put("rssi", info.rssi)
58
+ } else {
59
+ result.put("rssi", JSObject.NULL)
60
+ }
61
+ call.resolve(result)
62
+ }
63
+
64
+ @PluginMethod
65
+ fun getConnectedNetwork(call: PluginCall) {
66
+ if (!hasPermission(Manifest.permission.ACCESS_WIFI_STATE)) {
67
+ call.reject("ACCESS_WIFI_STATE permission is required")
68
+ return
69
+ }
70
+ val manager = wifiManager
71
+ if (manager == null) {
72
+ call.reject("Wi-Fi service is unavailable on this device")
73
+ return
74
+ }
75
+ val info = manager.connectionInfo
76
+ val result = JSObject()
77
+ if (info == null || info.networkId == -1) {
78
+ result.put("network", JSObject.NULL)
79
+ call.resolve(result)
80
+ return
81
+ }
82
+ val network = JSObject()
83
+ network.put("ssid", trimQuotes(info.ssid))
84
+ network.put("bssid", info.bssid ?: "")
85
+ network.put("rssi", info.rssi)
86
+ network.put("frequency", info.frequency)
87
+ network.put("capabilities", "")
88
+ network.put("secured", false)
89
+ result.put("network", network)
90
+ call.resolve(result)
91
+ }
92
+
93
+ @PluginMethod
94
+ fun listAvailableNetworks(call: PluginCall) {
95
+ if (!hasPermission(Manifest.permission.ACCESS_WIFI_STATE)) {
96
+ call.reject("ACCESS_WIFI_STATE permission is required")
97
+ return
98
+ }
99
+ // scanResults is gated behind ACCESS_FINE_LOCATION on API 26+. Reject
100
+ // with a clear message rather than letting the platform return an
101
+ // empty list — callers can prompt for location and retry.
102
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O &&
103
+ !hasPermission(Manifest.permission.ACCESS_FINE_LOCATION)
104
+ ) {
105
+ call.reject("ACCESS_FINE_LOCATION required for Wi-Fi scans on API 26+")
106
+ return
107
+ }
108
+ val manager = wifiManager
109
+ if (manager == null) {
110
+ call.reject("Wi-Fi service is unavailable on this device")
111
+ return
112
+ }
113
+ val maxAge = call.getInt("maxAge") ?: 30_000
114
+ val limit = call.getInt("limit") ?: 0
115
+ val now = System.currentTimeMillis()
116
+ if (lastScanCompletedAtMs == 0L || now - lastScanCompletedAtMs > maxAge) {
117
+ // startScan is best-effort and rate-limited on modern Android; the
118
+ // returned boolean is informational only.
119
+ manager.startScan()
120
+ lastScanCompletedAtMs = now
121
+ }
122
+ val seenSsids = HashSet<String>()
123
+ val networks = JSArray()
124
+ val scanResults: List<ScanResult> = manager.scanResults ?: emptyList()
125
+ // Sort by signal strength (closest / strongest first) for stable UI ordering.
126
+ val sorted = scanResults.sortedByDescending { it.level }
127
+ for (result in sorted) {
128
+ val ssid = result.SSID ?: ""
129
+ if (ssid.isEmpty()) continue
130
+ if (!seenSsids.add(ssid)) continue
131
+ val capabilities = result.capabilities ?: ""
132
+ val entry = JSObject()
133
+ entry.put("ssid", ssid)
134
+ entry.put("bssid", result.BSSID ?: "")
135
+ entry.put("rssi", result.level)
136
+ entry.put("frequency", result.frequency)
137
+ entry.put("capabilities", capabilities)
138
+ entry.put("secured", isSecured(capabilities))
139
+ networks.put(entry)
140
+ if (limit > 0 && networks.length() >= limit) break
141
+ }
142
+ val response = JSObject()
143
+ response.put("networks", networks)
144
+ call.resolve(response)
145
+ }
146
+
147
+ @PluginMethod
148
+ fun connectToNetwork(call: PluginCall) {
149
+ if (!hasPermission(Manifest.permission.CHANGE_WIFI_STATE)) {
150
+ call.reject("CHANGE_WIFI_STATE permission is required")
151
+ return
152
+ }
153
+ val ssid = call.getString("ssid")?.trim()
154
+ if (ssid.isNullOrEmpty()) {
155
+ call.reject("ssid is required")
156
+ return
157
+ }
158
+ val password = call.getString("password")
159
+ val hidden = call.getBoolean("hidden") ?: false
160
+ val manager = wifiManager
161
+ if (manager == null) {
162
+ call.reject("Wi-Fi service is unavailable on this device")
163
+ return
164
+ }
165
+ val ok = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
166
+ connectViaSuggestion(manager, ssid, password, hidden)
167
+ } else {
168
+ @Suppress("DEPRECATION")
169
+ connectViaLegacyConfig(manager, ssid, password, hidden)
170
+ }
171
+ val response = JSObject()
172
+ response.put("success", ok)
173
+ if (!ok) {
174
+ response.put("message", "Failed to request connection to $ssid")
175
+ }
176
+ call.resolve(response)
177
+ }
178
+
179
+ @PluginMethod
180
+ fun disconnectFromNetwork(call: PluginCall) {
181
+ if (!hasPermission(Manifest.permission.CHANGE_WIFI_STATE)) {
182
+ call.reject("CHANGE_WIFI_STATE permission is required")
183
+ return
184
+ }
185
+ val manager = wifiManager
186
+ if (manager == null) {
187
+ call.reject("Wi-Fi service is unavailable on this device")
188
+ return
189
+ }
190
+ @Suppress("DEPRECATION")
191
+ val ok = manager.disconnect()
192
+ val response = JSObject()
193
+ response.put("success", ok)
194
+ if (!ok) {
195
+ response.put("message", "WifiManager.disconnect() returned false")
196
+ }
197
+ call.resolve(response)
198
+ }
199
+
200
+ // -----------------------------------------------------------------------
201
+ // Helpers
202
+ // -----------------------------------------------------------------------
203
+
204
+ /**
205
+ * Modern (API 29+) connect path. Adds a network suggestion plus a
206
+ * matching `NetworkRequest` so the system attempts a connection on our
207
+ * behalf. Returns true when the suggestion was accepted; the actual
208
+ * connection state should be observed via `getConnectedNetwork`.
209
+ */
210
+ private fun connectViaSuggestion(
211
+ manager: WifiManager,
212
+ ssid: String,
213
+ password: String?,
214
+ hidden: Boolean,
215
+ ): Boolean {
216
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) return false
217
+ val suggestionBuilder = WifiNetworkSuggestion.Builder()
218
+ .setSsid(ssid)
219
+ .setIsHiddenSsid(hidden)
220
+ if (!password.isNullOrEmpty()) {
221
+ suggestionBuilder.setWpa2Passphrase(password)
222
+ }
223
+ val suggestion = suggestionBuilder.build()
224
+ // Replace any prior suggestions for the same SSID before re-adding.
225
+ manager.removeNetworkSuggestions(listOf(suggestion))
226
+ val addStatus = manager.addNetworkSuggestions(listOf(suggestion))
227
+ if (addStatus != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
228
+ return false
229
+ }
230
+ val specifierBuilder = WifiNetworkSpecifier.Builder()
231
+ .setSsid(ssid)
232
+ .setIsHiddenSsid(hidden)
233
+ if (!password.isNullOrEmpty()) {
234
+ specifierBuilder.setWpa2Passphrase(password)
235
+ }
236
+ val request = NetworkRequest.Builder()
237
+ .addTransportType(android.net.NetworkCapabilities.TRANSPORT_WIFI)
238
+ .setNetworkSpecifier(specifierBuilder.build())
239
+ .build()
240
+ connectivityManager?.requestNetwork(request, NoOpNetworkCallback)
241
+ return true
242
+ }
243
+
244
+ /**
245
+ * Legacy connect path for API 23–28. Uses the deprecated
246
+ * `WifiConfiguration` API which still works for system / privileged
247
+ * callers (Eliza ships as a privileged system app).
248
+ */
249
+ @Suppress("DEPRECATION")
250
+ private fun connectViaLegacyConfig(
251
+ manager: WifiManager,
252
+ ssid: String,
253
+ password: String?,
254
+ hidden: Boolean,
255
+ ): Boolean {
256
+ val config = WifiConfiguration()
257
+ config.SSID = "\"$ssid\""
258
+ config.hiddenSSID = hidden
259
+ if (password.isNullOrEmpty()) {
260
+ config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE)
261
+ } else {
262
+ config.preSharedKey = "\"$password\""
263
+ config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK)
264
+ }
265
+ val networkId = manager.addNetwork(config)
266
+ if (networkId == -1) return false
267
+ manager.disconnect()
268
+ val enabled = manager.enableNetwork(networkId, true)
269
+ manager.reconnect()
270
+ return enabled
271
+ }
272
+
273
+ /**
274
+ * `WifiInfo.getSsid()` returns the SSID wrapped in quotes
275
+ * (e.g. `"home-wifi"`). Strip them for display.
276
+ */
277
+ private fun trimQuotes(ssid: String?): String {
278
+ if (ssid.isNullOrEmpty()) return ""
279
+ if (ssid.length >= 2 && ssid.startsWith("\"") && ssid.endsWith("\"")) {
280
+ return ssid.substring(1, ssid.length - 1)
281
+ }
282
+ return ssid
283
+ }
284
+
285
+ /**
286
+ * Treat any capability string mentioning a security suite as "secured".
287
+ * Open networks report capabilities like "[ESS]" with no auth marker.
288
+ */
289
+ private fun isSecured(capabilities: String): Boolean {
290
+ if (capabilities.isEmpty()) return false
291
+ val upper = capabilities.uppercase()
292
+ return upper.contains("WPA") ||
293
+ upper.contains("WEP") ||
294
+ upper.contains("PSK") ||
295
+ upper.contains("EAP") ||
296
+ upper.contains("SAE")
297
+ }
298
+
299
+ /** No-op callback for the `requestNetwork` call — connection state is queried separately. */
300
+ private object NoOpNetworkCallback : ConnectivityManager.NetworkCallback()
301
+ }
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Type definitions for the @elizaos/capacitor-wifi bridge.
3
+ *
4
+ * The native side is implemented in Kotlin under
5
+ * android/src/main/java/ai/eliza/plugins/wifi/WiFiPlugin.kt and is registered
6
+ * with Capacitor as `ElizaWiFi`. The web fallback in `./web.ts` resolves
7
+ * with empty data and a warning so type-only consumers compile cleanly.
8
+ */
9
+ /** Information about a single Wi-Fi network (scan result or active connection). */
10
+ export interface WiFiNetwork {
11
+ /** Service Set Identifier — display name of the network. May be empty when hidden. */
12
+ ssid: string;
13
+ /** BSSID — MAC of the access point. */
14
+ bssid: string;
15
+ /** Signal strength in dBm (typical range -30 strongest to -90 weakest). */
16
+ rssi: number;
17
+ /** Channel frequency in MHz (e.g. 2412, 5180). */
18
+ frequency: number;
19
+ /**
20
+ * Capability descriptor reported by `WifiManager.scanResults` (e.g.
21
+ * "[WPA2-PSK-CCMP][ESS]"). Empty for the active connection on Android,
22
+ * which does not expose capabilities for the connected network.
23
+ */
24
+ capabilities: string;
25
+ /** Whether the network requires a password / key. */
26
+ secured: boolean;
27
+ }
28
+ /** Optional filters/tuning passed to `listAvailableNetworks`. */
29
+ export interface ListNetworksOptions {
30
+ /**
31
+ * If a fresh scan was completed within `maxAge` milliseconds, reuse those
32
+ * results instead of triggering a new `startScan`. Defaults to 30000.
33
+ */
34
+ maxAge?: number;
35
+ /** Cap the number of networks returned (after de-duplication by SSID). */
36
+ limit?: number;
37
+ }
38
+ /** Parameters for `connectToNetwork`. */
39
+ export interface ConnectOptions {
40
+ /** Target SSID. Required. */
41
+ ssid: string;
42
+ /** Password / passphrase. Omit for open networks. */
43
+ password?: string;
44
+ /** Whether the SSID is hidden / not broadcast. Defaults to false. */
45
+ hidden?: boolean;
46
+ }
47
+ /** Result returned by `getWifiState`. */
48
+ export interface WifiStateResult {
49
+ /** Whether the Wi-Fi radio is enabled. */
50
+ enabled: boolean;
51
+ /** Whether a network is currently connected. */
52
+ connected: boolean;
53
+ /** Signal strength of the active connection in dBm, when connected. */
54
+ rssi: number | null;
55
+ }
56
+ /** Result returned by `getConnectedNetwork`. */
57
+ export interface ConnectedNetworkResult {
58
+ /** The active connection details, or null when not connected. */
59
+ network: WiFiNetwork | null;
60
+ }
61
+ /** Result returned by `listAvailableNetworks`. */
62
+ export interface ListNetworksResult {
63
+ networks: WiFiNetwork[];
64
+ }
65
+ /** Result returned by `connectToNetwork` and `disconnectFromNetwork`. */
66
+ export interface ConnectResult {
67
+ success: boolean;
68
+ /** Optional human-readable message, populated on failure. */
69
+ message?: string;
70
+ }
71
+ /** Public Capacitor plugin contract — implemented natively on Android, stubbed on web. */
72
+ export interface WiFiPlugin {
73
+ /** Read radio + active connection state. */
74
+ getWifiState(): Promise<WifiStateResult>;
75
+ /** Read active connection details. */
76
+ getConnectedNetwork(): Promise<ConnectedNetworkResult>;
77
+ /** Trigger a scan (or reuse a recent one) and return nearby networks. */
78
+ listAvailableNetworks(options?: ListNetworksOptions): Promise<ListNetworksResult>;
79
+ /** Best-effort connect using the appropriate per-API path. */
80
+ connectToNetwork(options: ConnectOptions): Promise<ConnectResult>;
81
+ /** Disconnect the currently connected network. */
82
+ disconnectFromNetwork(): Promise<ConnectResult>;
83
+ }
84
+ //# sourceMappingURL=definitions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,mFAAmF;AACnF,MAAM,WAAW,WAAW;IAC1B,sFAAsF;IACtF,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,iEAAiE;AACjE,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,yCAAyC;AACzC,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,yCAAyC;AACzC,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,SAAS,EAAE,OAAO,CAAC;IACnB,uEAAuE;IACvE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,gDAAgD;AAChD,MAAM,WAAW,sBAAsB;IACrC,iEAAiE;IACjE,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;CAC7B;AAED,kDAAkD;AAClD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,0FAA0F;AAC1F,MAAM,WAAW,UAAU;IACzB,4CAA4C;IAC5C,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IACzC,sCAAsC;IACtC,mBAAmB,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACvD,yEAAyE;IACzE,qBAAqB,CACnB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC/B,8DAA8D;IAC9D,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAClE,kDAAkD;IAClD,qBAAqB,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CACjD"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Type definitions for the @elizaos/capacitor-wifi bridge.
3
+ *
4
+ * The native side is implemented in Kotlin under
5
+ * android/src/main/java/ai/eliza/plugins/wifi/WiFiPlugin.kt and is registered
6
+ * with Capacitor as `ElizaWiFi`. The web fallback in `./web.ts` resolves
7
+ * with empty data and a warning so type-only consumers compile cleanly.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,4 @@
1
+ import type { WiFiPlugin } from "./definitions";
2
+ export * from "./definitions";
3
+ export declare const WiFi: WiFiPlugin;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,cAAc,eAAe,CAAC;AAI9B,eAAO,MAAM,IAAI,YAEf,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { registerPlugin } from "@capacitor/core";
2
+ export * from "./definitions";
3
+ const loadWeb = () => import("./web").then((m) => new m.WiFiWeb());
4
+ export const WiFi = registerPlugin("ElizaWiFi", {
5
+ web: loadWeb,
6
+ });
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIjD,cAAc,eAAe,CAAC;AAE9B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAEnE,MAAM,CAAC,MAAM,IAAI,GAAG,cAAc,CAAa,WAAW,EAAE;IAC1D,GAAG,EAAE,OAAO;CACb,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { WebPlugin } from "@capacitor/core";
2
+ import type { ConnectedNetworkResult, ConnectOptions, ConnectResult, ListNetworksOptions, ListNetworksResult, WiFiPlugin, WifiStateResult } from "./definitions";
3
+ /**
4
+ * Web fallback — every method resolves with empty / disabled data so the
5
+ * full TypeScript interface is satisfied without throwing during normal
6
+ * desktop or browser dev sessions. `connectToNetwork` and
7
+ * `disconnectFromNetwork` resolve with `{ success: false }` because there is
8
+ * no meaningful action to take on the web side.
9
+ */
10
+ export declare class WiFiWeb extends WebPlugin implements WiFiPlugin {
11
+ getWifiState(): Promise<WifiStateResult>;
12
+ getConnectedNetwork(): Promise<ConnectedNetworkResult>;
13
+ listAvailableNetworks(_options?: ListNetworksOptions): Promise<ListNetworksResult>;
14
+ connectToNetwork(_options: ConnectOptions): Promise<ConnectResult>;
15
+ disconnectFromNetwork(): Promise<ConnectResult>;
16
+ }
17
+ //# sourceMappingURL=web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,KAAK,EACV,sBAAsB,EACtB,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,eAAe,EAChB,MAAM,eAAe,CAAC;AAWvB;;;;;;GAMG;AACH,qBAAa,OAAQ,SAAQ,SAAU,YAAW,UAAU;IACpD,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC;IAKxC,mBAAmB,IAAI,OAAO,CAAC,sBAAsB,CAAC;IAKtD,qBAAqB,CACzB,QAAQ,CAAC,EAAE,mBAAmB,GAC7B,OAAO,CAAC,kBAAkB,CAAC;IAKxB,gBAAgB,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAKlE,qBAAqB,IAAI,OAAO,CAAC,aAAa,CAAC;CAItD"}
@@ -0,0 +1,39 @@
1
+ import { WebPlugin } from "@capacitor/core";
2
+ const UNAVAILABLE_MESSAGE = "Wi-Fi controls are only available on Android.";
3
+ let warned = false;
4
+ function warnOnce() {
5
+ if (warned)
6
+ return;
7
+ warned = true;
8
+ console.warn(`[ElizaWiFi] ${UNAVAILABLE_MESSAGE}`);
9
+ }
10
+ /**
11
+ * Web fallback — every method resolves with empty / disabled data so the
12
+ * full TypeScript interface is satisfied without throwing during normal
13
+ * desktop or browser dev sessions. `connectToNetwork` and
14
+ * `disconnectFromNetwork` resolve with `{ success: false }` because there is
15
+ * no meaningful action to take on the web side.
16
+ */
17
+ export class WiFiWeb extends WebPlugin {
18
+ async getWifiState() {
19
+ warnOnce();
20
+ return { enabled: false, connected: false, rssi: null };
21
+ }
22
+ async getConnectedNetwork() {
23
+ warnOnce();
24
+ return { network: null };
25
+ }
26
+ async listAvailableNetworks(_options) {
27
+ warnOnce();
28
+ return { networks: [] };
29
+ }
30
+ async connectToNetwork(_options) {
31
+ warnOnce();
32
+ return { success: false, message: UNAVAILABLE_MESSAGE };
33
+ }
34
+ async disconnectFromNetwork() {
35
+ warnOnce();
36
+ return { success: false, message: UNAVAILABLE_MESSAGE };
37
+ }
38
+ }
39
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAY5C,MAAM,mBAAmB,GAAG,+CAA+C,CAAC;AAE5E,IAAI,MAAM,GAAG,KAAK,CAAC;AACnB,SAAS,QAAQ;IACf,IAAI,MAAM;QAAE,OAAO;IACnB,MAAM,GAAG,IAAI,CAAC;IACd,OAAO,CAAC,IAAI,CAAC,eAAe,mBAAmB,EAAE,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,OAAO,OAAQ,SAAQ,SAAS;IACpC,KAAK,CAAC,YAAY;QAChB,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,qBAAqB,CACzB,QAA8B;QAE9B,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,QAAwB;QAC7C,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,qBAAqB;QACzB,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC1D,CAAC;CACF"}
@@ -0,0 +1,54 @@
1
+ 'use strict';
2
+
3
+ var core = require('@capacitor/core');
4
+
5
+ const loadWeb = () => Promise.resolve().then(function () { return web; }).then((m) => new m.WiFiWeb());
6
+ const WiFi = core.registerPlugin("ElizaWiFi", {
7
+ web: loadWeb,
8
+ });
9
+
10
+ const UNAVAILABLE_MESSAGE = "Wi-Fi controls are only available on Android.";
11
+ let warned = false;
12
+ function warnOnce() {
13
+ if (warned)
14
+ return;
15
+ warned = true;
16
+ console.warn(`[ElizaWiFi] ${UNAVAILABLE_MESSAGE}`);
17
+ }
18
+ /**
19
+ * Web fallback — every method resolves with empty / disabled data so the
20
+ * full TypeScript interface is satisfied without throwing during normal
21
+ * desktop or browser dev sessions. `connectToNetwork` and
22
+ * `disconnectFromNetwork` resolve with `{ success: false }` because there is
23
+ * no meaningful action to take on the web side.
24
+ */
25
+ class WiFiWeb extends core.WebPlugin {
26
+ async getWifiState() {
27
+ warnOnce();
28
+ return { enabled: false, connected: false, rssi: null };
29
+ }
30
+ async getConnectedNetwork() {
31
+ warnOnce();
32
+ return { network: null };
33
+ }
34
+ async listAvailableNetworks(_options) {
35
+ warnOnce();
36
+ return { networks: [] };
37
+ }
38
+ async connectToNetwork(_options) {
39
+ warnOnce();
40
+ return { success: false, message: UNAVAILABLE_MESSAGE };
41
+ }
42
+ async disconnectFromNetwork() {
43
+ warnOnce();
44
+ return { success: false, message: UNAVAILABLE_MESSAGE };
45
+ }
46
+ }
47
+
48
+ var web = /*#__PURE__*/Object.freeze({
49
+ __proto__: null,
50
+ WiFiWeb: WiFiWeb
51
+ });
52
+
53
+ exports.WiFi = WiFi;
54
+ //# sourceMappingURL=plugin.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from \"@capacitor/core\";\nexport * from \"./definitions\";\nconst loadWeb = () => import(\"./web\").then((m) => new m.WiFiWeb());\nexport const WiFi = registerPlugin(\"ElizaWiFi\", {\n web: loadWeb,\n});\n//# sourceMappingURL=index.js.map","import { WebPlugin } from \"@capacitor/core\";\nconst UNAVAILABLE_MESSAGE = \"Wi-Fi controls are only available on Android.\";\nlet warned = false;\nfunction warnOnce() {\n if (warned)\n return;\n warned = true;\n console.warn(`[ElizaWiFi] ${UNAVAILABLE_MESSAGE}`);\n}\n/**\n * Web fallback — every method resolves with empty / disabled data so the\n * full TypeScript interface is satisfied without throwing during normal\n * desktop or browser dev sessions. `connectToNetwork` and\n * `disconnectFromNetwork` resolve with `{ success: false }` because there is\n * no meaningful action to take on the web side.\n */\nexport class WiFiWeb extends WebPlugin {\n async getWifiState() {\n warnOnce();\n return { enabled: false, connected: false, rssi: null };\n }\n async getConnectedNetwork() {\n warnOnce();\n return { network: null };\n }\n async listAvailableNetworks(_options) {\n warnOnce();\n return { networks: [] };\n }\n async connectToNetwork(_options) {\n warnOnce();\n return { success: false, message: UNAVAILABLE_MESSAGE };\n }\n async disconnectFromNetwork() {\n warnOnce();\n return { success: false, message: UNAVAILABLE_MESSAGE };\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":";;;;AAEA,MAAM,OAAO,GAAG,MAAM,mDAAe,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AACtD,MAAC,IAAI,GAAGA,mBAAc,CAAC,WAAW,EAAE;AAChD,IAAI,GAAG,EAAE,OAAO;AAChB,CAAC;;ACJD,MAAM,mBAAmB,GAAG,+CAA+C;AAC3E,IAAI,MAAM,GAAG,KAAK;AAClB,SAAS,QAAQ,GAAG;AACpB,IAAI,IAAI,MAAM;AACd,QAAQ;AACR,IAAI,MAAM,GAAG,IAAI;AACjB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC,CAAC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,OAAO,SAASC,cAAS,CAAC;AACvC,IAAI,MAAM,YAAY,GAAG;AACzB,QAAQ,QAAQ,EAAE;AAClB,QAAQ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE;AAC/D,IAAI;AACJ,IAAI,MAAM,mBAAmB,GAAG;AAChC,QAAQ,QAAQ,EAAE;AAClB,QAAQ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;AAChC,IAAI;AACJ,IAAI,MAAM,qBAAqB,CAAC,QAAQ,EAAE;AAC1C,QAAQ,QAAQ,EAAE;AAClB,QAAQ,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC/B,IAAI;AACJ,IAAI,MAAM,gBAAgB,CAAC,QAAQ,EAAE;AACrC,QAAQ,QAAQ,EAAE;AAClB,QAAQ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE;AAC/D,IAAI;AACJ,IAAI,MAAM,qBAAqB,GAAG;AAClC,QAAQ,QAAQ,EAAE;AAClB,QAAQ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE;AAC/D,IAAI;AACJ;;;;;;;;;"}
package/dist/plugin.js ADDED
@@ -0,0 +1,57 @@
1
+ var capacitorWifi = (function (exports, core) {
2
+ 'use strict';
3
+
4
+ const loadWeb = () => Promise.resolve().then(function () { return web; }).then((m) => new m.WiFiWeb());
5
+ const WiFi = core.registerPlugin("ElizaWiFi", {
6
+ web: loadWeb,
7
+ });
8
+
9
+ const UNAVAILABLE_MESSAGE = "Wi-Fi controls are only available on Android.";
10
+ let warned = false;
11
+ function warnOnce() {
12
+ if (warned)
13
+ return;
14
+ warned = true;
15
+ console.warn(`[ElizaWiFi] ${UNAVAILABLE_MESSAGE}`);
16
+ }
17
+ /**
18
+ * Web fallback — every method resolves with empty / disabled data so the
19
+ * full TypeScript interface is satisfied without throwing during normal
20
+ * desktop or browser dev sessions. `connectToNetwork` and
21
+ * `disconnectFromNetwork` resolve with `{ success: false }` because there is
22
+ * no meaningful action to take on the web side.
23
+ */
24
+ class WiFiWeb extends core.WebPlugin {
25
+ async getWifiState() {
26
+ warnOnce();
27
+ return { enabled: false, connected: false, rssi: null };
28
+ }
29
+ async getConnectedNetwork() {
30
+ warnOnce();
31
+ return { network: null };
32
+ }
33
+ async listAvailableNetworks(_options) {
34
+ warnOnce();
35
+ return { networks: [] };
36
+ }
37
+ async connectToNetwork(_options) {
38
+ warnOnce();
39
+ return { success: false, message: UNAVAILABLE_MESSAGE };
40
+ }
41
+ async disconnectFromNetwork() {
42
+ warnOnce();
43
+ return { success: false, message: UNAVAILABLE_MESSAGE };
44
+ }
45
+ }
46
+
47
+ var web = /*#__PURE__*/Object.freeze({
48
+ __proto__: null,
49
+ WiFiWeb: WiFiWeb
50
+ });
51
+
52
+ exports.WiFi = WiFi;
53
+
54
+ return exports;
55
+
56
+ })({}, capacitorExports);
57
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from \"@capacitor/core\";\nexport * from \"./definitions\";\nconst loadWeb = () => import(\"./web\").then((m) => new m.WiFiWeb());\nexport const WiFi = registerPlugin(\"ElizaWiFi\", {\n web: loadWeb,\n});\n//# sourceMappingURL=index.js.map","import { WebPlugin } from \"@capacitor/core\";\nconst UNAVAILABLE_MESSAGE = \"Wi-Fi controls are only available on Android.\";\nlet warned = false;\nfunction warnOnce() {\n if (warned)\n return;\n warned = true;\n console.warn(`[ElizaWiFi] ${UNAVAILABLE_MESSAGE}`);\n}\n/**\n * Web fallback — every method resolves with empty / disabled data so the\n * full TypeScript interface is satisfied without throwing during normal\n * desktop or browser dev sessions. `connectToNetwork` and\n * `disconnectFromNetwork` resolve with `{ success: false }` because there is\n * no meaningful action to take on the web side.\n */\nexport class WiFiWeb extends WebPlugin {\n async getWifiState() {\n warnOnce();\n return { enabled: false, connected: false, rssi: null };\n }\n async getConnectedNetwork() {\n warnOnce();\n return { network: null };\n }\n async listAvailableNetworks(_options) {\n warnOnce();\n return { networks: [] };\n }\n async connectToNetwork(_options) {\n warnOnce();\n return { success: false, message: UNAVAILABLE_MESSAGE };\n }\n async disconnectFromNetwork() {\n warnOnce();\n return { success: false, message: UNAVAILABLE_MESSAGE };\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":";;;IAEA,MAAM,OAAO,GAAG,MAAM,mDAAe,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AACtD,UAAC,IAAI,GAAGA,mBAAc,CAAC,WAAW,EAAE;IAChD,IAAI,GAAG,EAAE,OAAO;IAChB,CAAC;;ICJD,MAAM,mBAAmB,GAAG,+CAA+C;IAC3E,IAAI,MAAM,GAAG,KAAK;IAClB,SAAS,QAAQ,GAAG;IACpB,IAAI,IAAI,MAAM;IACd,QAAQ;IACR,IAAI,MAAM,GAAG,IAAI;IACjB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC,CAAC;IACtD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACO,MAAM,OAAO,SAASC,cAAS,CAAC;IACvC,IAAI,MAAM,YAAY,GAAG;IACzB,QAAQ,QAAQ,EAAE;IAClB,QAAQ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE;IAC/D,IAAI;IACJ,IAAI,MAAM,mBAAmB,GAAG;IAChC,QAAQ,QAAQ,EAAE;IAClB,QAAQ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAChC,IAAI;IACJ,IAAI,MAAM,qBAAqB,CAAC,QAAQ,EAAE;IAC1C,QAAQ,QAAQ,EAAE;IAClB,QAAQ,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC/B,IAAI;IACJ,IAAI,MAAM,gBAAgB,CAAC,QAAQ,EAAE;IACrC,QAAQ,QAAQ,EAAE;IAClB,QAAQ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE;IAC/D,IAAI;IACJ,IAAI,MAAM,qBAAqB,GAAG;IAClC,QAAQ,QAAQ,EAAE;IAClB,QAAQ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE;IAC/D,IAAI;IACJ;;;;;;;;;;;;;;;"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@elizaos/capacitor-wifi",
3
+ "version": "2.0.0-beta.1",
4
+ "description": "Android Wi-Fi (WifiManager) bridge for ElizaOS.",
5
+ "main": "./dist/plugin.cjs.js",
6
+ "module": "./dist/esm/index.js",
7
+ "types": "./dist/esm/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/esm/index.d.ts",
11
+ "import": "./dist/esm/index.js",
12
+ "require": "./dist/plugin.cjs.js"
13
+ },
14
+ "./package.json": "./package.json"
15
+ },
16
+ "files": [
17
+ "android/src/main/",
18
+ "android/build.gradle",
19
+ "dist/",
20
+ "dist"
21
+ ],
22
+ "scripts": {
23
+ "build": "bun run clean && tsc && bun --bun rollup -c rollup.config.mjs",
24
+ "clean": "node ../../../scripts/rm-path-recursive.mjs dist",
25
+ "prepublishOnly": "bun run build"
26
+ },
27
+ "license": "MIT",
28
+ "capacitor": {
29
+ "android": {
30
+ "src": "android"
31
+ }
32
+ },
33
+ "devDependencies": {
34
+ "@capacitor/cli": "^8.0.0",
35
+ "@capacitor/core": "^8.3.1",
36
+ "rimraf": "^6.0.0",
37
+ "rollup": "^4.60.2",
38
+ "typescript": "^6.0.3"
39
+ },
40
+ "peerDependencies": {
41
+ "@capacitor/core": "^8.3.1"
42
+ },
43
+ "elizaos": {
44
+ "platforms": [
45
+ "browser",
46
+ "node"
47
+ ],
48
+ "runtime": "both",
49
+ "platformDetails": {
50
+ "browser": "Web fallback throws — Wi-Fi is only available on Android.",
51
+ "android": true
52
+ }
53
+ },
54
+ "publishConfig": {
55
+ "access": "public"
56
+ }
57
+ }