@akshayram1/omnibrowser-agent 0.2.1 → 0.2.3
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/.github/workflows/ci.yml +41 -0
- package/README.md +42 -3
- package/dist/content.js +61 -13
- package/dist/content.js.map +3 -3
- package/dist/lib.js +119 -20
- package/dist/lib.js.map +3 -3
- package/dist/manifest.json +4 -4
- package/dist/popup.html +1 -0
- package/dist/types/core/executor.d.ts +2 -0
- package/dist/types/core/observer.d.ts +2 -0
- package/dist/types/core/planner.d.ts +2 -0
- package/dist/types/lib/index.d.ts +1 -0
- package/dist/types/shared/contracts.d.ts +7 -1
- package/dist/types/shared/parse-action.d.ts +13 -0
- package/docs/ARCHITECTURE.md +24 -8
- package/docs/DEPLOYMENT.md +67 -0
- package/docs/EMBEDDING.md +34 -0
- package/docs/ROADMAP.md +10 -2
- package/index.html +460 -0
- package/package.json +4 -3
- package/styles.css +484 -0
- package/vercel.json +6 -0
package/index.html
ADDED
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>OmniBrowser Agent</title>
|
|
7
|
+
<meta
|
|
8
|
+
name="description"
|
|
9
|
+
content="OmniBrowser Agent - local-first browser AI operator library."
|
|
10
|
+
/>
|
|
11
|
+
<link rel="stylesheet" href="./styles.css" />
|
|
12
|
+
</head>
|
|
13
|
+
<body>
|
|
14
|
+
<header class="header">
|
|
15
|
+
<div class="wrap header-row">
|
|
16
|
+
<a class="brand" href="#home">OmniBrowser Agent</a>
|
|
17
|
+
<nav class="nav">
|
|
18
|
+
<a href="#home">Home</a>
|
|
19
|
+
<a href="#docs">Docs</a>
|
|
20
|
+
<a href="#architecture">Architecture</a>
|
|
21
|
+
<a href="#embedding">Embedding</a>
|
|
22
|
+
<a href="#roadmap">Roadmap</a>
|
|
23
|
+
<a href="#contact">Contact</a>
|
|
24
|
+
</nav>
|
|
25
|
+
</div>
|
|
26
|
+
</header>
|
|
27
|
+
|
|
28
|
+
<main>
|
|
29
|
+
<!-- HOME -->
|
|
30
|
+
<section id="home" class="section hero">
|
|
31
|
+
<div class="wrap">
|
|
32
|
+
<p class="eyebrow">Open-source browser automation SDK</p>
|
|
33
|
+
<h1>Local-first browser AI automation library</h1>
|
|
34
|
+
<p>
|
|
35
|
+
OmniBrowser Agent helps you run page observation, planning, and execution flows directly in the browser.
|
|
36
|
+
</p>
|
|
37
|
+
<div class="chips">
|
|
38
|
+
<span>Privacy-first</span>
|
|
39
|
+
<span>WebLLM-ready</span>
|
|
40
|
+
<span>Human-approved mode</span>
|
|
41
|
+
<span>Embeddable API</span>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="actions">
|
|
44
|
+
<a class="btn primary" href="./examples/chatbot/">Live Demo</a>
|
|
45
|
+
<a
|
|
46
|
+
class="btn"
|
|
47
|
+
href="https://www.npmjs.com/package/@akshayram1/omnibrowser-agent"
|
|
48
|
+
target="_blank"
|
|
49
|
+
rel="noreferrer"
|
|
50
|
+
>NPM Package</a
|
|
51
|
+
>
|
|
52
|
+
<a
|
|
53
|
+
class="btn"
|
|
54
|
+
href="https://github.com/akshayram1/omnibrowser-agent"
|
|
55
|
+
target="_blank"
|
|
56
|
+
rel="noreferrer"
|
|
57
|
+
>GitHub Repo</a
|
|
58
|
+
>
|
|
59
|
+
</div>
|
|
60
|
+
<div class="stats" aria-label="project stats">
|
|
61
|
+
<div class="stat"><strong>2</strong><span>Execution Modes</span></div>
|
|
62
|
+
<div class="stat"><strong>3</strong><span>Planner Options</span></div>
|
|
63
|
+
<div class="stat"><strong>MIT</strong><span>License</span></div>
|
|
64
|
+
</div>
|
|
65
|
+
<div class="home-grid">
|
|
66
|
+
<article class="card">
|
|
67
|
+
<h3>Use Cases</h3>
|
|
68
|
+
<ul>
|
|
69
|
+
<li>CRM profile lookup automation</li>
|
|
70
|
+
<li>Guided web task execution</li>
|
|
71
|
+
<li>Assisted data extraction flows</li>
|
|
72
|
+
</ul>
|
|
73
|
+
</article>
|
|
74
|
+
<article class="card">
|
|
75
|
+
<h3>Core Modules</h3>
|
|
76
|
+
<ul>
|
|
77
|
+
<li><strong>Observer:</strong> page signals and candidates</li>
|
|
78
|
+
<li><strong>Planner:</strong> next best action selection</li>
|
|
79
|
+
<li><strong>Executor:</strong> safe browser action runtime</li>
|
|
80
|
+
</ul>
|
|
81
|
+
</article>
|
|
82
|
+
<article class="card">
|
|
83
|
+
<h3>Project Links</h3>
|
|
84
|
+
<ul>
|
|
85
|
+
<li><a href="https://www.npmjs.com/package/@akshayram1/omnibrowser-agent" target="_blank" rel="noreferrer">NPM package</a></li>
|
|
86
|
+
<li><a href="https://github.com/akshayram1/omnibrowser-agent" target="_blank" rel="noreferrer">GitHub repository</a></li>
|
|
87
|
+
<li><a href="./README.md" target="_blank" rel="noreferrer">README</a></li>
|
|
88
|
+
</ul>
|
|
89
|
+
</article>
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
</section>
|
|
93
|
+
|
|
94
|
+
<!-- DOCS / QUICK START -->
|
|
95
|
+
<section id="docs" class="section">
|
|
96
|
+
<div class="wrap">
|
|
97
|
+
<div class="surface">
|
|
98
|
+
<h2>Docs</h2>
|
|
99
|
+
<p>Everything you need to install, initialize, and run your first browser agent.</p>
|
|
100
|
+
|
|
101
|
+
<h3>Installation</h3>
|
|
102
|
+
<pre><code>npm install @akshayram1/omnibrowser-agent</code></pre>
|
|
103
|
+
|
|
104
|
+
<h3>Quick Start</h3>
|
|
105
|
+
<pre><code>import { createBrowserAgent } from "@akshayram1/omnibrowser-agent";
|
|
106
|
+
|
|
107
|
+
const agent = createBrowserAgent(
|
|
108
|
+
{
|
|
109
|
+
goal: "Open CRM and find customer John Smith",
|
|
110
|
+
mode: "human-approved",
|
|
111
|
+
planner: { kind: "heuristic" }
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
onStep: (result) => console.log(result.message),
|
|
115
|
+
onApprovalRequired: (action) => console.log("Needs approval:", action),
|
|
116
|
+
onDone: (result) => console.log("Done:", result.message),
|
|
117
|
+
onMaxStepsReached: (session) => console.log("Max steps hit", session.history)
|
|
118
|
+
}
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
await agent.start();
|
|
122
|
+
|
|
123
|
+
// Resume after approval:
|
|
124
|
+
await agent.resume();
|
|
125
|
+
|
|
126
|
+
// Inspect state:
|
|
127
|
+
console.log(agent.isRunning, agent.hasPendingAction);
|
|
128
|
+
|
|
129
|
+
// Stop:
|
|
130
|
+
agent.stop();</code></pre>
|
|
131
|
+
|
|
132
|
+
<h3>AbortSignal support</h3>
|
|
133
|
+
<pre><code>const controller = new AbortController();
|
|
134
|
+
const agent = createBrowserAgent({ goal: "...", signal: controller.signal });
|
|
135
|
+
agent.start();
|
|
136
|
+
|
|
137
|
+
// Cancel from outside:
|
|
138
|
+
controller.abort();</code></pre>
|
|
139
|
+
|
|
140
|
+
<h3>Execution Modes</h3>
|
|
141
|
+
<div class="docs-grid">
|
|
142
|
+
<article class="doc-card">
|
|
143
|
+
<h4>human-approved</h4>
|
|
144
|
+
<p>Requires explicit approval for sensitive actions. Best for production-like workflows.</p>
|
|
145
|
+
</article>
|
|
146
|
+
<article class="doc-card">
|
|
147
|
+
<h4>autonomous</h4>
|
|
148
|
+
<p>Runs actions continuously with fewer pauses. Best for rapid iteration and demos.</p>
|
|
149
|
+
</article>
|
|
150
|
+
</div>
|
|
151
|
+
|
|
152
|
+
<h3>Planner Options</h3>
|
|
153
|
+
<div class="docs-grid">
|
|
154
|
+
<article class="doc-card">
|
|
155
|
+
<h4>heuristic</h4>
|
|
156
|
+
<p>Zero-dependency regex-based planner. Works offline. Best for simple, predictable goals.</p>
|
|
157
|
+
</article>
|
|
158
|
+
<article class="doc-card">
|
|
159
|
+
<h4>webllm</h4>
|
|
160
|
+
<p>Delegates to a local WebLLM bridge (<code>window.__browserAgentWebLLM</code>). Fully private, no API calls.</p>
|
|
161
|
+
</article>
|
|
162
|
+
<article class="doc-card">
|
|
163
|
+
<h4>page-agent</h4>
|
|
164
|
+
<p>Delegates to an <a href="https://github.com/alibaba/page-agent" target="_blank" rel="noreferrer">alibaba/page-agent</a> bridge (<code>window.__browserAgentPageAgent</code>). Best for complex multi-step goals.</p>
|
|
165
|
+
</article>
|
|
166
|
+
</div>
|
|
167
|
+
|
|
168
|
+
<h3>Supported Actions</h3>
|
|
169
|
+
<table>
|
|
170
|
+
<thead>
|
|
171
|
+
<tr><th>Action</th><th>Description</th></tr>
|
|
172
|
+
</thead>
|
|
173
|
+
<tbody>
|
|
174
|
+
<tr><td><code>click</code></td><td>Click an element by CSS selector</td></tr>
|
|
175
|
+
<tr><td><code>type</code></td><td>Type text into an input or textarea</td></tr>
|
|
176
|
+
<tr><td><code>navigate</code></td><td>Navigate to a URL</td></tr>
|
|
177
|
+
<tr><td><code>extract</code></td><td>Extract text from an element</td></tr>
|
|
178
|
+
<tr><td><code>scroll</code></td><td>Scroll a container or the page</td></tr>
|
|
179
|
+
<tr><td><code>focus</code></td><td>Focus an element (useful for dropdowns)</td></tr>
|
|
180
|
+
<tr><td><code>wait</code></td><td>Pause for a given number of milliseconds</td></tr>
|
|
181
|
+
<tr><td><code>done</code></td><td>Signal task completion</td></tr>
|
|
182
|
+
</tbody>
|
|
183
|
+
</table>
|
|
184
|
+
|
|
185
|
+
<h3>Safety Notes</h3>
|
|
186
|
+
<ul>
|
|
187
|
+
<li>Prefer scoped selectors for deterministic action targeting.</li>
|
|
188
|
+
<li>Use <code>human-approved</code> mode for workflows that mutate critical data.</li>
|
|
189
|
+
<li>Log <code>onStep</code> output for auditability and debugging.</li>
|
|
190
|
+
</ul>
|
|
191
|
+
</div>
|
|
192
|
+
</div>
|
|
193
|
+
</section>
|
|
194
|
+
|
|
195
|
+
<!-- ARCHITECTURE -->
|
|
196
|
+
<section id="architecture" class="section">
|
|
197
|
+
<div class="wrap">
|
|
198
|
+
<div class="surface">
|
|
199
|
+
<h2>Architecture</h2>
|
|
200
|
+
<p>How OmniBrowser Agent is structured internally and how its components interact.</p>
|
|
201
|
+
|
|
202
|
+
<h3>Goals</h3>
|
|
203
|
+
<ul>
|
|
204
|
+
<li>Local-first runtime in browser</li>
|
|
205
|
+
<li>Privacy-first defaults</li>
|
|
206
|
+
<li>Open-source composable planner/executor contracts</li>
|
|
207
|
+
<li>Human-approved mode for risky actions</li>
|
|
208
|
+
</ul>
|
|
209
|
+
|
|
210
|
+
<h3>Runtime Components</h3>
|
|
211
|
+
<div class="docs-grid">
|
|
212
|
+
<article class="doc-card">
|
|
213
|
+
<h4>Popup UI</h4>
|
|
214
|
+
<p>Starts/stops sessions. Picks execution mode (<code>autonomous</code>, <code>human-approved</code>) and planner (<code>heuristic</code>, <code>webllm</code>, <code>page-agent</code>).</p>
|
|
215
|
+
</article>
|
|
216
|
+
<article class="doc-card">
|
|
217
|
+
<h4>Background Service Worker</h4>
|
|
218
|
+
<p>Session state machine per tab. Tick loop orchestration and approval handling.</p>
|
|
219
|
+
</article>
|
|
220
|
+
<article class="doc-card">
|
|
221
|
+
<h4>Content Agent</h4>
|
|
222
|
+
<p><strong>pageObserver</strong> — page snapshot extraction.<br>
|
|
223
|
+
<strong>planner</strong> — next-action decision.<br>
|
|
224
|
+
<strong>safety</strong> — risk gating.<br>
|
|
225
|
+
<strong>executor</strong> — DOM action execution.</p>
|
|
226
|
+
</article>
|
|
227
|
+
</div>
|
|
228
|
+
|
|
229
|
+
<h3>Action Contracts</h3>
|
|
230
|
+
<p>All components share a typed action protocol defined in <code>src/shared/contracts.ts</code>:</p>
|
|
231
|
+
<ul>
|
|
232
|
+
<li><code>click</code> — click element by CSS selector</li>
|
|
233
|
+
<li><code>type</code> — type text into input/textarea</li>
|
|
234
|
+
<li><code>navigate</code> — navigate to URL</li>
|
|
235
|
+
<li><code>extract</code> — extract text from element</li>
|
|
236
|
+
<li><code>scroll</code> — scroll container or page</li>
|
|
237
|
+
<li><code>focus</code> — focus an element</li>
|
|
238
|
+
<li><code>wait</code> — pause for N milliseconds</li>
|
|
239
|
+
<li><code>done</code> — signal task completion</li>
|
|
240
|
+
</ul>
|
|
241
|
+
|
|
242
|
+
<h3>Safety Model</h3>
|
|
243
|
+
<ul>
|
|
244
|
+
<li>Block invalid URL protocols</li>
|
|
245
|
+
<li>Review risky actions (submit/delete/pay-like selectors)</li>
|
|
246
|
+
<li>In <code>human-approved</code> mode, review-level actions require manual approval before execution</li>
|
|
247
|
+
</ul>
|
|
248
|
+
|
|
249
|
+
<h3>Planner Bridges</h3>
|
|
250
|
+
<p>
|
|
251
|
+
All planner bridges follow the same pattern — an object attached to <code>window</code>
|
|
252
|
+
that implements a <code>plan()</code> method returning an <code>AgentAction</code>.
|
|
253
|
+
The core library has <strong>zero runtime dependencies</strong>; bridge implementations are provided by the consumer.
|
|
254
|
+
</p>
|
|
255
|
+
|
|
256
|
+
<h4>WebLLM bridge</h4>
|
|
257
|
+
<pre><code>window.__browserAgentWebLLM = {
|
|
258
|
+
async plan(input, modelId) {
|
|
259
|
+
// call your local WebLLM engine and return one AgentAction
|
|
260
|
+
return { type: "done", reason: "result from model" };
|
|
261
|
+
}
|
|
262
|
+
};</code></pre>
|
|
263
|
+
|
|
264
|
+
<h4>page-agent bridge</h4>
|
|
265
|
+
<pre><code>import { PageAgent } from "page-agent";
|
|
266
|
+
|
|
267
|
+
const pa = new PageAgent({
|
|
268
|
+
baseURL: "https://api.openai.com/v1",
|
|
269
|
+
model: "gpt-4o",
|
|
270
|
+
apiKey: "sk-..."
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
window.__browserAgentPageAgent = {
|
|
274
|
+
async plan(input) {
|
|
275
|
+
const result = await pa.execute(input.goal);
|
|
276
|
+
return { type: "done", reason: result.data };
|
|
277
|
+
}
|
|
278
|
+
};</code></pre>
|
|
279
|
+
|
|
280
|
+
<h3>Current Limitations</h3>
|
|
281
|
+
<ul>
|
|
282
|
+
<li>No persistent long-term memory yet</li>
|
|
283
|
+
<li>No task DSL or skills registry yet</li>
|
|
284
|
+
<li>Risk scoring is a simple keyword heuristic</li>
|
|
285
|
+
<li>No robust selector healing yet</li>
|
|
286
|
+
</ul>
|
|
287
|
+
</div>
|
|
288
|
+
</div>
|
|
289
|
+
</section>
|
|
290
|
+
|
|
291
|
+
<!-- EMBEDDING -->
|
|
292
|
+
<section id="embedding" class="section">
|
|
293
|
+
<div class="wrap">
|
|
294
|
+
<div class="surface">
|
|
295
|
+
<h2>Embedding Guide</h2>
|
|
296
|
+
<p>How to embed OmniBrowser Agent as a library inside your own web application.</p>
|
|
297
|
+
|
|
298
|
+
<h3>Install</h3>
|
|
299
|
+
<pre><code>npm install @akshayram1/omnibrowser-agent</code></pre>
|
|
300
|
+
|
|
301
|
+
<h3>Basic Usage</h3>
|
|
302
|
+
<pre><code>import { createBrowserAgent } from "@akshayram1/omnibrowser-agent";
|
|
303
|
+
|
|
304
|
+
const agent = createBrowserAgent(
|
|
305
|
+
{
|
|
306
|
+
goal: "Search contact Jane Doe and open profile",
|
|
307
|
+
mode: "human-approved",
|
|
308
|
+
planner: { kind: "heuristic" },
|
|
309
|
+
maxSteps: 15,
|
|
310
|
+
stepDelayMs: 400
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
onStep: (result) => console.log("step", result),
|
|
314
|
+
onApprovalRequired: (action) => {
|
|
315
|
+
console.log("approval required", action);
|
|
316
|
+
// Show your own modal/button then call approvePendingAction()
|
|
317
|
+
},
|
|
318
|
+
onDone: (result) => console.log("done", result),
|
|
319
|
+
onError: (error) => console.error(error)
|
|
320
|
+
}
|
|
321
|
+
);
|
|
322
|
+
|
|
323
|
+
await agent.start();</code></pre>
|
|
324
|
+
|
|
325
|
+
<h3>Approve a Pending Action</h3>
|
|
326
|
+
<pre><code>await agent.approvePendingAction();</code></pre>
|
|
327
|
+
|
|
328
|
+
<h3>Stop Running Session</h3>
|
|
329
|
+
<pre><code>agent.stop();</code></pre>
|
|
330
|
+
|
|
331
|
+
<h3>WebLLM Mode</h3>
|
|
332
|
+
<p>To use planner mode <code>webllm</code>, provide a local bridge in your app:</p>
|
|
333
|
+
<pre><code>window.__browserAgentWebLLM = {
|
|
334
|
+
async plan(input, modelId) {
|
|
335
|
+
// call your local WebLLM engine and return one AgentAction JSON
|
|
336
|
+
return { type: "done", reason: `Implement bridge with model ${modelId ?? "default"}` };
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
// Then configure:
|
|
341
|
+
planner: { kind: "webllm", modelId: "Llama-3.2-1B-Instruct-q4f16_1-MLC" }</code></pre>
|
|
342
|
+
|
|
343
|
+
<h3>page-agent Mode</h3>
|
|
344
|
+
<p>
|
|
345
|
+
Install <a href="https://github.com/alibaba/page-agent" target="_blank" rel="noreferrer">page-agent</a>
|
|
346
|
+
and wire the bridge for complex multi-step goals:
|
|
347
|
+
</p>
|
|
348
|
+
<pre><code>npm install page-agent</code></pre>
|
|
349
|
+
<pre><code>import { PageAgent } from "page-agent";
|
|
350
|
+
|
|
351
|
+
const pa = new PageAgent({
|
|
352
|
+
baseURL: "https://api.openai.com/v1",
|
|
353
|
+
model: "gpt-4o",
|
|
354
|
+
apiKey: "sk-..."
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
window.__browserAgentPageAgent = {
|
|
358
|
+
async plan(input) {
|
|
359
|
+
const result = await pa.execute(input.goal);
|
|
360
|
+
return { type: "done", reason: result.data };
|
|
361
|
+
}
|
|
362
|
+
};
|
|
363
|
+
|
|
364
|
+
// Then configure:
|
|
365
|
+
planner: { kind: "page-agent" }</code></pre>
|
|
366
|
+
|
|
367
|
+
<h3>Notes</h3>
|
|
368
|
+
<ul>
|
|
369
|
+
<li>For production, mount this inside an authenticated app shell and add your own permission checks.</li>
|
|
370
|
+
<li><code>human-approved</code> mode is recommended for CRM, finance, and admin actions.</li>
|
|
371
|
+
<li><code>page-agent</code> is not bundled — it must be installed separately by the consumer.</li>
|
|
372
|
+
</ul>
|
|
373
|
+
</div>
|
|
374
|
+
</div>
|
|
375
|
+
</section>
|
|
376
|
+
|
|
377
|
+
<!-- ROADMAP -->
|
|
378
|
+
<section id="roadmap" class="section">
|
|
379
|
+
<div class="wrap">
|
|
380
|
+
<div class="surface">
|
|
381
|
+
<h2>Roadmap</h2>
|
|
382
|
+
|
|
383
|
+
<h3>v0.1</h3>
|
|
384
|
+
<ul>
|
|
385
|
+
<li>Extension runtime loop</li>
|
|
386
|
+
<li>Shared action contracts</li>
|
|
387
|
+
<li>Heuristic + WebLLM planner switch</li>
|
|
388
|
+
<li>Human-approved mode</li>
|
|
389
|
+
</ul>
|
|
390
|
+
|
|
391
|
+
<h3>v0.2 <span class="badge">current</span></h3>
|
|
392
|
+
<ul>
|
|
393
|
+
<li>New actions: <code>scroll</code>, <code>focus</code></li>
|
|
394
|
+
<li>Improved heuristic planner with regex goal patterns</li>
|
|
395
|
+
<li>Better page observation (visibility filtering, placeholder capture, up to 60 candidates)</li>
|
|
396
|
+
<li>Library API: <code>resume()</code>, <code>isRunning</code>, <code>hasPendingAction</code>, <code>AbortSignal</code>, <code>onMaxStepsReached</code></li>
|
|
397
|
+
<li><strong>page-agent planner bridge</strong> (<code>window.__browserAgentPageAgent</code>)</li>
|
|
398
|
+
</ul>
|
|
399
|
+
|
|
400
|
+
<h3>v0.3</h3>
|
|
401
|
+
<ul>
|
|
402
|
+
<li>Site profile and policy engine (allowlist, blocked domains)</li>
|
|
403
|
+
<li>Selector healing and fallback strategy</li>
|
|
404
|
+
<li>Session memory and action replay log</li>
|
|
405
|
+
<li>Drupal CRM starter skills</li>
|
|
406
|
+
</ul>
|
|
407
|
+
|
|
408
|
+
<h3>v1.0</h3>
|
|
409
|
+
<ul>
|
|
410
|
+
<li>Long-term encrypted memory in IndexedDB</li>
|
|
411
|
+
<li>Goal decomposition planner (multi-step task graphs)</li>
|
|
412
|
+
<li>Multi-tab workflows</li>
|
|
413
|
+
<li>Stable plugin API for site skills</li>
|
|
414
|
+
<li>Validation/eval harness with benchmark tasks</li>
|
|
415
|
+
<li>Cross-browser packaging (Chromium + Firefox)</li>
|
|
416
|
+
</ul>
|
|
417
|
+
</div>
|
|
418
|
+
</div>
|
|
419
|
+
</section>
|
|
420
|
+
|
|
421
|
+
<!-- CONTACT -->
|
|
422
|
+
<section id="contact" class="section">
|
|
423
|
+
<div class="wrap">
|
|
424
|
+
<div class="surface">
|
|
425
|
+
<h2>Contact</h2>
|
|
426
|
+
<p>Maintainer: Akshay Chame</p>
|
|
427
|
+
<ul>
|
|
428
|
+
<li>
|
|
429
|
+
Email:
|
|
430
|
+
<a href="mailto:akshaychame2@gmail.com">akshaychame2@gmail.com</a>
|
|
431
|
+
</li>
|
|
432
|
+
<li>
|
|
433
|
+
GitHub:
|
|
434
|
+
<a href="https://github.com/akshayram1" target="_blank" rel="noreferrer">@akshayram1</a>
|
|
435
|
+
</li>
|
|
436
|
+
<li>
|
|
437
|
+
Package:
|
|
438
|
+
<a
|
|
439
|
+
href="https://www.npmjs.com/package/@akshayram1/omnibrowser-agent"
|
|
440
|
+
target="_blank"
|
|
441
|
+
rel="noreferrer"
|
|
442
|
+
>@akshayram1/omnibrowser-agent</a
|
|
443
|
+
>
|
|
444
|
+
</li>
|
|
445
|
+
</ul>
|
|
446
|
+
<p class="contact-note">
|
|
447
|
+
For feature requests or bugs, please open an issue on GitHub with reproduction steps.
|
|
448
|
+
</p>
|
|
449
|
+
</div>
|
|
450
|
+
</div>
|
|
451
|
+
</section>
|
|
452
|
+
</main>
|
|
453
|
+
|
|
454
|
+
<footer class="footer">
|
|
455
|
+
<div class="wrap">
|
|
456
|
+
<p>© 2026 OmniBrowser Agent · MIT License</p>
|
|
457
|
+
</div>
|
|
458
|
+
</footer>
|
|
459
|
+
</body>
|
|
460
|
+
</html>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@akshayram1/omnibrowser-agent",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/lib.js",
|
|
@@ -19,11 +19,12 @@
|
|
|
19
19
|
"build": "node scripts/build.mjs && npm run build:types",
|
|
20
20
|
"build:types": "tsc -p tsconfig.lib.json",
|
|
21
21
|
"watch": "node scripts/build.mjs --watch",
|
|
22
|
-
"typecheck": "tsc --noEmit"
|
|
22
|
+
"typecheck": "tsc --noEmit && tsc -p tsconfig.test.json --noEmit",
|
|
23
|
+
"test": "node --experimental-strip-types --test src/shared/safety.test.ts src/core/planner.test.ts"
|
|
23
24
|
},
|
|
24
|
-
"dependencies": {},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@types/chrome": "^0.0.322",
|
|
27
|
+
"@types/node": "^25.5.0",
|
|
27
28
|
"esbuild": "^0.25.2",
|
|
28
29
|
"typescript": "^5.8.2"
|
|
29
30
|
}
|