@elizaos/capacitor-websiteblocker 1.0.0 → 2.0.3-beta.2
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 +21 -0
- package/README.md +75 -0
- package/android/build.gradle +20 -3
- package/android/src/main/java/ai/eliza/plugins/websiteblocker/WebsiteBlockerPlugin.kt +15 -1
- package/dist/esm/backend.d.ts +83 -0
- package/dist/esm/backend.d.ts.map +1 -0
- package/dist/esm/backend.js +80 -0
- package/dist/esm/backend.js.map +1 -0
- package/dist/esm/backend.test.d.ts +2 -0
- package/dist/esm/backend.test.d.ts.map +1 -0
- package/dist/esm/backend.test.js +156 -0
- package/dist/esm/backend.test.js.map +1 -0
- package/dist/esm/definitions.d.ts +15 -3
- package/dist/esm/definitions.d.ts.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/web.d.ts +2 -4
- package/dist/esm/web.d.ts.map +1 -1
- package/dist/esm/web.js +73 -3
- package/dist/esm/web.js.map +1 -1
- package/dist/esm/web.test.d.ts +2 -0
- package/dist/esm/web.test.d.ts.map +1 -0
- package/dist/esm/web.test.js +92 -0
- package/dist/esm/web.test.js.map +1 -0
- package/dist/plugin.cjs.js +154 -3
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +154 -3
- package/dist/plugin.js.map +1 -1
- package/ios/Sources/WebsiteBlockerPlugin/WebsiteBlockerPlugin.swift +25 -3
- package/package.json +15 -9
package/dist/esm/web.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EACV,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,EACtB,8BAA8B,EAC9B,oBAAoB,EACrB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EACV,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,EACtB,gCAAgC,EAChC,8BAA8B,EAC9B,oBAAoB,EACrB,MAAM,eAAe,CAAC;AAmEvB,qBAAa,iBAAkB,SAAQ,SAAS;IAC9C,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,QAAQ;IAehB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,WAAW;YAeL,WAAW;IAqBnB,SAAS,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAI1C,UAAU,CACd,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,uBAAuB,CAAC;IAW7B,SAAS,IAAI,OAAO,CAAC,sBAAsB,CAAC;IAS5C,gBAAgB,IAAI,OAAO,CAAC,8BAA8B,CAAC;IAmB3D,kBAAkB,IAAI,OAAO,CAAC,8BAA8B,CAAC;IAqB7D,YAAY,IAAI,OAAO,CAAC,gCAAgC,CAAC;CAqBhE"}
|
package/dist/esm/web.js
CHANGED
|
@@ -1,4 +1,56 @@
|
|
|
1
1
|
import { WebPlugin } from "@capacitor/core";
|
|
2
|
+
const HOSTNAME_RE = /^(?=.{1,253}$)(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z]{2,63}$/;
|
|
3
|
+
function isString(value) {
|
|
4
|
+
return typeof value === "string";
|
|
5
|
+
}
|
|
6
|
+
function normalizeHostname(value) {
|
|
7
|
+
if (typeof value !== "string")
|
|
8
|
+
return null;
|
|
9
|
+
const trimmed = value.trim();
|
|
10
|
+
if (!trimmed)
|
|
11
|
+
return null;
|
|
12
|
+
if (/^[a-z][a-z0-9+.-]*:/i.test(trimmed)) {
|
|
13
|
+
if (!/^https?:\/\//i.test(trimmed))
|
|
14
|
+
return null;
|
|
15
|
+
try {
|
|
16
|
+
return normalizeHostname(new URL(trimmed).hostname);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const withoutWildcard = trimmed.replace(/^\*\./, "");
|
|
23
|
+
const withoutTrailingDot = withoutWildcard.replace(/\.$/, "");
|
|
24
|
+
const ascii = withoutTrailingDot.toLowerCase();
|
|
25
|
+
return HOSTNAME_RE.test(ascii) ? ascii : null;
|
|
26
|
+
}
|
|
27
|
+
function validateStartBlockOptions(options) {
|
|
28
|
+
const candidates = [
|
|
29
|
+
...(Array.isArray(options?.websites) ? options.websites : []),
|
|
30
|
+
...(typeof options?.websites === "string" ? [options.websites] : []),
|
|
31
|
+
];
|
|
32
|
+
if (typeof options?.text === "string") {
|
|
33
|
+
candidates.push(...options.text.split(/[\s,]+/));
|
|
34
|
+
}
|
|
35
|
+
const websites = [
|
|
36
|
+
...new Set(candidates.map(normalizeHostname).filter(isString)),
|
|
37
|
+
];
|
|
38
|
+
if (websites.length === 0) {
|
|
39
|
+
throw new Error("Provide at least one public website hostname.");
|
|
40
|
+
}
|
|
41
|
+
let durationMinutes = null;
|
|
42
|
+
if (options?.durationMinutes !== undefined &&
|
|
43
|
+
options.durationMinutes !== null) {
|
|
44
|
+
const parsed = typeof options.durationMinutes === "number"
|
|
45
|
+
? options.durationMinutes
|
|
46
|
+
: Number(options.durationMinutes);
|
|
47
|
+
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
48
|
+
throw new Error("durationMinutes must be a positive finite number");
|
|
49
|
+
}
|
|
50
|
+
durationMinutes = Math.trunc(parsed);
|
|
51
|
+
}
|
|
52
|
+
return { websites, durationMinutes };
|
|
53
|
+
}
|
|
2
54
|
export class WebsiteBlockerWeb extends WebPlugin {
|
|
3
55
|
apiBase() {
|
|
4
56
|
const global = typeof window !== "undefined"
|
|
@@ -60,9 +112,10 @@ export class WebsiteBlockerWeb extends WebPlugin {
|
|
|
60
112
|
return await this.requestJson("/api/website-blocker");
|
|
61
113
|
}
|
|
62
114
|
async startBlock(options) {
|
|
115
|
+
const body = validateStartBlockOptions(options);
|
|
63
116
|
return await this.requestJson("/api/website-blocker", {
|
|
64
117
|
method: "PUT",
|
|
65
|
-
body: JSON.stringify(
|
|
118
|
+
body: JSON.stringify(body),
|
|
66
119
|
});
|
|
67
120
|
}
|
|
68
121
|
async stopBlock() {
|
|
@@ -75,6 +128,9 @@ export class WebsiteBlockerWeb extends WebPlugin {
|
|
|
75
128
|
return {
|
|
76
129
|
status: permission.status,
|
|
77
130
|
canRequest: permission.canRequest,
|
|
131
|
+
canOpenSettings: permission.canOpenSettings ?? true,
|
|
132
|
+
settingsTarget: permission.settingsTarget ?? "runtime",
|
|
133
|
+
engine: permission.engine ?? "hosts-file",
|
|
78
134
|
reason: permission.reason,
|
|
79
135
|
};
|
|
80
136
|
}
|
|
@@ -85,16 +141,30 @@ export class WebsiteBlockerWeb extends WebPlugin {
|
|
|
85
141
|
return {
|
|
86
142
|
status: permission.status,
|
|
87
143
|
canRequest: permission.canRequest,
|
|
144
|
+
canOpenSettings: permission.canOpenSettings ?? true,
|
|
145
|
+
settingsTarget: permission.settingsTarget ?? "runtime",
|
|
146
|
+
engine: permission.engine ?? "hosts-file",
|
|
88
147
|
reason: permission.reason,
|
|
89
148
|
};
|
|
90
149
|
}
|
|
91
150
|
async openSettings() {
|
|
92
151
|
if (!this.canReachApi()) {
|
|
93
|
-
return {
|
|
152
|
+
return {
|
|
153
|
+
opened: false,
|
|
154
|
+
target: "runtime",
|
|
155
|
+
actualTarget: "runtime",
|
|
156
|
+
reason: "Eliza API not available.",
|
|
157
|
+
};
|
|
94
158
|
}
|
|
95
|
-
|
|
159
|
+
const result = await this.requestJson("/api/permissions/website-blocking/open-settings", {
|
|
96
160
|
method: "POST",
|
|
97
161
|
});
|
|
162
|
+
return {
|
|
163
|
+
opened: result.opened ?? false,
|
|
164
|
+
target: result.target ?? "runtime",
|
|
165
|
+
actualTarget: result.actualTarget ?? result.target ?? "runtime",
|
|
166
|
+
reason: result.reason ?? null,
|
|
167
|
+
};
|
|
98
168
|
}
|
|
99
169
|
}
|
|
100
170
|
//# sourceMappingURL=web.js.map
|
package/dist/esm/web.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.test.d.ts","sourceRoot":"","sources":["../../src/web.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { WebsiteBlockerWeb } from "./web";
|
|
3
|
+
function setWindow(overrides = {}) {
|
|
4
|
+
Object.defineProperty(globalThis, "window", {
|
|
5
|
+
configurable: true,
|
|
6
|
+
value: {
|
|
7
|
+
location: { protocol: "https:" },
|
|
8
|
+
sessionStorage: {
|
|
9
|
+
getItem: vi.fn(() => "stored-token"),
|
|
10
|
+
},
|
|
11
|
+
...overrides,
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
describe("WebsiteBlockerWeb fallback", () => {
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
vi.restoreAllMocks();
|
|
18
|
+
vi.unstubAllGlobals();
|
|
19
|
+
});
|
|
20
|
+
it("normalizes valid website inputs before sending them to the runtime API", async () => {
|
|
21
|
+
setWindow({
|
|
22
|
+
__ELIZA_API_BASE__: "https://agent.example",
|
|
23
|
+
});
|
|
24
|
+
const fetchMock = vi.fn(async () => ({
|
|
25
|
+
ok: true,
|
|
26
|
+
json: async () => ({
|
|
27
|
+
success: true,
|
|
28
|
+
endsAt: null,
|
|
29
|
+
request: { websites: ["example.com"], durationMinutes: 30 },
|
|
30
|
+
}),
|
|
31
|
+
}));
|
|
32
|
+
vi.stubGlobal("fetch", fetchMock);
|
|
33
|
+
await new WebsiteBlockerWeb().startBlock({
|
|
34
|
+
websites: ["HTTPS://Example.COM/path", "*.news.example.org."],
|
|
35
|
+
text: "example.com javascript:alert(1)",
|
|
36
|
+
durationMinutes: "30.8",
|
|
37
|
+
});
|
|
38
|
+
expect(fetchMock).toHaveBeenCalledWith("https://agent.example/api/website-blocker", expect.objectContaining({
|
|
39
|
+
method: "PUT",
|
|
40
|
+
body: JSON.stringify({
|
|
41
|
+
websites: ["example.com", "news.example.org"],
|
|
42
|
+
durationMinutes: 30,
|
|
43
|
+
}),
|
|
44
|
+
}));
|
|
45
|
+
});
|
|
46
|
+
it.each([
|
|
47
|
+
{},
|
|
48
|
+
{ websites: [] },
|
|
49
|
+
{ websites: ["javascript:alert(1)"] },
|
|
50
|
+
{ websites: ["localhost"] },
|
|
51
|
+
{ websites: ["../etc/passwd"] },
|
|
52
|
+
{ websites: [{ host: "example.com" }] },
|
|
53
|
+
])("rejects malformed website inputs %# before fetch", async (options) => {
|
|
54
|
+
setWindow();
|
|
55
|
+
const fetchMock = vi.fn();
|
|
56
|
+
vi.stubGlobal("fetch", fetchMock);
|
|
57
|
+
await expect(new WebsiteBlockerWeb().startBlock(options)).rejects.toThrow("Provide at least one public website hostname.");
|
|
58
|
+
expect(fetchMock).not.toHaveBeenCalled();
|
|
59
|
+
});
|
|
60
|
+
it.each([
|
|
61
|
+
0,
|
|
62
|
+
-1,
|
|
63
|
+
Number.POSITIVE_INFINITY,
|
|
64
|
+
Number.NaN,
|
|
65
|
+
"nope",
|
|
66
|
+
])("rejects malformed duration %s before fetch", async (durationMinutes) => {
|
|
67
|
+
setWindow();
|
|
68
|
+
const fetchMock = vi.fn();
|
|
69
|
+
vi.stubGlobal("fetch", fetchMock);
|
|
70
|
+
await expect(new WebsiteBlockerWeb().startBlock({
|
|
71
|
+
websites: ["example.com"],
|
|
72
|
+
durationMinutes,
|
|
73
|
+
})).rejects.toThrow("durationMinutes must be a positive finite number");
|
|
74
|
+
expect(fetchMock).not.toHaveBeenCalled();
|
|
75
|
+
});
|
|
76
|
+
it("returns an unavailable open-settings result when the runtime API is unreachable", async () => {
|
|
77
|
+
Object.defineProperty(globalThis, "window", {
|
|
78
|
+
configurable: true,
|
|
79
|
+
value: {
|
|
80
|
+
location: { protocol: "file:" },
|
|
81
|
+
sessionStorage: { getItem: vi.fn() },
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
await expect(new WebsiteBlockerWeb().openSettings()).resolves.toEqual({
|
|
85
|
+
opened: false,
|
|
86
|
+
target: "runtime",
|
|
87
|
+
actualTarget: "runtime",
|
|
88
|
+
reason: "Eliza API not available.",
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
//# sourceMappingURL=web.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.test.js","sourceRoot":"","sources":["../../src/web.test.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin.cjs.js
CHANGED
|
@@ -2,11 +2,143 @@
|
|
|
2
2
|
|
|
3
3
|
var core = require('@capacitor/core');
|
|
4
4
|
|
|
5
|
+
function toSelfControlStatus(status) {
|
|
6
|
+
return {
|
|
7
|
+
available: status.available,
|
|
8
|
+
active: status.active,
|
|
9
|
+
hostsFilePath: status.hostsFilePath,
|
|
10
|
+
startedAt: null,
|
|
11
|
+
endsAt: status.endsAt,
|
|
12
|
+
websites: status.websites,
|
|
13
|
+
blockedWebsites: status.blockedWebsites,
|
|
14
|
+
allowedWebsites: status.allowedWebsites,
|
|
15
|
+
requestedWebsites: status.requestedWebsites,
|
|
16
|
+
matchMode: status.matchMode,
|
|
17
|
+
managedBy: null,
|
|
18
|
+
metadata: null,
|
|
19
|
+
scheduledByAgentId: null,
|
|
20
|
+
canUnblockEarly: status.canUnblockEarly,
|
|
21
|
+
requiresElevation: status.requiresElevation,
|
|
22
|
+
engine: status.engine,
|
|
23
|
+
platform: status.platform,
|
|
24
|
+
supportsElevationPrompt: status.supportsElevationPrompt,
|
|
25
|
+
elevationPromptMethod: toElevationMethod(status.elevationPromptMethod),
|
|
26
|
+
reason: status.reason,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function toElevationMethod(method) {
|
|
30
|
+
return method === "osascript" ||
|
|
31
|
+
method === "pkexec" ||
|
|
32
|
+
method === "powershell-runas" ||
|
|
33
|
+
method === "vpn-consent" ||
|
|
34
|
+
method === "system-settings"
|
|
35
|
+
? method
|
|
36
|
+
: null;
|
|
37
|
+
}
|
|
38
|
+
function toSelfControlPermissionState(permission) {
|
|
39
|
+
return {
|
|
40
|
+
id: "website-blocking",
|
|
41
|
+
status: permission.status,
|
|
42
|
+
lastChecked: Date.now(),
|
|
43
|
+
canRequest: permission.canRequest,
|
|
44
|
+
reason: permission.reason,
|
|
45
|
+
supportsElevationPrompt: permission.canRequest,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Wrap a `WebsiteBlockerPlugin` (pass the registered `WebsiteBlocker` Capacitor
|
|
50
|
+
* plugin) as a `NativeWebsiteBlockerBackend`.
|
|
51
|
+
*/
|
|
52
|
+
function createNativeWebsiteBlockerBackend(plugin) {
|
|
53
|
+
return {
|
|
54
|
+
async getStatus() {
|
|
55
|
+
return toSelfControlStatus(await plugin.getStatus());
|
|
56
|
+
},
|
|
57
|
+
async startBlock(request) {
|
|
58
|
+
const options = {
|
|
59
|
+
websites: request.websites,
|
|
60
|
+
durationMinutes: request.durationMinutes,
|
|
61
|
+
};
|
|
62
|
+
const result = await plugin.startBlock(options);
|
|
63
|
+
if (result.success) {
|
|
64
|
+
return { success: true, endsAt: result.endsAt };
|
|
65
|
+
}
|
|
66
|
+
return { success: false, error: result.error };
|
|
67
|
+
},
|
|
68
|
+
async stopBlock() {
|
|
69
|
+
const result = await plugin.stopBlock();
|
|
70
|
+
const status = toSelfControlStatus(await plugin.getStatus());
|
|
71
|
+
if (result.success) {
|
|
72
|
+
return { success: true, removed: result.removed, status };
|
|
73
|
+
}
|
|
74
|
+
return { success: false, error: result.error, status };
|
|
75
|
+
},
|
|
76
|
+
async getPermissionState() {
|
|
77
|
+
return toSelfControlPermissionState(await plugin.checkPermissions());
|
|
78
|
+
},
|
|
79
|
+
async requestPermission() {
|
|
80
|
+
return toSelfControlPermissionState(await plugin.requestPermissions());
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
5
85
|
const loadWeb = () => Promise.resolve().then(function () { return web; }).then((module) => new module.WebsiteBlockerWeb());
|
|
6
86
|
const WebsiteBlocker = core.registerPlugin("ElizaWebsiteBlocker", {
|
|
7
87
|
web: loadWeb,
|
|
8
88
|
});
|
|
9
89
|
|
|
90
|
+
const HOSTNAME_RE = /^(?=.{1,253}$)(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z]{2,63}$/;
|
|
91
|
+
function isString(value) {
|
|
92
|
+
return typeof value === "string";
|
|
93
|
+
}
|
|
94
|
+
function normalizeHostname(value) {
|
|
95
|
+
if (typeof value !== "string")
|
|
96
|
+
return null;
|
|
97
|
+
const trimmed = value.trim();
|
|
98
|
+
if (!trimmed)
|
|
99
|
+
return null;
|
|
100
|
+
if (/^[a-z][a-z0-9+.-]*:/i.test(trimmed)) {
|
|
101
|
+
if (!/^https?:\/\//i.test(trimmed))
|
|
102
|
+
return null;
|
|
103
|
+
try {
|
|
104
|
+
return normalizeHostname(new URL(trimmed).hostname);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const withoutWildcard = trimmed.replace(/^\*\./, "");
|
|
111
|
+
const withoutTrailingDot = withoutWildcard.replace(/\.$/, "");
|
|
112
|
+
const ascii = withoutTrailingDot.toLowerCase();
|
|
113
|
+
return HOSTNAME_RE.test(ascii) ? ascii : null;
|
|
114
|
+
}
|
|
115
|
+
function validateStartBlockOptions(options) {
|
|
116
|
+
const candidates = [
|
|
117
|
+
...(Array.isArray(options?.websites) ? options.websites : []),
|
|
118
|
+
...(typeof options?.websites === "string" ? [options.websites] : []),
|
|
119
|
+
];
|
|
120
|
+
if (typeof options?.text === "string") {
|
|
121
|
+
candidates.push(...options.text.split(/[\s,]+/));
|
|
122
|
+
}
|
|
123
|
+
const websites = [
|
|
124
|
+
...new Set(candidates.map(normalizeHostname).filter(isString)),
|
|
125
|
+
];
|
|
126
|
+
if (websites.length === 0) {
|
|
127
|
+
throw new Error("Provide at least one public website hostname.");
|
|
128
|
+
}
|
|
129
|
+
let durationMinutes = null;
|
|
130
|
+
if (options?.durationMinutes !== undefined &&
|
|
131
|
+
options.durationMinutes !== null) {
|
|
132
|
+
const parsed = typeof options.durationMinutes === "number"
|
|
133
|
+
? options.durationMinutes
|
|
134
|
+
: Number(options.durationMinutes);
|
|
135
|
+
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
136
|
+
throw new Error("durationMinutes must be a positive finite number");
|
|
137
|
+
}
|
|
138
|
+
durationMinutes = Math.trunc(parsed);
|
|
139
|
+
}
|
|
140
|
+
return { websites, durationMinutes };
|
|
141
|
+
}
|
|
10
142
|
class WebsiteBlockerWeb extends core.WebPlugin {
|
|
11
143
|
apiBase() {
|
|
12
144
|
const global = typeof window !== "undefined"
|
|
@@ -68,9 +200,10 @@ class WebsiteBlockerWeb extends core.WebPlugin {
|
|
|
68
200
|
return await this.requestJson("/api/website-blocker");
|
|
69
201
|
}
|
|
70
202
|
async startBlock(options) {
|
|
203
|
+
const body = validateStartBlockOptions(options);
|
|
71
204
|
return await this.requestJson("/api/website-blocker", {
|
|
72
205
|
method: "PUT",
|
|
73
|
-
body: JSON.stringify(
|
|
206
|
+
body: JSON.stringify(body),
|
|
74
207
|
});
|
|
75
208
|
}
|
|
76
209
|
async stopBlock() {
|
|
@@ -83,6 +216,9 @@ class WebsiteBlockerWeb extends core.WebPlugin {
|
|
|
83
216
|
return {
|
|
84
217
|
status: permission.status,
|
|
85
218
|
canRequest: permission.canRequest,
|
|
219
|
+
canOpenSettings: permission.canOpenSettings ?? true,
|
|
220
|
+
settingsTarget: permission.settingsTarget ?? "runtime",
|
|
221
|
+
engine: permission.engine ?? "hosts-file",
|
|
86
222
|
reason: permission.reason,
|
|
87
223
|
};
|
|
88
224
|
}
|
|
@@ -93,16 +229,30 @@ class WebsiteBlockerWeb extends core.WebPlugin {
|
|
|
93
229
|
return {
|
|
94
230
|
status: permission.status,
|
|
95
231
|
canRequest: permission.canRequest,
|
|
232
|
+
canOpenSettings: permission.canOpenSettings ?? true,
|
|
233
|
+
settingsTarget: permission.settingsTarget ?? "runtime",
|
|
234
|
+
engine: permission.engine ?? "hosts-file",
|
|
96
235
|
reason: permission.reason,
|
|
97
236
|
};
|
|
98
237
|
}
|
|
99
238
|
async openSettings() {
|
|
100
239
|
if (!this.canReachApi()) {
|
|
101
|
-
return {
|
|
240
|
+
return {
|
|
241
|
+
opened: false,
|
|
242
|
+
target: "runtime",
|
|
243
|
+
actualTarget: "runtime",
|
|
244
|
+
reason: "Eliza API not available.",
|
|
245
|
+
};
|
|
102
246
|
}
|
|
103
|
-
|
|
247
|
+
const result = await this.requestJson("/api/permissions/website-blocking/open-settings", {
|
|
104
248
|
method: "POST",
|
|
105
249
|
});
|
|
250
|
+
return {
|
|
251
|
+
opened: result.opened ?? false,
|
|
252
|
+
target: result.target ?? "runtime",
|
|
253
|
+
actualTarget: result.actualTarget ?? result.target ?? "runtime",
|
|
254
|
+
reason: result.reason ?? null,
|
|
255
|
+
};
|
|
106
256
|
}
|
|
107
257
|
}
|
|
108
258
|
|
|
@@ -112,4 +262,5 @@ var web = /*#__PURE__*/Object.freeze({
|
|
|
112
262
|
});
|
|
113
263
|
|
|
114
264
|
exports.WebsiteBlocker = WebsiteBlocker;
|
|
265
|
+
exports.createNativeWebsiteBlockerBackend = createNativeWebsiteBlockerBackend;
|
|
115
266
|
//# sourceMappingURL=plugin.cjs.js.map
|
package/dist/plugin.cjs.js.map
CHANGED
|
@@ -1 +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((module) => new module.WebsiteBlockerWeb());\nexport const WebsiteBlocker = registerPlugin(\"ElizaWebsiteBlocker\", {\n web: loadWeb,\n});\n//# sourceMappingURL=index.js.map","import { WebPlugin } from \"@capacitor/core\";\nexport class WebsiteBlockerWeb extends WebPlugin {\n apiBase() {\n const global = typeof window !== \"undefined\"\n ? window.__ELIZA_API_BASE__\n : undefined;\n if (typeof global === \"string\" && global.trim().length > 0) {\n return global;\n }\n return \"\";\n }\n apiToken() {\n const global = typeof window !== \"undefined\"\n ? window.__ELIZA_API_TOKEN__\n : undefined;\n if (typeof global === \"string\" && global.trim().length > 0) {\n return global.trim();\n }\n if (typeof window === \"undefined\") {\n return null;\n }\n const stored = window.sessionStorage.getItem(\"eliza_api_token\");\n return stored?.trim() ? stored.trim() : null;\n }\n authHeaders() {\n const token = this.apiToken();\n return token ? { Authorization: `Bearer ${token}` } : {};\n }\n canReachApi() {\n const global = typeof window !== \"undefined\"\n ? window.__ELIZA_API_BASE__\n : undefined;\n if (typeof global === \"string\" && global.trim().length > 0) {\n return true;\n }\n if (typeof window === \"undefined\") {\n return false;\n }\n const protocol = window.location.protocol;\n return protocol === \"http:\" || protocol === \"https:\";\n }\n async requestJson(pathname, init) {\n if (!this.canReachApi()) {\n throw new Error(\"Eliza API not available\");\n }\n const response = await fetch(`${this.apiBase()}${pathname}`, {\n ...init,\n headers: {\n ...(init?.body ? { \"Content-Type\": \"application/json\" } : {}),\n ...this.authHeaders(),\n ...(init?.headers ?? {}),\n },\n });\n if (!response.ok) {\n throw new Error(`Request failed (${response.status})`);\n }\n return (await response.json());\n }\n async getStatus() {\n return await this.requestJson(\"/api/website-blocker\");\n }\n async startBlock(options) {\n return await this.requestJson(\"/api/website-blocker\", {\n method: \"PUT\",\n body: JSON.stringify(options),\n });\n }\n async stopBlock() {\n return await this.requestJson(\"/api/website-blocker\", {\n method: \"DELETE\",\n });\n }\n async checkPermissions() {\n const permission = await this.requestJson(\"/api/permissions/website-blocking\");\n return {\n status: permission.status,\n canRequest: permission.canRequest,\n reason: permission.reason,\n };\n }\n async requestPermissions() {\n const permission = await this.requestJson(\"/api/permissions/website-blocking/request\", {\n method: \"POST\",\n });\n return {\n status: permission.status,\n canRequest: permission.canRequest,\n reason: permission.reason,\n };\n }\n async openSettings() {\n if (!this.canReachApi()) {\n return { opened: false };\n }\n return await this.requestJson(\"/api/permissions/website-blocking/open-settings\", {\n method: \"POST\",\n });\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":";;;;AAEA,MAAM,OAAO,GAAG,MAAM,mDAAe,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;AAC1E,MAAC,cAAc,GAAGA,mBAAc,CAAC,qBAAqB,EAAE;AACpE,IAAI,GAAG,EAAE,OAAO;AAChB,CAAC;;ACJM,MAAM,iBAAiB,SAASC,cAAS,CAAC;AACjD,IAAI,OAAO,GAAG;AACd,QAAQ,MAAM,MAAM,GAAG,OAAO,MAAM,KAAK;AACzC,cAAc,MAAM,CAAC;AACrB,cAAc,SAAS;AACvB,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AACpE,YAAY,OAAO,MAAM;AACzB,QAAQ;AACR,QAAQ,OAAO,EAAE;AACjB,IAAI;AACJ,IAAI,QAAQ,GAAG;AACf,QAAQ,MAAM,MAAM,GAAG,OAAO,MAAM,KAAK;AACzC,cAAc,MAAM,CAAC;AACrB,cAAc,SAAS;AACvB,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AACpE,YAAY,OAAO,MAAM,CAAC,IAAI,EAAE;AAChC,QAAQ;AACR,QAAQ,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AAC3C,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR,QAAQ,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,iBAAiB,CAAC;AACvE,QAAQ,OAAO,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI;AACpD,IAAI;AACJ,IAAI,WAAW,GAAG;AAClB,QAAQ,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;AACrC,QAAQ,OAAO,KAAK,GAAG,EAAE,aAAa,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE;AAChE,IAAI;AACJ,IAAI,WAAW,GAAG;AAClB,QAAQ,MAAM,MAAM,GAAG,OAAO,MAAM,KAAK;AACzC,cAAc,MAAM,CAAC;AACrB,cAAc,SAAS;AACvB,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AACpE,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR,QAAQ,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AAC3C,YAAY,OAAO,KAAK;AACxB,QAAQ;AACR,QAAQ,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ;AACjD,QAAQ,OAAO,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,QAAQ;AAC5D,IAAI;AACJ,IAAI,MAAM,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE;AACtC,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;AACjC,YAAY,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;AACtD,QAAQ;AACR,QAAQ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE;AACrE,YAAY,GAAG,IAAI;AACnB,YAAY,OAAO,EAAE;AACrB,gBAAgB,IAAI,IAAI,EAAE,IAAI,GAAG,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,EAAE,CAAC;AAC7E,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE;AACrC,gBAAgB,IAAI,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;AACxC,aAAa;AACb,SAAS,CAAC;AACV,QAAQ,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AAC1B,YAAY,MAAM,IAAI,KAAK,CAAC,CAAC,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAClE,QAAQ;AACR,QAAQ,QAAQ,MAAM,QAAQ,CAAC,IAAI,EAAE;AACrC,IAAI;AACJ,IAAI,MAAM,SAAS,GAAG;AACtB,QAAQ,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAAC;AAC7D,IAAI;AACJ,IAAI,MAAM,UAAU,CAAC,OAAO,EAAE;AAC9B,QAAQ,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,sBAAsB,EAAE;AAC9D,YAAY,MAAM,EAAE,KAAK;AACzB,YAAY,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;AACzC,SAAS,CAAC;AACV,IAAI;AACJ,IAAI,MAAM,SAAS,GAAG;AACtB,QAAQ,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,sBAAsB,EAAE;AAC9D,YAAY,MAAM,EAAE,QAAQ;AAC5B,SAAS,CAAC;AACV,IAAI;AACJ,IAAI,MAAM,gBAAgB,GAAG;AAC7B,QAAQ,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,mCAAmC,CAAC;AACtF,QAAQ,OAAO;AACf,YAAY,MAAM,EAAE,UAAU,CAAC,MAAM;AACrC,YAAY,UAAU,EAAE,UAAU,CAAC,UAAU;AAC7C,YAAY,MAAM,EAAE,UAAU,CAAC,MAAM;AACrC,SAAS;AACT,IAAI;AACJ,IAAI,MAAM,kBAAkB,GAAG;AAC/B,QAAQ,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,2CAA2C,EAAE;AAC/F,YAAY,MAAM,EAAE,MAAM;AAC1B,SAAS,CAAC;AACV,QAAQ,OAAO;AACf,YAAY,MAAM,EAAE,UAAU,CAAC,MAAM;AACrC,YAAY,UAAU,EAAE,UAAU,CAAC,UAAU;AAC7C,YAAY,MAAM,EAAE,UAAU,CAAC,MAAM;AACrC,SAAS;AACT,IAAI;AACJ,IAAI,MAAM,YAAY,GAAG;AACzB,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;AACjC,YAAY,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;AACpC,QAAQ;AACR,QAAQ,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,iDAAiD,EAAE;AACzF,YAAY,MAAM,EAAE,MAAM;AAC1B,SAAS,CAAC;AACV,IAAI;AACJ;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"plugin.cjs.js","sources":["esm/backend.js","esm/index.js","esm/web.js"],"sourcesContent":["function toSelfControlStatus(status) {\n return {\n available: status.available,\n active: status.active,\n hostsFilePath: status.hostsFilePath,\n startedAt: null,\n endsAt: status.endsAt,\n websites: status.websites,\n blockedWebsites: status.blockedWebsites,\n allowedWebsites: status.allowedWebsites,\n requestedWebsites: status.requestedWebsites,\n matchMode: status.matchMode,\n managedBy: null,\n metadata: null,\n scheduledByAgentId: null,\n canUnblockEarly: status.canUnblockEarly,\n requiresElevation: status.requiresElevation,\n engine: status.engine,\n platform: status.platform,\n supportsElevationPrompt: status.supportsElevationPrompt,\n elevationPromptMethod: toElevationMethod(status.elevationPromptMethod),\n reason: status.reason,\n };\n}\nfunction toElevationMethod(method) {\n return method === \"osascript\" ||\n method === \"pkexec\" ||\n method === \"powershell-runas\" ||\n method === \"vpn-consent\" ||\n method === \"system-settings\"\n ? method\n : null;\n}\nfunction toSelfControlPermissionState(permission) {\n return {\n id: \"website-blocking\",\n status: permission.status,\n lastChecked: Date.now(),\n canRequest: permission.canRequest,\n reason: permission.reason,\n supportsElevationPrompt: permission.canRequest,\n };\n}\n/**\n * Wrap a `WebsiteBlockerPlugin` (pass the registered `WebsiteBlocker` Capacitor\n * plugin) as a `NativeWebsiteBlockerBackend`.\n */\nexport function createNativeWebsiteBlockerBackend(plugin) {\n return {\n async getStatus() {\n return toSelfControlStatus(await plugin.getStatus());\n },\n async startBlock(request) {\n const options = {\n websites: request.websites,\n durationMinutes: request.durationMinutes,\n };\n const result = await plugin.startBlock(options);\n if (result.success) {\n return { success: true, endsAt: result.endsAt };\n }\n return { success: false, error: result.error };\n },\n async stopBlock() {\n const result = await plugin.stopBlock();\n const status = toSelfControlStatus(await plugin.getStatus());\n if (result.success) {\n return { success: true, removed: result.removed, status };\n }\n return { success: false, error: result.error, status };\n },\n async getPermissionState() {\n return toSelfControlPermissionState(await plugin.checkPermissions());\n },\n async requestPermission() {\n return toSelfControlPermissionState(await plugin.requestPermissions());\n },\n };\n}\n//# sourceMappingURL=backend.js.map","import { registerPlugin } from \"@capacitor/core\";\nexport * from \"./definitions\";\nconst loadWeb = () => import(\"./web\").then((module) => new module.WebsiteBlockerWeb());\nexport const WebsiteBlocker = registerPlugin(\"ElizaWebsiteBlocker\", {\n web: loadWeb,\n});\nexport { createNativeWebsiteBlockerBackend, } from \"./backend\";\n//# sourceMappingURL=index.js.map","import { WebPlugin } from \"@capacitor/core\";\nconst HOSTNAME_RE = /^(?=.{1,253}$)(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\\.)+[A-Za-z]{2,63}$/;\nfunction isString(value) {\n return typeof value === \"string\";\n}\nfunction normalizeHostname(value) {\n if (typeof value !== \"string\")\n return null;\n const trimmed = value.trim();\n if (!trimmed)\n return null;\n if (/^[a-z][a-z0-9+.-]*:/i.test(trimmed)) {\n if (!/^https?:\\/\\//i.test(trimmed))\n return null;\n try {\n return normalizeHostname(new URL(trimmed).hostname);\n }\n catch {\n return null;\n }\n }\n const withoutWildcard = trimmed.replace(/^\\*\\./, \"\");\n const withoutTrailingDot = withoutWildcard.replace(/\\.$/, \"\");\n const ascii = withoutTrailingDot.toLowerCase();\n return HOSTNAME_RE.test(ascii) ? ascii : null;\n}\nfunction validateStartBlockOptions(options) {\n const candidates = [\n ...(Array.isArray(options?.websites) ? options.websites : []),\n ...(typeof options?.websites === \"string\" ? [options.websites] : []),\n ];\n if (typeof options?.text === \"string\") {\n candidates.push(...options.text.split(/[\\s,]+/));\n }\n const websites = [\n ...new Set(candidates.map(normalizeHostname).filter(isString)),\n ];\n if (websites.length === 0) {\n throw new Error(\"Provide at least one public website hostname.\");\n }\n let durationMinutes = null;\n if (options?.durationMinutes !== undefined &&\n options.durationMinutes !== null) {\n const parsed = typeof options.durationMinutes === \"number\"\n ? options.durationMinutes\n : Number(options.durationMinutes);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(\"durationMinutes must be a positive finite number\");\n }\n durationMinutes = Math.trunc(parsed);\n }\n return { websites, durationMinutes };\n}\nexport class WebsiteBlockerWeb extends WebPlugin {\n apiBase() {\n const global = typeof window !== \"undefined\"\n ? window.__ELIZA_API_BASE__\n : undefined;\n if (typeof global === \"string\" && global.trim().length > 0) {\n return global;\n }\n return \"\";\n }\n apiToken() {\n const global = typeof window !== \"undefined\"\n ? window.__ELIZA_API_TOKEN__\n : undefined;\n if (typeof global === \"string\" && global.trim().length > 0) {\n return global.trim();\n }\n if (typeof window === \"undefined\") {\n return null;\n }\n const stored = window.sessionStorage.getItem(\"eliza_api_token\");\n return stored?.trim() ? stored.trim() : null;\n }\n authHeaders() {\n const token = this.apiToken();\n return token ? { Authorization: `Bearer ${token}` } : {};\n }\n canReachApi() {\n const global = typeof window !== \"undefined\"\n ? window.__ELIZA_API_BASE__\n : undefined;\n if (typeof global === \"string\" && global.trim().length > 0) {\n return true;\n }\n if (typeof window === \"undefined\") {\n return false;\n }\n const protocol = window.location.protocol;\n return protocol === \"http:\" || protocol === \"https:\";\n }\n async requestJson(pathname, init) {\n if (!this.canReachApi()) {\n throw new Error(\"Eliza API not available\");\n }\n const response = await fetch(`${this.apiBase()}${pathname}`, {\n ...init,\n headers: {\n ...(init?.body ? { \"Content-Type\": \"application/json\" } : {}),\n ...this.authHeaders(),\n ...(init?.headers ?? {}),\n },\n });\n if (!response.ok) {\n throw new Error(`Request failed (${response.status})`);\n }\n return (await response.json());\n }\n async getStatus() {\n return await this.requestJson(\"/api/website-blocker\");\n }\n async startBlock(options) {\n const body = validateStartBlockOptions(options);\n return await this.requestJson(\"/api/website-blocker\", {\n method: \"PUT\",\n body: JSON.stringify(body),\n });\n }\n async stopBlock() {\n return await this.requestJson(\"/api/website-blocker\", {\n method: \"DELETE\",\n });\n }\n async checkPermissions() {\n const permission = await this.requestJson(\"/api/permissions/website-blocking\");\n return {\n status: permission.status,\n canRequest: permission.canRequest,\n canOpenSettings: permission.canOpenSettings ?? true,\n settingsTarget: permission.settingsTarget ?? \"runtime\",\n engine: permission.engine ?? \"hosts-file\",\n reason: permission.reason,\n };\n }\n async requestPermissions() {\n const permission = await this.requestJson(\"/api/permissions/website-blocking/request\", {\n method: \"POST\",\n });\n return {\n status: permission.status,\n canRequest: permission.canRequest,\n canOpenSettings: permission.canOpenSettings ?? true,\n settingsTarget: permission.settingsTarget ?? \"runtime\",\n engine: permission.engine ?? \"hosts-file\",\n reason: permission.reason,\n };\n }\n async openSettings() {\n if (!this.canReachApi()) {\n return {\n opened: false,\n target: \"runtime\",\n actualTarget: \"runtime\",\n reason: \"Eliza API not available.\",\n };\n }\n const result = await this.requestJson(\"/api/permissions/website-blocking/open-settings\", {\n method: \"POST\",\n });\n return {\n opened: result.opened ?? false,\n target: result.target ?? \"runtime\",\n actualTarget: result.actualTarget ?? result.target ?? \"runtime\",\n reason: result.reason ?? null,\n };\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
|