@monoes/monomindcli 1.10.29 → 1.10.30
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/.claude/helpers/auto-memory-hook.mjs +39 -4
- package/.claude/helpers/handlers/edit-handler.cjs +145 -0
- package/.claude/helpers/handlers/route-handler.cjs +393 -0
- package/.claude/helpers/handlers/session-handler.cjs +167 -0
- package/.claude/helpers/handlers/session-restore-handler.cjs +343 -0
- package/.claude/helpers/handlers/task-handler.cjs +329 -0
- package/.claude/helpers/hook-handler.cjs +114 -2273
- package/.claude/helpers/intelligence.cjs +21 -2
- package/.claude/helpers/learning-service.mjs +166 -8
- package/.claude/helpers/memory-palace.cjs +72 -12
- package/.claude/helpers/router.cjs +79 -5
- package/.claude/helpers/statusline.cjs +193 -399
- package/.claude/helpers/utils/micro-agents.cjs +338 -0
- package/.claude/helpers/utils/monograph.cjs +349 -0
- package/.claude/helpers/utils/telemetry.cjs +144 -0
- package/.claude/skills/agent-browser-testing/SKILL.md +3 -2
- package/.claude/skills/monomind/browse-agentcore.md +116 -0
- package/.claude/skills/monomind/browse-electron.md +189 -0
- package/.claude/skills/monomind/browse-qa.md +229 -0
- package/.claude/skills/monomind/browse-references/authentication.md +162 -0
- package/.claude/skills/monomind/browse-references/trust-boundaries.md +41 -0
- package/.claude/skills/monomind/browse-references/video-recording.md +84 -0
- package/.claude/skills/monomind/browse-slack.md +189 -0
- package/.claude/skills/monomind/browse-vercel.md +240 -0
- package/.claude/skills/monomind/browse.md +724 -0
- package/dist/src/browser/actions.d.ts +13 -0
- package/dist/src/browser/actions.d.ts.map +1 -0
- package/dist/src/browser/actions.js +201 -0
- package/dist/src/browser/actions.js.map +1 -0
- package/dist/src/browser/browser.d.ts +14 -0
- package/dist/src/browser/browser.d.ts.map +1 -0
- package/dist/src/browser/browser.js +198 -0
- package/dist/src/browser/browser.js.map +1 -0
- package/dist/src/browser/cdp.d.ts +17 -0
- package/dist/src/browser/cdp.d.ts.map +1 -0
- package/dist/src/browser/cdp.js +106 -0
- package/dist/src/browser/cdp.js.map +1 -0
- package/dist/src/browser/index.d.ts +11 -0
- package/dist/src/browser/index.d.ts.map +1 -0
- package/dist/src/browser/index.js +11 -0
- package/dist/src/browser/index.js.map +1 -0
- package/dist/src/browser/network.d.ts +11 -0
- package/dist/src/browser/network.d.ts.map +1 -0
- package/dist/src/browser/network.js +81 -0
- package/dist/src/browser/network.js.map +1 -0
- package/dist/src/browser/screenshot.d.ts +15 -0
- package/dist/src/browser/screenshot.d.ts.map +1 -0
- package/dist/src/browser/screenshot.js +36 -0
- package/dist/src/browser/screenshot.js.map +1 -0
- package/dist/src/browser/session.d.ts +8 -0
- package/dist/src/browser/session.d.ts.map +1 -0
- package/dist/src/browser/session.js +50 -0
- package/dist/src/browser/session.js.map +1 -0
- package/dist/src/browser/snapshot.d.ts +12 -0
- package/dist/src/browser/snapshot.d.ts.map +1 -0
- package/dist/src/browser/snapshot.js +147 -0
- package/dist/src/browser/snapshot.js.map +1 -0
- package/dist/src/browser/tabs.d.ts +8 -0
- package/dist/src/browser/tabs.d.ts.map +1 -0
- package/dist/src/browser/tabs.js +25 -0
- package/dist/src/browser/tabs.js.map +1 -0
- package/dist/src/browser/types.d.ts +109 -0
- package/dist/src/browser/types.d.ts.map +1 -0
- package/dist/src/browser/types.js +16 -0
- package/dist/src/browser/types.js.map +1 -0
- package/dist/src/browser/wait.d.ts +4 -0
- package/dist/src/browser/wait.d.ts.map +1 -0
- package/dist/src/browser/wait.js +122 -0
- package/dist/src/browser/wait.js.map +1 -0
- package/dist/src/commands/browse.d.ts +8 -0
- package/dist/src/commands/browse.d.ts.map +1 -0
- package/dist/src/commands/browse.js +573 -0
- package/dist/src/commands/browse.js.map +1 -0
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +2 -0
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/ui/dashboard-v2.html +1692 -0
- package/dist/src/ui/server.mjs +15 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: monomind:browse-vercel
|
|
3
|
+
description: Run browser automation inside Vercel Sandbox microVMs for browser tasks from any Vercel-deployed app. Use when the user needs headless browser automation in a Vercel app (Next.js, SvelteKit, Nuxt, Remix, Astro), wants ephemeral isolated browser environments, or needs to run Chrome in a serverless context. Triggers include "browser automation on Vercel", "headless Chrome on Vercel", "Vercel sandbox browser", or "microVM Chrome".
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
triggers:
|
|
6
|
+
- browser on vercel
|
|
7
|
+
- vercel sandbox browser
|
|
8
|
+
- headless chrome vercel
|
|
9
|
+
- browser automation serverless
|
|
10
|
+
- nextjs browser automation
|
|
11
|
+
- microvm chrome
|
|
12
|
+
tools:
|
|
13
|
+
- Bash
|
|
14
|
+
requires:
|
|
15
|
+
- agent-browser >= 0.25.4
|
|
16
|
+
- "@vercel/sandbox"
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
<!-- Pattern adapted from agent-browser — rebranded for monomind -->
|
|
20
|
+
|
|
21
|
+
# Vercel Sandbox Browser Automation (monomind:browse-vercel)
|
|
22
|
+
|
|
23
|
+
Run agent-browser + headless Chrome inside ephemeral Vercel Sandbox microVMs. A Linux VM spins up on demand, executes browser commands, and shuts down. Works with Next.js, SvelteKit, Nuxt, Remix, Astro, and any Vercel-deployed framework.
|
|
24
|
+
|
|
25
|
+
See `monomind:browse` for the full browser automation reference.
|
|
26
|
+
|
|
27
|
+
## Install
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
pnpm add @vercel/sandbox
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Core Pattern
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
import { Sandbox } from "@vercel/sandbox";
|
|
37
|
+
|
|
38
|
+
// System libraries required by Chromium on the sandbox VM (Amazon Linux / dnf)
|
|
39
|
+
const CHROMIUM_SYSTEM_DEPS = [
|
|
40
|
+
"nss", "nspr", "libxkbcommon", "atk", "at-spi2-atk", "at-spi2-core",
|
|
41
|
+
"libXcomposite", "libXdamage", "libXrandr", "libXfixes", "libXcursor",
|
|
42
|
+
"libXi", "libXtst", "libXScrnSaver", "libXext", "mesa-libgbm", "libdrm",
|
|
43
|
+
"mesa-libGL", "mesa-libEGL", "cups-libs", "alsa-lib", "pango", "cairo",
|
|
44
|
+
"gtk3", "dbus-libs",
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
function getSandboxCredentials() {
|
|
48
|
+
if (
|
|
49
|
+
process.env.VERCEL_TOKEN &&
|
|
50
|
+
process.env.VERCEL_TEAM_ID &&
|
|
51
|
+
process.env.VERCEL_PROJECT_ID
|
|
52
|
+
) {
|
|
53
|
+
return {
|
|
54
|
+
token: process.env.VERCEL_TOKEN,
|
|
55
|
+
teamId: process.env.VERCEL_TEAM_ID,
|
|
56
|
+
projectId: process.env.VERCEL_PROJECT_ID,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return {};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function withBrowser<T>(
|
|
63
|
+
fn: (sandbox: InstanceType<typeof Sandbox>) => Promise<T>,
|
|
64
|
+
): Promise<T> {
|
|
65
|
+
const snapshotId = process.env.AGENT_BROWSER_SNAPSHOT_ID;
|
|
66
|
+
const credentials = getSandboxCredentials();
|
|
67
|
+
|
|
68
|
+
const sandbox = snapshotId
|
|
69
|
+
? await Sandbox.create({
|
|
70
|
+
...credentials,
|
|
71
|
+
source: { type: "snapshot", snapshotId },
|
|
72
|
+
timeout: 120_000,
|
|
73
|
+
})
|
|
74
|
+
: await Sandbox.create({ ...credentials, runtime: "node24", timeout: 120_000 });
|
|
75
|
+
|
|
76
|
+
if (!snapshotId) {
|
|
77
|
+
await sandbox.runCommand("sh", [
|
|
78
|
+
"-c",
|
|
79
|
+
`sudo dnf clean all 2>&1 && sudo dnf install -y --skip-broken ${CHROMIUM_SYSTEM_DEPS.join(" ")} 2>&1 && sudo ldconfig 2>&1`,
|
|
80
|
+
]);
|
|
81
|
+
await sandbox.runCommand("npm", ["install", "-g", "agent-browser"]);
|
|
82
|
+
await sandbox.runCommand("npx", ["agent-browser", "install"]);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
try {
|
|
86
|
+
return await fn(sandbox);
|
|
87
|
+
} finally {
|
|
88
|
+
await sandbox.stop();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Screenshot
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
export async function screenshotUrl(url: string) {
|
|
97
|
+
return withBrowser(async (sandbox) => {
|
|
98
|
+
await sandbox.runCommand("agent-browser", ["open", url]);
|
|
99
|
+
|
|
100
|
+
const titleResult = await sandbox.runCommand("agent-browser", [
|
|
101
|
+
"get", "title", "--json",
|
|
102
|
+
]);
|
|
103
|
+
const title = JSON.parse(await titleResult.stdout())?.data?.title || url;
|
|
104
|
+
|
|
105
|
+
const ssResult = await sandbox.runCommand("agent-browser", [
|
|
106
|
+
"screenshot", "--json",
|
|
107
|
+
]);
|
|
108
|
+
const ssPath = JSON.parse(await ssResult.stdout())?.data?.path;
|
|
109
|
+
const b64Result = await sandbox.runCommand("base64", ["-w", "0", ssPath]);
|
|
110
|
+
const screenshot = (await b64Result.stdout()).trim();
|
|
111
|
+
|
|
112
|
+
await sandbox.runCommand("agent-browser", ["close"]);
|
|
113
|
+
return { title, screenshot };
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Accessibility Snapshot
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
export async function snapshotUrl(url: string) {
|
|
122
|
+
return withBrowser(async (sandbox) => {
|
|
123
|
+
await sandbox.runCommand("agent-browser", ["open", url]);
|
|
124
|
+
|
|
125
|
+
const titleResult = await sandbox.runCommand("agent-browser", [
|
|
126
|
+
"get", "title", "--json",
|
|
127
|
+
]);
|
|
128
|
+
const title = JSON.parse(await titleResult.stdout())?.data?.title || url;
|
|
129
|
+
|
|
130
|
+
const snapResult = await sandbox.runCommand("agent-browser", [
|
|
131
|
+
"snapshot", "-i", "-c",
|
|
132
|
+
]);
|
|
133
|
+
const snapshot = await snapResult.stdout();
|
|
134
|
+
|
|
135
|
+
await sandbox.runCommand("agent-browser", ["close"]);
|
|
136
|
+
return { title, snapshot };
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Multi-Step Workflow
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
export async function fillAndSubmitForm(url: string, data: Record<string, string>) {
|
|
145
|
+
return withBrowser(async (sandbox) => {
|
|
146
|
+
await sandbox.runCommand("agent-browser", ["open", url]);
|
|
147
|
+
|
|
148
|
+
const snapResult = await sandbox.runCommand("agent-browser", ["snapshot", "-i"]);
|
|
149
|
+
const snapshot = await snapResult.stdout();
|
|
150
|
+
// Parse snapshot to identify refs...
|
|
151
|
+
|
|
152
|
+
for (const [ref, value] of Object.entries(data)) {
|
|
153
|
+
await sandbox.runCommand("agent-browser", ["fill", ref, value]);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
await sandbox.runCommand("agent-browser", ["click", "@e5"]);
|
|
157
|
+
await sandbox.runCommand("agent-browser", ["wait", "--load", "networkidle"]);
|
|
158
|
+
|
|
159
|
+
const ssResult = await sandbox.runCommand("agent-browser", ["screenshot", "--json"]);
|
|
160
|
+
const ssPath = JSON.parse(await ssResult.stdout())?.data?.path;
|
|
161
|
+
const b64Result = await sandbox.runCommand("base64", ["-w", "0", ssPath]);
|
|
162
|
+
const screenshot = (await b64Result.stdout()).trim();
|
|
163
|
+
|
|
164
|
+
await sandbox.runCommand("agent-browser", ["close"]);
|
|
165
|
+
return { screenshot };
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Sandbox Snapshots (Sub-Second Startup)
|
|
171
|
+
|
|
172
|
+
A sandbox snapshot pre-installs system deps + agent-browser + Chromium so each run boots in under 1 second instead of ~30s.
|
|
173
|
+
|
|
174
|
+
> Note: "sandbox snapshot" is a Vercel infrastructure concept (like a Docker image). It is NOT the same as `agent-browser snapshot` (accessibility tree dump).
|
|
175
|
+
|
|
176
|
+
### Create a snapshot (run once)
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
import { Sandbox } from "@vercel/sandbox";
|
|
180
|
+
|
|
181
|
+
async function createSnapshot(): Promise<string> {
|
|
182
|
+
const sandbox = await Sandbox.create({ runtime: "node24", timeout: 300_000 });
|
|
183
|
+
|
|
184
|
+
await sandbox.runCommand("sh", [
|
|
185
|
+
"-c",
|
|
186
|
+
`sudo dnf clean all 2>&1 && sudo dnf install -y --skip-broken ${CHROMIUM_SYSTEM_DEPS.join(" ")} 2>&1 && sudo ldconfig 2>&1`,
|
|
187
|
+
]);
|
|
188
|
+
await sandbox.runCommand("npm", ["install", "-g", "agent-browser"]);
|
|
189
|
+
await sandbox.runCommand("npx", ["agent-browser", "install"]);
|
|
190
|
+
|
|
191
|
+
const snapshot = await sandbox.snapshot();
|
|
192
|
+
return snapshot.snapshotId;
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Then set the environment variable for future runs:
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
AGENT_BROWSER_SNAPSHOT_ID=snap_xxxxxxxxxxxx
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## Scheduled Tasks (Cron)
|
|
203
|
+
|
|
204
|
+
```typescript
|
|
205
|
+
// app/api/cron/route.ts (Next.js example)
|
|
206
|
+
export async function GET() {
|
|
207
|
+
const result = await withBrowser(async (sandbox) => {
|
|
208
|
+
await sandbox.runCommand("agent-browser", ["open", "https://example.com/pricing"]);
|
|
209
|
+
const snap = await sandbox.runCommand("agent-browser", ["snapshot", "-i", "-c"]);
|
|
210
|
+
await sandbox.runCommand("agent-browser", ["close"]);
|
|
211
|
+
return await snap.stdout();
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
return Response.json({ ok: true, snapshot: result });
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
```json
|
|
219
|
+
// vercel.json
|
|
220
|
+
{ "crons": [{ "path": "/api/cron", "schedule": "0 9 * * *" }] }
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
## Environment Variables
|
|
224
|
+
|
|
225
|
+
| Variable | Required | Description |
|
|
226
|
+
|---|---|---|
|
|
227
|
+
| `AGENT_BROWSER_SNAPSHOT_ID` | No (but recommended) | Pre-built sandbox snapshot ID for sub-second startup |
|
|
228
|
+
| `VERCEL_TOKEN` | No | Personal access token (for local dev; OIDC is automatic on Vercel) |
|
|
229
|
+
| `VERCEL_TEAM_ID` | No | Vercel team ID (for local dev) |
|
|
230
|
+
| `VERCEL_PROJECT_ID` | No | Vercel project ID (for local dev) |
|
|
231
|
+
|
|
232
|
+
## Framework Placement
|
|
233
|
+
|
|
234
|
+
| Framework | Where to put server-side code |
|
|
235
|
+
|---|---|
|
|
236
|
+
| Next.js | Server actions, API routes, route handlers |
|
|
237
|
+
| SvelteKit | `+page.server.ts`, `+server.ts` |
|
|
238
|
+
| Nuxt | `server/api/`, `server/routes/` |
|
|
239
|
+
| Remix | `loader`, `action` functions |
|
|
240
|
+
| Astro | `.astro` frontmatter, API routes |
|