@wenathlan/extension 1.1.11

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/README.md ADDED
@@ -0,0 +1,84 @@
1
+ # Devthink
2
+
3
+ Devthink is a **consent-first browser-agent bridge** distributed as a TypeScript library and a Chromium Manifest V3 extension. It turns a user-provided browser objective into a bounded, reviewable plan. The user must start the active-tab session and approve the plan before any page action reaches the browser.
4
+
5
+ Version: **1.1.11**. License: **GPL-3.0-only**. The repository is `wenathlan/extension`; the npm-compatible scoped package identifier is `@wenathlan/extension`.
6
+
7
+ ## What it does
8
+
9
+ | Capability | Behavior in 1.1.11 |
10
+ | --- | --- |
11
+ | Active-tab session | The user starts a short-lived session for one HTTPS tab and one origin. |
12
+ | Page observation | The extension captures a bounded semantic inventory of interactive elements and form labels. |
13
+ | Plan proposal | A local plan can be created immediately; an optional user-configured HTTPS endpoint can return a typed plan proposal. |
14
+ | Review gate | Every remote proposal starts in `pending`; it cannot reach the page bridge before explicit approval. |
15
+ | Browser tools | Reviewed plans may observe, inspect, focus, click, type approved text or navigate within the same approved origin. |
16
+ | Stop and audit | The user can stop the session at any time. Configuration, proposals, decisions and results remain in local extension storage. |
17
+
18
+ The project is deliberately **not** a hosted control platform. It does not depend on a provider-specific sandbox, server URL or browser profile. A configured endpoint is optional, has to use HTTPS and receives only the session record and bounded observation required to produce a plan.
19
+
20
+ ## Security boundary
21
+
22
+ > Devthink never requests broad host access at installation. The user can grant a single HTTPS origin only after entering it in the extension popup.
23
+
24
+ The default manifest requests `activeTab`, `storage`, `scripting` and `sidePanel`. It does not request debugger, cookies, history, downloads, proxy control, native messaging, web requests, full-time host permissions or credentials. A service worker cannot be relied on for unattended 24-hour agent computation; any such system must be designed, installed and governed separately. [1] [2]
25
+
26
+ Browser actions remain blocked if the session is missing, stopped or expired; the tab or origin changed; the plan was not approved; the plan expired; or the tool proposal is not in the local allowlist. The page bridge checks the origin again immediately before it acts.
27
+
28
+ ## Install for development
29
+
30
+ ```bash
31
+ pnpm install
32
+ pnpm validate
33
+ ```
34
+
35
+ Then open the Chromium extensions page, enable developer mode, select **Load unpacked**, and choose `extension/dist` after a successful build. The popup has three deliberate steps: grant a user-entered endpoint origin if an endpoint is needed, start a session for the active HTTPS tab, and open the side panel to review a plan.
36
+
37
+ ## Configure an agent endpoint
38
+
39
+ The endpoint field intentionally has no default URL. Enter a URL such as `https://agent.example/proposal`; Chromium will prompt for that origin only. The endpoint receives:
40
+
41
+ ```json
42
+ {
43
+ "version": "1.1.11",
44
+ "objective": "User supplied objective",
45
+ "session": { "id": "uuid", "tabid": 1, "origin": "https://example.com" },
46
+ "observation": { "url": "https://example.com/path", "interactive": [] }
47
+ }
48
+ ```
49
+
50
+ It must return a plan proposal using the same version. Every step needs a human-readable summary. Navigation is restricted to the active session origin, and any unknown or malformed proposal is rejected locally. The endpoint is a planner, not an authority to control the browser.
51
+
52
+ ## Library use
53
+
54
+ ```ts
55
+ import { canexecute, normalizeendpoint, parseproposal } from "@wenathlan/extension";
56
+
57
+ const config = normalizeendpoint("https://agent.example/proposal");
58
+ const proposal = parseproposal(agentresponse, "https://example.com");
59
+ const decision = canexecute({ session, plan: proposal.plan, step, tabid: 1, origin: "https://example.com" });
60
+ ```
61
+
62
+ The library has no runtime dependency and exposes pure policy, protocol and local-memory contracts. It can be embedded in a browser agent, test harness, CLI or another JavaScript runtime that supplies compatible storage.
63
+
64
+ ## Build and package
65
+
66
+ | Command | Purpose |
67
+ | --- | --- |
68
+ | `pnpm check` | Strict TypeScript validation. |
69
+ | `pnpm test` | Unit tests for consent, origins, protocol and local audit state. |
70
+ | `pnpm build` | Bundles the library, CLI and unpacked extension. |
71
+ | `pnpm validate` | Runs type check, tests, build and manifest gate. |
72
+ | `pnpm package` | Builds then previews the npm package content without publishing. |
73
+ | `node dist/cli.js manifest` | Rejects a version mismatch, mandatory host permission or disallowed browser capability. |
74
+
75
+ The workflows keep verification, version synchronization, release assembly and registry publication separated. A package.json version change is mirrored to release metadata by a repository workflow. A matching `vX.Y.Z` tag produces the signed release assets and digest. Registry publication occurs only after a release is published, and npm.js publishing also requires the repository `NPM_TOKEN` secret or compatible trusted-publishing configuration. Release gates, research evidence and known limitations are in `docs/`.
76
+
77
+ ## Research and clean-room policy
78
+
79
+ The repository includes public listing research, 58 CRX manifest inventories, static API signals and a 50-project open-source comparison sample. Downloaded artifacts were treated as untrusted, inspected without execution and discarded. Devthink is an original implementation: it does not vendor or derive code, visuals, names or proprietary transport details from reviewed products.
80
+
81
+ ## References
82
+
83
+ [1]: https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions "Chrome Extensions — Declare permissions"
84
+ [2]: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions "MDN — WebExtension permissions"
package/dist/cli.js ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+
3
+ // cli/devthink.ts
4
+ import { readFile } from "node:fs/promises";
5
+ import { resolve } from "node:path";
6
+ var forbidden = /* @__PURE__ */ new Set(["debugger", "cookies", "webRequest", "history", "bookmarks", "downloads", "nativeMessaging", "proxy", "management"]);
7
+ async function main() {
8
+ const command = process.argv[2] ?? "help";
9
+ if (command === "manifest") {
10
+ const manifest = JSON.parse(await readFile(resolve("extension/manifest.json"), "utf8"));
11
+ const packagejson = JSON.parse(await readFile(resolve("package.json"), "utf8"));
12
+ const permissions = manifest.permissions ?? [];
13
+ const denied = permissions.filter((permission) => forbidden.has(permission));
14
+ if (manifest.version !== packagejson.version) throw new Error("Manifest version must match package.json.");
15
+ if ((manifest.host_permissions ?? []).length) throw new Error("Mandatory host permissions are not allowed.");
16
+ if (denied.length) throw new Error(`Forbidden permissions: ${denied.join(", ")}`);
17
+ console.log(JSON.stringify({ valid: true, version: manifest.version, permissions }, null, 2));
18
+ return;
19
+ }
20
+ console.log("Usage: devthink manifest");
21
+ }
22
+ main().catch((error) => {
23
+ console.error(error instanceof Error ? error.message : String(error));
24
+ process.exitCode = 1;
25
+ });
@@ -0,0 +1,5 @@
1
+ export * from "./memory.js";
2
+ export { actionrisk as deriveactionrisk, canexecute, hostpattern, normalizeendpoint, validatestep } from "./policy.js";
3
+ export * from "./protocol.js";
4
+ export * from "./types.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,UAAU,IAAI,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACvH,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,149 @@
1
+ // memory.ts
2
+ var sessionmemory = class {
3
+ constructor(adapter) {
4
+ this.adapter = adapter;
5
+ }
6
+ async getconfig() {
7
+ return this.adapter.get("config");
8
+ }
9
+ async setconfig(value) {
10
+ return this.adapter.set("config", value);
11
+ }
12
+ async getsession() {
13
+ return this.adapter.get("session");
14
+ }
15
+ async setsession(value) {
16
+ return this.adapter.set("session", value);
17
+ }
18
+ async getplan() {
19
+ return this.adapter.get("plan");
20
+ }
21
+ async setplan(value) {
22
+ return this.adapter.set("plan", value);
23
+ }
24
+ async getdiagnostic() {
25
+ return this.adapter.get("diagnostic");
26
+ }
27
+ async setdiagnostic(value) {
28
+ return this.adapter.set("diagnostic", value);
29
+ }
30
+ async getaudit() {
31
+ return await this.adapter.get("audit") ?? [];
32
+ }
33
+ async addaudi(event) {
34
+ const records = await this.getaudit();
35
+ await this.adapter.set("audit", [event, ...records].slice(0, 100));
36
+ }
37
+ };
38
+ function randomid() {
39
+ return crypto.randomUUID();
40
+ }
41
+
42
+ // policy.ts
43
+ var sensitiveactions = /* @__PURE__ */ new Set(["click", "type", "navigate"]);
44
+ var allowedactions = /* @__PURE__ */ new Set(["observe", "inspect", "focus", "click", "type", "navigate"]);
45
+ function normalizeendpoint(value) {
46
+ const endpoint = new URL(value.trim());
47
+ if (endpoint.protocol !== "https:") throw new Error("Devthink accepts HTTPS endpoints only.");
48
+ if (endpoint.username || endpoint.password) throw new Error("Endpoint credentials are not allowed in the URL.");
49
+ return { endpoint: endpoint.toString(), origin: endpoint.origin, configuredat: Date.now() };
50
+ }
51
+ function hostpattern(origin) {
52
+ const parsed = new URL(origin);
53
+ if (parsed.protocol !== "https:") throw new Error("Only HTTPS origins can be granted.");
54
+ return `${parsed.origin}/*`;
55
+ }
56
+ function actionrisk(kind) {
57
+ if (!allowedactions.has(kind)) throw new Error("Unsupported browser action.");
58
+ if (sensitiveactions.has(kind)) return "sensitive";
59
+ return kind === "focus" ? "interaction" : "read";
60
+ }
61
+ function validatestep(step, origin) {
62
+ if (!allowedactions.has(step.kind)) return { allowed: false, reason: "Unsupported action kind." };
63
+ if (!step.summary.trim()) return { allowed: false, reason: "A human-readable action summary is required." };
64
+ if ((step.kind === "click" || step.kind === "focus" || step.kind === "inspect" || step.kind === "type") && !step.target?.trim()) return { allowed: false, reason: "A page target is required." };
65
+ if (step.kind === "navigate") {
66
+ if (!step.value) return { allowed: false, reason: "A navigation URL is required." };
67
+ try {
68
+ if (new URL(step.value).origin !== origin) return { allowed: false, reason: "Navigation must remain within the approved origin." };
69
+ } catch {
70
+ return { allowed: false, reason: "Navigation URL is invalid." };
71
+ }
72
+ }
73
+ return { allowed: true };
74
+ }
75
+ function canexecute(input) {
76
+ const now = input.now ?? Date.now();
77
+ if (!input.session || input.session.stoppedat) return { allowed: false, reason: "No active browser session exists." };
78
+ if (input.session.expiresat <= now) return { allowed: false, reason: "The browser session has expired." };
79
+ if (input.session.tabid !== input.tabid || input.session.origin !== input.origin) return { allowed: false, reason: "The action is outside the approved tab or origin." };
80
+ if (!input.plan || input.plan.state !== "approved") return { allowed: false, reason: "The plan has not received explicit approval." };
81
+ if (input.plan.expiresat <= now) return { allowed: false, reason: "The approved plan has expired." };
82
+ return validatestep(input.step, input.origin);
83
+ }
84
+
85
+ // version.ts
86
+ var packageversion = "1.1.11";
87
+
88
+ // types.ts
89
+ var protocolversion = packageversion;
90
+
91
+ // protocol.ts
92
+ function record(value) {
93
+ if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error("Protocol message must be an object.");
94
+ return value;
95
+ }
96
+ function text(value, field) {
97
+ if (typeof value !== "string" || !value.trim()) throw new Error(`${field} must be a non-empty string.`);
98
+ return value.trim();
99
+ }
100
+ function parseproposal(value, origin) {
101
+ const root = record(value);
102
+ if (root.version !== protocolversion) throw new Error("Unsupported protocol version.");
103
+ const planinput = record(root.plan);
104
+ const stepsinput = planinput.steps;
105
+ if (!Array.isArray(stepsinput) || stepsinput.length === 0 || stepsinput.length > 20) throw new Error("A plan needs between one and twenty steps.");
106
+ const steps = stepsinput.map((input, index) => {
107
+ const candidate = record(input);
108
+ const kind = text(candidate.kind, `step ${index + 1} kind`);
109
+ const step = {
110
+ id: typeof candidate.id === "string" ? candidate.id : crypto.randomUUID(),
111
+ kind,
112
+ summary: text(candidate.summary, `step ${index + 1} summary`),
113
+ risk: actionrisk(kind),
114
+ ...typeof candidate.target === "string" ? { target: candidate.target } : {},
115
+ ...typeof candidate.value === "string" ? { value: candidate.value } : {}
116
+ };
117
+ const evaluation = validatestep(step, origin);
118
+ if (!evaluation.allowed) throw new Error(evaluation.reason);
119
+ return step;
120
+ });
121
+ const createdat = Date.now();
122
+ const plan = {
123
+ id: typeof planinput.id === "string" ? planinput.id : crypto.randomUUID(),
124
+ objective: text(planinput.objective, "objective"),
125
+ origin,
126
+ steps,
127
+ createdat,
128
+ expiresat: Math.min(typeof planinput.expiresat === "number" ? planinput.expiresat : createdat + 10 * 60 * 1e3, createdat + 30 * 60 * 1e3),
129
+ state: "pending"
130
+ };
131
+ if (plan.expiresat <= createdat) throw new Error("Plan expiry must be in the future.");
132
+ return { version: protocolversion, plan };
133
+ }
134
+ function requestbody(input) {
135
+ return JSON.stringify({ version: protocolversion, objective: input.objective, session: input.session, observation: input.observation });
136
+ }
137
+ export {
138
+ canexecute,
139
+ actionrisk as deriveactionrisk,
140
+ hostpattern,
141
+ normalizeendpoint,
142
+ parseproposal,
143
+ protocolversion,
144
+ randomid,
145
+ requestbody,
146
+ sessionmemory,
147
+ validatestep
148
+ };
149
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../memory.ts", "../policy.ts", "../version.ts", "../types.ts", "../protocol.ts"],
4
+ "sourcesContent": ["import type { agentplan, agentsession, auditevent, diagnosticreport, endpointconfig } from \"./types.js\";\n\n/** Provides a small storage seam that works in browser, tests and future adapters. */\nexport interface memoryadapter {\n get<T>(key: string): Promise<T | undefined>;\n set<T>(key: string, value: T): Promise<void>;\n}\n\nexport class sessionmemory {\n constructor(private readonly adapter: memoryadapter) {}\n\n async getconfig(): Promise<endpointconfig | undefined> { return this.adapter.get<endpointconfig>(\"config\"); }\n async setconfig(value: endpointconfig): Promise<void> { return this.adapter.set(\"config\", value); }\n async getsession(): Promise<agentsession | undefined> { return this.adapter.get<agentsession>(\"session\"); }\n async setsession(value: agentsession): Promise<void> { return this.adapter.set(\"session\", value); }\n async getplan(): Promise<agentplan | undefined> { return this.adapter.get<agentplan>(\"plan\"); }\n async setplan(value: agentplan): Promise<void> { return this.adapter.set(\"plan\", value); }\n async getdiagnostic(): Promise<diagnosticreport | undefined> { return this.adapter.get<diagnosticreport>(\"diagnostic\"); }\n async setdiagnostic(value: diagnosticreport): Promise<void> { return this.adapter.set(\"diagnostic\", value); }\n async getaudit(): Promise<auditevent[]> { return (await this.adapter.get<auditevent[]>(\"audit\")) ?? []; }\n async addaudi(event: auditevent): Promise<void> {\n const records = await this.getaudit();\n await this.adapter.set(\"audit\", [event, ...records].slice(0, 100));\n }\n}\n\n/** Creates identifiers locally without a network dependency. */\nexport function randomid(): string {\n return crypto.randomUUID();\n}\n", "import type { actionkind, agentplan, agentsession, endpointconfig, policyevaluation, toolstep } from \"./types.js\";\n\nconst sensitiveactions = new Set<actionkind>([\"click\", \"type\", \"navigate\"]);\nconst allowedactions = new Set<actionkind>([\"observe\", \"inspect\", \"focus\", \"click\", \"type\", \"navigate\"]);\n\n/** Normalizes a user supplied HTTPS endpoint without preserving a provider lock-in. */\nexport function normalizeendpoint(value: string): endpointconfig {\n const endpoint = new URL(value.trim());\n if (endpoint.protocol !== \"https:\") throw new Error(\"Devthink accepts HTTPS endpoints only.\");\n if (endpoint.username || endpoint.password) throw new Error(\"Endpoint credentials are not allowed in the URL.\");\n return { endpoint: endpoint.toString(), origin: endpoint.origin, configuredat: Date.now() };\n}\n\n/** Creates the exact optional host pattern requested from Chromium. */\nexport function hostpattern(origin: string): string {\n const parsed = new URL(origin);\n if (parsed.protocol !== \"https:\") throw new Error(\"Only HTTPS origins can be granted.\");\n return `${parsed.origin}/*`;\n}\n\n/** Defines action risk from a fixed local allowlist. */\nexport function actionrisk(kind: actionkind): \"read\" | \"interaction\" | \"sensitive\" {\n if (!allowedactions.has(kind)) throw new Error(\"Unsupported browser action.\");\n if (sensitiveactions.has(kind)) return \"sensitive\";\n return kind === \"focus\" ? \"interaction\" : \"read\";\n}\n\n/** Validates a single proposal against the active tab origin and local policy. */\nexport function validatestep(step: toolstep, origin: string): policyevaluation {\n if (!allowedactions.has(step.kind)) return { allowed: false, reason: \"Unsupported action kind.\" };\n if (!step.summary.trim()) return { allowed: false, reason: \"A human-readable action summary is required.\" };\n if ((step.kind === \"click\" || step.kind === \"focus\" || step.kind === \"inspect\" || step.kind === \"type\") && !step.target?.trim()) return { allowed: false, reason: \"A page target is required.\" };\n if (step.kind === \"navigate\") {\n if (!step.value) return { allowed: false, reason: \"A navigation URL is required.\" };\n try {\n if (new URL(step.value).origin !== origin) return { allowed: false, reason: \"Navigation must remain within the approved origin.\" };\n } catch {\n return { allowed: false, reason: \"Navigation URL is invalid.\" };\n }\n }\n return { allowed: true };\n}\n\n/** Applies the consent gate immediately before an action reaches the page bridge. */\nexport function canexecute(input: { session: agentsession | undefined; plan: agentplan | undefined; step: toolstep; tabid: number; origin: string; now?: number }): policyevaluation {\n const now = input.now ?? Date.now();\n if (!input.session || input.session.stoppedat) return { allowed: false, reason: \"No active browser session exists.\" };\n if (input.session.expiresat <= now) return { allowed: false, reason: \"The browser session has expired.\" };\n if (input.session.tabid !== input.tabid || input.session.origin !== input.origin) return { allowed: false, reason: \"The action is outside the approved tab or origin.\" };\n if (!input.plan || input.plan.state !== \"approved\") return { allowed: false, reason: \"The plan has not received explicit approval.\" };\n if (input.plan.expiresat <= now) return { allowed: false, reason: \"The approved plan has expired.\" };\n return validatestep(input.step, input.origin);\n}\n", "/** Canonical package version synchronized from package.json. */\nexport const packageversion = \"1.1.11\" as const;\n", "/** Shared contracts for every Devthink target. */\nimport { packageversion } from \"./version.js\";\n\nexport const protocolversion = packageversion;\n\nexport type actionkind = \"observe\" | \"inspect\" | \"focus\" | \"click\" | \"type\" | \"navigate\";\nexport type actionrisk = \"read\" | \"interaction\" | \"sensitive\";\nexport type planstate = \"draft\" | \"pending\" | \"approved\" | \"rejected\" | \"expired\" | \"completed\" | \"cancelled\";\nexport type auditkind = \"configure\" | \"session\" | \"observe\" | \"proposal\" | \"approval\" | \"action\" | \"error\" | \"stop\";\n\nexport interface toolstep {\n id: string;\n kind: actionkind;\n target?: string;\n value?: string;\n summary: string;\n risk: actionrisk;\n}\n\nexport interface agentplan {\n id: string;\n objective: string;\n origin: string;\n steps: toolstep[];\n createdat: number;\n expiresat: number;\n state: planstate;\n approvedat?: number;\n}\n\nexport interface agentsession {\n id: string;\n tabid: number;\n origin: string;\n startedat: number;\n expiresat: number;\n stoppedat?: number;\n}\n\nexport interface endpointconfig {\n endpoint: string;\n origin: string;\n configuredat: number;\n}\n\nexport interface observation {\n url: string;\n title: string;\n textpreview: string;\n textlength: number;\n forms: Array<{ label: string; type: string; name: string }>;\n interactive: Array<{ selector: string; role: string; label: string }>;\n capturedat: number;\n}\n\nexport interface auditevent {\n id: string;\n kind: auditkind;\n at: number;\n summary: string;\n sessionid?: string;\n planid?: string;\n stepid?: string;\n}\n\nexport interface diagnosticreport {\n id: string;\n sessionid: string;\n origin: string;\n capturedat: number;\n tabid: number;\n title: string;\n textlength: number;\n interactivecount: number;\n formcount: number;\n bridgeavailable: boolean;\n}\n\nexport interface proposalrequest {\n objective: string;\n session: agentsession;\n observation: observation;\n}\n\nexport interface planproposal {\n version: typeof protocolversion;\n plan: agentplan;\n}\n\nexport interface policyevaluation {\n allowed: boolean;\n reason?: string;\n}\n", "import { actionrisk, validatestep } from \"./policy.js\";\nimport { protocolversion, type agentplan, type planproposal, type proposalrequest, type toolstep } from \"./types.js\";\n\nfunction record(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"Protocol message must be an object.\");\n return value as Record<string, unknown>;\n}\n\nfunction text(value: unknown, field: string): string {\n if (typeof value !== \"string\" || !value.trim()) throw new Error(`${field} must be a non-empty string.`);\n return value.trim();\n}\n\n/** Validates agent output before it becomes a locally reviewable plan. */\nexport function parseproposal(value: unknown, origin: string): planproposal {\n const root = record(value);\n if (root.version !== protocolversion) throw new Error(\"Unsupported protocol version.\");\n const planinput = record(root.plan);\n const stepsinput = planinput.steps;\n if (!Array.isArray(stepsinput) || stepsinput.length === 0 || stepsinput.length > 20) throw new Error(\"A plan needs between one and twenty steps.\");\n const steps: toolstep[] = stepsinput.map((input, index) => {\n const candidate = record(input);\n const kind = text(candidate.kind, `step ${index + 1} kind`) as toolstep[\"kind\"];\n const step: toolstep = {\n id: typeof candidate.id === \"string\" ? candidate.id : crypto.randomUUID(),\n kind,\n summary: text(candidate.summary, `step ${index + 1} summary`),\n risk: actionrisk(kind),\n ...(typeof candidate.target === \"string\" ? { target: candidate.target } : {}),\n ...(typeof candidate.value === \"string\" ? { value: candidate.value } : {}),\n };\n const evaluation = validatestep(step, origin);\n if (!evaluation.allowed) throw new Error(evaluation.reason);\n return step;\n });\n const createdat = Date.now();\n const plan: agentplan = {\n id: typeof planinput.id === \"string\" ? planinput.id : crypto.randomUUID(),\n objective: text(planinput.objective, \"objective\"),\n origin,\n steps,\n createdat,\n expiresat: Math.min(typeof planinput.expiresat === \"number\" ? planinput.expiresat : createdat + 10 * 60 * 1000, createdat + 30 * 60 * 1000),\n state: \"pending\",\n };\n if (plan.expiresat <= createdat) throw new Error(\"Plan expiry must be in the future.\");\n return { version: protocolversion, plan };\n}\n\n/** Shapes the only data that may be sent to a user-configured agent endpoint. */\nexport function requestbody(input: proposalrequest): string {\n return JSON.stringify({ version: protocolversion, objective: input.objective, session: input.session, observation: input.observation });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,23 @@
1
+ import type { agentplan, agentsession, auditevent, diagnosticreport, endpointconfig } from "./types.js";
2
+ /** Provides a small storage seam that works in browser, tests and future adapters. */
3
+ export interface memoryadapter {
4
+ get<T>(key: string): Promise<T | undefined>;
5
+ set<T>(key: string, value: T): Promise<void>;
6
+ }
7
+ export declare class sessionmemory {
8
+ private readonly adapter;
9
+ constructor(adapter: memoryadapter);
10
+ getconfig(): Promise<endpointconfig | undefined>;
11
+ setconfig(value: endpointconfig): Promise<void>;
12
+ getsession(): Promise<agentsession | undefined>;
13
+ setsession(value: agentsession): Promise<void>;
14
+ getplan(): Promise<agentplan | undefined>;
15
+ setplan(value: agentplan): Promise<void>;
16
+ getdiagnostic(): Promise<diagnosticreport | undefined>;
17
+ setdiagnostic(value: diagnosticreport): Promise<void>;
18
+ getaudit(): Promise<auditevent[]>;
19
+ addaudi(event: auditevent): Promise<void>;
20
+ }
21
+ /** Creates identifiers locally without a network dependency. */
22
+ export declare function randomid(): string;
23
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAExG,sFAAsF;AACtF,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC5C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C;AAED,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,aAAa;IAE7C,SAAS,IAAI,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAChD,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAC/C,UAAU,IAAI,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAC/C,UAAU,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAC9C,OAAO,IAAI,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IACzC,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IACxC,aAAa,IAAI,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IACtD,aAAa,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IACrD,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IACjC,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAIhD;AAED,gEAAgE;AAChE,wBAAgB,QAAQ,IAAI,MAAM,CAEjC"}
@@ -0,0 +1,19 @@
1
+ import type { actionkind, agentplan, agentsession, endpointconfig, policyevaluation, toolstep } from "./types.js";
2
+ /** Normalizes a user supplied HTTPS endpoint without preserving a provider lock-in. */
3
+ export declare function normalizeendpoint(value: string): endpointconfig;
4
+ /** Creates the exact optional host pattern requested from Chromium. */
5
+ export declare function hostpattern(origin: string): string;
6
+ /** Defines action risk from a fixed local allowlist. */
7
+ export declare function actionrisk(kind: actionkind): "read" | "interaction" | "sensitive";
8
+ /** Validates a single proposal against the active tab origin and local policy. */
9
+ export declare function validatestep(step: toolstep, origin: string): policyevaluation;
10
+ /** Applies the consent gate immediately before an action reaches the page bridge. */
11
+ export declare function canexecute(input: {
12
+ session: agentsession | undefined;
13
+ plan: agentplan | undefined;
14
+ step: toolstep;
15
+ tabid: number;
16
+ origin: string;
17
+ now?: number;
18
+ }): policyevaluation;
19
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAKlH,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAK/D;AAED,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,aAAa,GAAG,WAAW,CAIjF;AAED,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAa7E;AAED,qFAAqF;AACrF,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAAE,OAAO,EAAE,YAAY,GAAG,SAAS,CAAC;IAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,CAQnL"}
@@ -0,0 +1,6 @@
1
+ import { type planproposal, type proposalrequest } from "./types.js";
2
+ /** Validates agent output before it becomes a locally reviewable plan. */
3
+ export declare function parseproposal(value: unknown, origin: string): planproposal;
4
+ /** Shapes the only data that may be sent to a user-configured agent endpoint. */
5
+ export declare function requestbody(input: proposalrequest): string;
6
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../protocol.ts"],"names":[],"mappings":"AACA,OAAO,EAAmC,KAAK,YAAY,EAAE,KAAK,eAAe,EAAiB,MAAM,YAAY,CAAC;AAYrH,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAiC1E;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAE1D"}
@@ -0,0 +1,88 @@
1
+ export declare const protocolversion: "1.1.11";
2
+ export type actionkind = "observe" | "inspect" | "focus" | "click" | "type" | "navigate";
3
+ export type actionrisk = "read" | "interaction" | "sensitive";
4
+ export type planstate = "draft" | "pending" | "approved" | "rejected" | "expired" | "completed" | "cancelled";
5
+ export type auditkind = "configure" | "session" | "observe" | "proposal" | "approval" | "action" | "error" | "stop";
6
+ export interface toolstep {
7
+ id: string;
8
+ kind: actionkind;
9
+ target?: string;
10
+ value?: string;
11
+ summary: string;
12
+ risk: actionrisk;
13
+ }
14
+ export interface agentplan {
15
+ id: string;
16
+ objective: string;
17
+ origin: string;
18
+ steps: toolstep[];
19
+ createdat: number;
20
+ expiresat: number;
21
+ state: planstate;
22
+ approvedat?: number;
23
+ }
24
+ export interface agentsession {
25
+ id: string;
26
+ tabid: number;
27
+ origin: string;
28
+ startedat: number;
29
+ expiresat: number;
30
+ stoppedat?: number;
31
+ }
32
+ export interface endpointconfig {
33
+ endpoint: string;
34
+ origin: string;
35
+ configuredat: number;
36
+ }
37
+ export interface observation {
38
+ url: string;
39
+ title: string;
40
+ textpreview: string;
41
+ textlength: number;
42
+ forms: Array<{
43
+ label: string;
44
+ type: string;
45
+ name: string;
46
+ }>;
47
+ interactive: Array<{
48
+ selector: string;
49
+ role: string;
50
+ label: string;
51
+ }>;
52
+ capturedat: number;
53
+ }
54
+ export interface auditevent {
55
+ id: string;
56
+ kind: auditkind;
57
+ at: number;
58
+ summary: string;
59
+ sessionid?: string;
60
+ planid?: string;
61
+ stepid?: string;
62
+ }
63
+ export interface diagnosticreport {
64
+ id: string;
65
+ sessionid: string;
66
+ origin: string;
67
+ capturedat: number;
68
+ tabid: number;
69
+ title: string;
70
+ textlength: number;
71
+ interactivecount: number;
72
+ formcount: number;
73
+ bridgeavailable: boolean;
74
+ }
75
+ export interface proposalrequest {
76
+ objective: string;
77
+ session: agentsession;
78
+ observation: observation;
79
+ }
80
+ export interface planproposal {
81
+ version: typeof protocolversion;
82
+ plan: agentplan;
83
+ }
84
+ export interface policyevaluation {
85
+ allowed: boolean;
86
+ reason?: string;
87
+ }
88
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Canonical package version synchronized from package.json. */
2
+ export declare const packageversion: "1.1.11";
3
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../version.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,eAAO,MAAM,cAAc,EAAG,QAAiB,CAAC"}