@elizaos/capacitor-websiteblocker 1.0.0 → 2.0.11-beta.7

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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Shaw Walters and elizaOS Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,75 @@
1
+ # @elizaos/capacitor-websiteblocker
2
+
3
+ A Capacitor plugin that enforces website blocking across browser, Android, and iOS from a single TypeScript API. Used inside elizaOS Eliza app shells.
4
+
5
+ ## What it does
6
+
7
+ - **Browser / web:** Delegates all blocking operations to the Eliza runtime HTTP API (`/api/website-blocker`).
8
+ - **Android:** Runs a foreground split-tunnel VPN service that intercepts DNS queries and blocks the configured hostnames system-wide. Blocking survives device reboot via a `BroadcastReceiver`.
9
+ - **iOS:** Manages a native Safari content-blocker extension. Block rules are written to a shared App Group `UserDefaults` store and reloaded via `SFContentBlockerManager`.
10
+
11
+ ## Capabilities
12
+
13
+ | Method | Description |
14
+ |---|---|
15
+ | `WebsiteBlocker.getStatus()` | Returns blocker state: `active`, `websites`, `engine`, permission status, `endsAt` |
16
+ | `WebsiteBlocker.startBlock(options)` | Starts blocking. Accepts `websites: string[]`, optional `durationMinutes`, optional `text` (hostnames extracted from free text) |
17
+ | `WebsiteBlocker.stopBlock()` | Removes block state and shuts down the active blocker |
18
+ | `WebsiteBlocker.checkPermissions()` | Returns current permission status without prompting the user |
19
+ | `WebsiteBlocker.requestPermissions()` | Triggers the platform consent flow (VPN dialog on Android; Settings redirect on iOS) |
20
+ | `WebsiteBlocker.openSettings()` | Opens VPN settings (Android) or Safari Extensions settings (iOS) |
21
+
22
+ ## Installation
23
+
24
+ ```bash
25
+ npm install @elizaos/capacitor-websiteblocker
26
+ npx cap sync
27
+ ```
28
+
29
+ This package is a Capacitor plugin, not a standalone elizaOS runtime plugin. It must be consumed from a Capacitor app that embeds an Eliza agent.
30
+
31
+ ## Platform requirements
32
+
33
+ ### iOS
34
+
35
+ - iOS 15.0+
36
+ - A Safari Content Blocker extension target sharing the same App Group entitlement (`group.<bundleId>`).
37
+ - The user must enable the extension in **Settings > Safari > Extensions** before blocking takes effect. `startBlock` saves state but returns `success: false` (with a descriptive message) until the extension is enabled.
38
+
39
+ ### Android
40
+
41
+ - Android VPN consent is required before the first block. `startBlock` triggers the system VPN permission dialog automatically if consent has not been granted.
42
+ - The plugin's `AndroidManifest.xml` already declares the required permissions and service binding:
43
+ - `android.permission.FOREGROUND_SERVICE` / `android.permission.FOREGROUND_SERVICE_SPECIAL_USE`
44
+ - `android.permission.POST_NOTIFICATIONS`
45
+ - `android.permission.RECEIVE_BOOT_COMPLETED`
46
+ - `BIND_VPN_SERVICE` on `WebsiteBlockerVpnService`
47
+
48
+ ### Browser / web
49
+
50
+ - Requires `window.__ELIZA_API_BASE__` and optionally `window.__ELIZA_API_TOKEN__` (or `sessionStorage.eliza_api_token`) to be set by the app shell so the plugin can reach the Eliza runtime API.
51
+
52
+ ## Usage
53
+
54
+ ```typescript
55
+ import { WebsiteBlocker } from "@elizaos/capacitor-websiteblocker";
56
+
57
+ // Check current state
58
+ const status = await WebsiteBlocker.getStatus();
59
+
60
+ // Block sites for 30 minutes
61
+ const result = await WebsiteBlocker.startBlock({
62
+ websites: ["x.com", "reddit.com"],
63
+ durationMinutes: 30,
64
+ });
65
+
66
+ // Remove block
67
+ await WebsiteBlocker.stopBlock();
68
+ ```
69
+
70
+ ## Notes
71
+
72
+ - Blocking `x.com` or `twitter.com` automatically expands to the full set of related subdomains (`mobile.x.com`, `t.co`, CDN domains, etc.) and allowlists API endpoints.
73
+ - Hostnames are normalized: protocols and paths are stripped, hostnames without a dot are rejected.
74
+ - `durationMinutes` can be a number or a numeric string. Omit or pass `null` for an indefinite block.
75
+
@@ -7,6 +7,19 @@ ext {
7
7
  }
8
8
 
9
9
  apply plugin: 'com.android.library'
10
+ // Explicitly apply the Kotlin Android plugin. The kotlin-gradle-plugin is on
11
+ // the root buildscript classpath, but without applying it here AGP 8.13 falls
12
+ // back to its "built-in Kotlin" compile path (build/intermediates/
13
+ // built_in_kotlinc), which compiles the .kt sources but does NOT bundle the
14
+ // resulting .class files into the *release* library jar (the release
15
+ // classes.jar comes out empty save for R.class). The app's
16
+ // :app:assembleRelease then links a library AAR with zero plugin classes,
17
+ // R8 has nothing to keep, and manifest-declared components such as
18
+ // WebsiteBlockerBootReceiver / WebsiteBlockerVpnService are absent from the
19
+ // final dex — crashing the app at BOOT_COMPLETED with ClassNotFoundException.
20
+ // Applying the standard Kotlin plugin wires Kotlin compilation into both the
21
+ // debug and release jar-bundling tasks.
22
+ apply plugin: 'org.jetbrains.kotlin.android'
10
23
  android {
11
24
  namespace = "ai.eliza.plugins.websiteblocker"
12
25
  compileSdk project.hasProperty('compileSdkVersion') ? rootProject.ext.compileSdkVersion : 34
@@ -25,8 +38,12 @@ android {
25
38
  }
26
39
 
27
40
  compileOptions {
28
- sourceCompatibility JavaVersion.VERSION_17
29
- targetCompatibility JavaVersion.VERSION_17
41
+ sourceCompatibility JavaVersion.VERSION_21
42
+ targetCompatibility JavaVersion.VERSION_21
43
+ }
44
+
45
+ kotlinOptions {
46
+ jvmTarget = "21"
30
47
  }
31
48
 
32
49
  }
@@ -34,7 +51,7 @@ android {
34
51
  repositories {
35
52
  google()
36
53
  maven {
37
- url = uri(rootProject.ext.mavenCentralMirrorUrl)
54
+ url = uri(rootProject.ext.has('mavenCentralMirrorUrl') ? rootProject.ext.mavenCentralMirrorUrl : 'https://repo.maven.apache.org/maven2')
38
55
  }
39
56
  mavenCentral()
40
57
  }
@@ -98,6 +98,9 @@ class WebsiteBlockerPlugin : Plugin() {
98
98
  if (activity == null) {
99
99
  call.resolve(JSObject().apply {
100
100
  put("opened", false)
101
+ put("target", "vpn")
102
+ put("actualTarget", "vpn")
103
+ put("reason", "Android activity is unavailable.")
101
104
  })
102
105
  return
103
106
  }
@@ -105,6 +108,9 @@ class WebsiteBlockerPlugin : Plugin() {
105
108
  activity.startActivity(Intent(Settings.ACTION_VPN_SETTINGS))
106
109
  call.resolve(JSObject().apply {
107
110
  put("opened", true)
111
+ put("target", "vpn")
112
+ put("actualTarget", "vpn")
113
+ put("reason", null)
108
114
  })
109
115
  }
110
116
 
@@ -192,6 +198,9 @@ class WebsiteBlockerPlugin : Plugin() {
192
198
  return JSObject().apply {
193
199
  put("status", if (granted) "granted" else "not-determined")
194
200
  put("canRequest", !granted)
201
+ put("canOpenSettings", true)
202
+ put("settingsTarget", "vpn")
203
+ put("engine", "vpn-dns")
195
204
  if (!granted) {
196
205
  put(
197
206
  "reason",
@@ -204,9 +213,11 @@ class WebsiteBlockerPlugin : Plugin() {
204
213
  private fun buildStatus(): JSObject {
205
214
  val saved = WebsiteBlockerStateStore.load(context)
206
215
  val permission = buildPermissionResult()
216
+ val active = saved != null
207
217
  return JSObject().apply {
218
+ put("status", if (active) "active" else "inactive")
208
219
  put("available", true)
209
- put("active", saved != null)
220
+ put("active", active)
210
221
  put("hostsFilePath", null)
211
222
  put(
212
223
  "endsAt",
@@ -227,6 +238,9 @@ class WebsiteBlockerPlugin : Plugin() {
227
238
  if (permissionRequiresConsent()) "vpn-consent" else null,
228
239
  )
229
240
  put("permissionStatus", permission.getString("status"))
241
+ put("canRequest", permission.getBool("canRequest"))
242
+ put("canOpenSettings", permission.getBool("canOpenSettings"))
243
+ put("settingsTarget", permission.opt("settingsTarget"))
230
244
  put("canRequestPermission", permission.getBool("canRequest"))
231
245
  put("canOpenSystemSettings", true)
232
246
  val reason = when {
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Adapter that exposes the Capacitor `ElizaWebsiteBlocker` plugin as the
3
+ * `NativeWebsiteBlockerBackend` the `@elizaos/plugin-blocker` engine dispatches
4
+ * to. Registering the result with `registerNativeWebsiteBlockerBackend` makes
5
+ * the engine drive the real native enforcement (Safari content blocker on iOS,
6
+ * split-tunnel VPN DNS on Android) instead of editing the system hosts file —
7
+ * which cannot work inside the mobile app sandbox.
8
+ *
9
+ * Process boundary: this adapter only reaches the native plugin when it runs in
10
+ * the same JS realm as Capacitor (the WebView / web build). It does not by
11
+ * itself bridge a separate agent process to the WebView; that path remains the
12
+ * HTTP route into the engine.
13
+ */
14
+ import type { WebsiteBlockerEngine, WebsiteBlockerPlugin } from "./definitions";
15
+ type SelfControlMatchMode = "exact" | "subdomain";
16
+ interface SelfControlStatus {
17
+ available: boolean;
18
+ active: boolean;
19
+ hostsFilePath: string | null;
20
+ startedAt: string | null;
21
+ endsAt: string | null;
22
+ websites: string[];
23
+ blockedWebsites: string[];
24
+ allowedWebsites: string[];
25
+ requestedWebsites: string[];
26
+ matchMode: SelfControlMatchMode;
27
+ managedBy: string | null;
28
+ metadata: Record<string, unknown> | null;
29
+ scheduledByAgentId: string | null;
30
+ canUnblockEarly: boolean;
31
+ requiresElevation: boolean;
32
+ engine: WebsiteBlockerEngine;
33
+ platform: string;
34
+ supportsElevationPrompt: boolean;
35
+ elevationPromptMethod: "osascript" | "pkexec" | "powershell-runas" | "vpn-consent" | "system-settings" | null;
36
+ reason?: string;
37
+ }
38
+ interface SelfControlPermissionState {
39
+ id: "website-blocking";
40
+ status: "granted" | "denied" | "not-determined" | "not-applicable";
41
+ lastChecked: number;
42
+ canRequest: boolean;
43
+ reason?: string;
44
+ hostsFilePath?: string | null;
45
+ supportsElevationPrompt?: boolean;
46
+ }
47
+ interface SelfControlBlockRequest {
48
+ websites: string[];
49
+ durationMinutes: number | null;
50
+ metadata?: Record<string, unknown> | null;
51
+ scheduledByAgentId?: string | null;
52
+ }
53
+ type StartBlockResult = {
54
+ success: true;
55
+ endsAt: string | null;
56
+ } | {
57
+ success: false;
58
+ error: string;
59
+ status?: SelfControlStatus;
60
+ };
61
+ type StopBlockResult = {
62
+ success: true;
63
+ removed: boolean;
64
+ status: SelfControlStatus;
65
+ } | {
66
+ success: false;
67
+ error: string;
68
+ status?: SelfControlStatus;
69
+ };
70
+ export interface NativeWebsiteBlockerBackend {
71
+ getStatus(): Promise<SelfControlStatus>;
72
+ startBlock(request: SelfControlBlockRequest): Promise<StartBlockResult>;
73
+ stopBlock(): Promise<StopBlockResult>;
74
+ getPermissionState(): Promise<SelfControlPermissionState>;
75
+ requestPermission(): Promise<SelfControlPermissionState>;
76
+ }
77
+ /**
78
+ * Wrap a `WebsiteBlockerPlugin` (pass the registered `WebsiteBlocker` Capacitor
79
+ * plugin) as a `NativeWebsiteBlockerBackend`.
80
+ */
81
+ export declare function createNativeWebsiteBlockerBackend(plugin: WebsiteBlockerPlugin): NativeWebsiteBlockerBackend;
82
+ export {};
83
+ //# sourceMappingURL=backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ function toSelfControlStatus(status) {
2
+ return {
3
+ available: status.available,
4
+ active: status.active,
5
+ hostsFilePath: status.hostsFilePath,
6
+ startedAt: null,
7
+ endsAt: status.endsAt,
8
+ websites: status.websites,
9
+ blockedWebsites: status.blockedWebsites,
10
+ allowedWebsites: status.allowedWebsites,
11
+ requestedWebsites: status.requestedWebsites,
12
+ matchMode: status.matchMode,
13
+ managedBy: null,
14
+ metadata: null,
15
+ scheduledByAgentId: null,
16
+ canUnblockEarly: status.canUnblockEarly,
17
+ requiresElevation: status.requiresElevation,
18
+ engine: status.engine,
19
+ platform: status.platform,
20
+ supportsElevationPrompt: status.supportsElevationPrompt,
21
+ elevationPromptMethod: toElevationMethod(status.elevationPromptMethod),
22
+ reason: status.reason,
23
+ };
24
+ }
25
+ function toElevationMethod(method) {
26
+ return method === "osascript" ||
27
+ method === "pkexec" ||
28
+ method === "powershell-runas" ||
29
+ method === "vpn-consent" ||
30
+ method === "system-settings"
31
+ ? method
32
+ : null;
33
+ }
34
+ function toSelfControlPermissionState(permission) {
35
+ return {
36
+ id: "website-blocking",
37
+ status: permission.status,
38
+ lastChecked: Date.now(),
39
+ canRequest: permission.canRequest,
40
+ reason: permission.reason,
41
+ supportsElevationPrompt: permission.canRequest,
42
+ };
43
+ }
44
+ /**
45
+ * Wrap a `WebsiteBlockerPlugin` (pass the registered `WebsiteBlocker` Capacitor
46
+ * plugin) as a `NativeWebsiteBlockerBackend`.
47
+ */
48
+ export function createNativeWebsiteBlockerBackend(plugin) {
49
+ return {
50
+ async getStatus() {
51
+ return toSelfControlStatus(await plugin.getStatus());
52
+ },
53
+ async startBlock(request) {
54
+ const options = {
55
+ websites: request.websites,
56
+ durationMinutes: request.durationMinutes,
57
+ };
58
+ const result = await plugin.startBlock(options);
59
+ if (result.success) {
60
+ return { success: true, endsAt: result.endsAt };
61
+ }
62
+ return { success: false, error: result.error };
63
+ },
64
+ async stopBlock() {
65
+ const result = await plugin.stopBlock();
66
+ const status = toSelfControlStatus(await plugin.getStatus());
67
+ if (result.success) {
68
+ return { success: true, removed: result.removed, status };
69
+ }
70
+ return { success: false, error: result.error, status };
71
+ },
72
+ async getPermissionState() {
73
+ return toSelfControlPermissionState(await plugin.checkPermissions());
74
+ },
75
+ async requestPermission() {
76
+ return toSelfControlPermissionState(await plugin.requestPermissions());
77
+ },
78
+ };
79
+ }
80
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=backend.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.test.d.ts","sourceRoot":"","sources":["../../src/backend.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,156 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { createNativeWebsiteBlockerBackend } from "./backend";
3
+ function makeStatus(overrides = {}) {
4
+ return {
5
+ status: "inactive",
6
+ available: true,
7
+ active: false,
8
+ hostsFilePath: null,
9
+ endsAt: null,
10
+ websites: [],
11
+ requestedWebsites: [],
12
+ blockedWebsites: [],
13
+ allowedWebsites: [],
14
+ matchMode: "exact",
15
+ canUnblockEarly: true,
16
+ requiresElevation: false,
17
+ engine: "content-blocker",
18
+ platform: "ios",
19
+ supportsElevationPrompt: false,
20
+ elevationPromptMethod: null,
21
+ ...overrides,
22
+ };
23
+ }
24
+ function makePlugin(overrides = {}) {
25
+ return {
26
+ getStatus: vi.fn(async () => makeStatus()),
27
+ startBlock: vi.fn(async () => ({
28
+ success: true,
29
+ endsAt: null,
30
+ request: { websites: ["x.com"], durationMinutes: null },
31
+ })),
32
+ stopBlock: vi.fn(async () => ({
33
+ success: true,
34
+ removed: true,
35
+ status: {
36
+ active: false,
37
+ endsAt: null,
38
+ websites: [],
39
+ canUnblockEarly: true,
40
+ requiresElevation: false,
41
+ },
42
+ })),
43
+ checkPermissions: vi.fn(async () => ({
44
+ status: "granted",
45
+ canRequest: false,
46
+ canOpenSettings: true,
47
+ settingsTarget: "contentBlocker",
48
+ engine: "content-blocker",
49
+ })),
50
+ requestPermissions: vi.fn(async () => ({
51
+ status: "granted",
52
+ canRequest: false,
53
+ canOpenSettings: true,
54
+ settingsTarget: "contentBlocker",
55
+ engine: "content-blocker",
56
+ })),
57
+ openSettings: vi.fn(async () => ({
58
+ opened: true,
59
+ target: "contentBlocker",
60
+ actualTarget: "contentBlocker",
61
+ reason: null,
62
+ })),
63
+ ...overrides,
64
+ };
65
+ }
66
+ describe("createNativeWebsiteBlockerBackend", () => {
67
+ it("maps engine startBlock onto the Capacitor plugin and returns the native engine result", async () => {
68
+ const startBlock = vi.fn(async () => ({
69
+ success: true,
70
+ endsAt: "2026-06-17T12:00:00.000Z",
71
+ request: { websites: ["x.com"], durationMinutes: 30 },
72
+ }));
73
+ const backend = createNativeWebsiteBlockerBackend(makePlugin({ startBlock }));
74
+ const result = await backend.startBlock({
75
+ websites: ["x.com", "reddit.com"],
76
+ durationMinutes: 30,
77
+ scheduledByAgentId: "agent-1",
78
+ });
79
+ expect(startBlock).toHaveBeenCalledWith({
80
+ websites: ["x.com", "reddit.com"],
81
+ durationMinutes: 30,
82
+ });
83
+ expect(result).toEqual({
84
+ success: true,
85
+ endsAt: "2026-06-17T12:00:00.000Z",
86
+ });
87
+ });
88
+ it("surfaces a native startBlock failure as an engine failure", async () => {
89
+ const startBlock = vi.fn(async () => ({
90
+ success: false,
91
+ error: "content blocker disabled in Settings",
92
+ }));
93
+ const backend = createNativeWebsiteBlockerBackend(makePlugin({ startBlock }));
94
+ const result = await backend.startBlock({
95
+ websites: ["x.com"],
96
+ durationMinutes: null,
97
+ });
98
+ expect(result).toEqual({
99
+ success: false,
100
+ error: "content blocker disabled in Settings",
101
+ });
102
+ });
103
+ it("maps getStatus into the engine SelfControlStatus shape, preserving the native engine", async () => {
104
+ const backend = createNativeWebsiteBlockerBackend(makePlugin({
105
+ getStatus: vi.fn(async () => makeStatus({
106
+ status: "active",
107
+ active: true,
108
+ websites: ["x.com"],
109
+ blockedWebsites: ["x.com", "www.x.com"],
110
+ endsAt: "2026-06-17T13:00:00.000Z",
111
+ engine: "vpn-dns",
112
+ platform: "android",
113
+ })),
114
+ }));
115
+ const status = await backend.getStatus();
116
+ expect(status.active).toBe(true);
117
+ expect(status.engine).toBe("vpn-dns");
118
+ expect(status.platform).toBe("android");
119
+ expect(status.blockedWebsites).toEqual(["x.com", "www.x.com"]);
120
+ expect(status.endsAt).toBe("2026-06-17T13:00:00.000Z");
121
+ });
122
+ it("stopBlock includes the refreshed status from a follow-up getStatus", async () => {
123
+ const getStatus = vi
124
+ .fn(async () => makeStatus({ active: false }))
125
+ .mockName("getStatus");
126
+ const stopBlock = vi.fn(async () => ({
127
+ success: true,
128
+ removed: true,
129
+ status: {
130
+ active: false,
131
+ endsAt: null,
132
+ websites: [],
133
+ canUnblockEarly: true,
134
+ requiresElevation: false,
135
+ },
136
+ }));
137
+ const backend = createNativeWebsiteBlockerBackend(makePlugin({ getStatus, stopBlock }));
138
+ const result = await backend.stopBlock();
139
+ expect(stopBlock).toHaveBeenCalledOnce();
140
+ expect(getStatus).toHaveBeenCalledOnce();
141
+ expect(result.success).toBe(true);
142
+ if (result.success) {
143
+ expect(result.removed).toBe(true);
144
+ expect(result.status.active).toBe(false);
145
+ }
146
+ });
147
+ it("maps permission checks into the engine permission-state shape", async () => {
148
+ const backend = createNativeWebsiteBlockerBackend(makePlugin());
149
+ const permission = await backend.getPermissionState();
150
+ expect(permission.id).toBe("website-blocking");
151
+ expect(permission.status).toBe("granted");
152
+ expect(permission.canRequest).toBe(false);
153
+ expect(typeof permission.lastChecked).toBe("number");
154
+ });
155
+ });
156
+ //# sourceMappingURL=backend.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.test.js","sourceRoot":"","sources":["../../src/backend.test.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,17 @@
1
1
  export type WebsiteBlockerPermissionStatus = "granted" | "denied" | "not-determined" | "not-applicable";
2
2
  export type WebsiteBlockerEngine = "hosts-file" | "vpn-dns" | "network-extension" | "content-blocker";
3
3
  export type WebsiteBlockerElevationMethod = "osascript" | "pkexec" | "powershell-runas" | "vpn-consent" | "system-settings" | null;
4
+ export type WebsiteBlockerSettingsTarget = "vpn" | "contentBlocker" | "systemSettings" | "runtime";
4
5
  export interface WebsiteBlockerPermissionResult {
5
6
  status: WebsiteBlockerPermissionStatus;
6
7
  canRequest: boolean;
8
+ canOpenSettings: boolean;
9
+ settingsTarget: WebsiteBlockerSettingsTarget | null;
10
+ engine: WebsiteBlockerEngine;
7
11
  reason?: string;
8
12
  }
9
13
  export interface WebsiteBlockerStatus {
14
+ status: "active" | "inactive" | "unavailable";
10
15
  available: boolean;
11
16
  active: boolean;
12
17
  hostsFilePath: string | null;
@@ -23,10 +28,19 @@ export interface WebsiteBlockerStatus {
23
28
  supportsElevationPrompt: boolean;
24
29
  elevationPromptMethod: WebsiteBlockerElevationMethod;
25
30
  permissionStatus?: WebsiteBlockerPermissionStatus;
31
+ canRequest?: boolean;
32
+ canOpenSettings?: boolean;
33
+ settingsTarget?: WebsiteBlockerSettingsTarget | null;
26
34
  canRequestPermission?: boolean;
27
35
  canOpenSystemSettings?: boolean;
28
36
  reason?: string;
29
37
  }
38
+ export interface WebsiteBlockerOpenSettingsResult {
39
+ opened: boolean;
40
+ target: WebsiteBlockerSettingsTarget;
41
+ actualTarget: WebsiteBlockerSettingsTarget;
42
+ reason: string | null;
43
+ }
30
44
  export interface StartWebsiteBlockOptions {
31
45
  websites?: string[] | string;
32
46
  durationMinutes?: number | string | null;
@@ -76,8 +90,6 @@ export interface WebsiteBlockerPlugin {
76
90
  stopBlock(): Promise<StopWebsiteBlockResult>;
77
91
  checkPermissions(): Promise<WebsiteBlockerPermissionResult>;
78
92
  requestPermissions(): Promise<WebsiteBlockerPermissionResult>;
79
- openSettings(): Promise<{
80
- opened: boolean;
81
- }>;
93
+ openSettings(): Promise<WebsiteBlockerOpenSettingsResult>;
82
94
  }
83
95
  //# sourceMappingURL=definitions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { WebsiteBlockerPlugin } from "./definitions";
2
2
  export * from "./definitions";
3
3
  export declare const WebsiteBlocker: WebsiteBlockerPlugin;
4
+ export { createNativeWebsiteBlockerBackend, type NativeWebsiteBlockerBackend, } from "./backend";
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAE1D,cAAc,eAAe,CAAC;AAK9B,eAAO,MAAM,cAAc,sBAK1B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAE1D,cAAc,eAAe,CAAC;AAK9B,eAAO,MAAM,cAAc,sBAK1B,CAAC;AAEF,OAAO,EACL,iCAAiC,EACjC,KAAK,2BAA2B,GACjC,MAAM,WAAW,CAAC"}
package/dist/esm/index.js CHANGED
@@ -4,4 +4,5 @@ const loadWeb = () => import("./web").then((module) => new module.WebsiteBlocker
4
4
  export const WebsiteBlocker = registerPlugin("ElizaWebsiteBlocker", {
5
5
  web: loadWeb,
6
6
  });
7
+ export { createNativeWebsiteBlockerBackend, } from "./backend";
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +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,CACnB,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAEnE,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAC1C,qBAAqB,EACrB;IACE,GAAG,EAAE,OAAO;CACb,CACF,CAAC"}
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,CACnB,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAEnE,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAC1C,qBAAqB,EACrB;IACE,GAAG,EAAE,OAAO;CACb,CACF,CAAC;AAEF,OAAO,EACL,iCAAiC,GAElC,MAAM,WAAW,CAAC"}
package/dist/esm/web.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { WebPlugin } from "@capacitor/core";
2
- import type { StartWebsiteBlockOptions, StartWebsiteBlockResult, StopWebsiteBlockResult, WebsiteBlockerPermissionResult, WebsiteBlockerStatus } from "./definitions";
2
+ import type { StartWebsiteBlockOptions, StartWebsiteBlockResult, StopWebsiteBlockResult, WebsiteBlockerOpenSettingsResult, WebsiteBlockerPermissionResult, WebsiteBlockerStatus } from "./definitions";
3
3
  export declare class WebsiteBlockerWeb extends WebPlugin {
4
4
  private apiBase;
5
5
  private apiToken;
@@ -11,8 +11,6 @@ export declare class WebsiteBlockerWeb extends WebPlugin {
11
11
  stopBlock(): Promise<StopWebsiteBlockResult>;
12
12
  checkPermissions(): Promise<WebsiteBlockerPermissionResult>;
13
13
  requestPermissions(): Promise<WebsiteBlockerPermissionResult>;
14
- openSettings(): Promise<{
15
- opened: boolean;
16
- }>;
14
+ openSettings(): Promise<WebsiteBlockerOpenSettingsResult>;
17
15
  }
18
16
  //# sourceMappingURL=web.d.ts.map