@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.
@@ -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;AAOvB,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;IAU7B,SAAS,IAAI,OAAO,CAAC,sBAAsB,CAAC;IAS5C,gBAAgB,IAAI,OAAO,CAAC,8BAA8B,CAAC;IAa3D,kBAAkB,IAAI,OAAO,CAAC,8BAA8B,CAAC;IAe7D,YAAY,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;CAWnD"}
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(options),
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 { opened: false };
152
+ return {
153
+ opened: false,
154
+ target: "runtime",
155
+ actualTarget: "runtime",
156
+ reason: "Eliza API not available.",
157
+ };
94
158
  }
95
- return await this.requestJson("/api/permissions/website-blocking/open-settings", {
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
@@ -1 +1 @@
1
- {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=web.test.d.ts.map
@@ -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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"}
@@ -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(options),
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 { opened: false };
240
+ return {
241
+ opened: false,
242
+ target: "runtime",
243
+ actualTarget: "runtime",
244
+ reason: "Eliza API not available.",
245
+ };
102
246
  }
103
- return await this.requestJson("/api/permissions/website-blocking/open-settings", {
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
@@ -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":"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"}
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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"}