@monoes/monomindcli 1.10.28 → 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.
Files changed (87) hide show
  1. package/.claude/helpers/auto-memory-hook.mjs +39 -4
  2. package/.claude/helpers/handlers/edit-handler.cjs +145 -0
  3. package/.claude/helpers/handlers/route-handler.cjs +393 -0
  4. package/.claude/helpers/handlers/session-handler.cjs +167 -0
  5. package/.claude/helpers/handlers/session-restore-handler.cjs +343 -0
  6. package/.claude/helpers/handlers/task-handler.cjs +329 -0
  7. package/.claude/helpers/hook-handler.cjs +114 -2247
  8. package/.claude/helpers/intelligence.cjs +21 -2
  9. package/.claude/helpers/learning-service.mjs +166 -8
  10. package/.claude/helpers/memory-palace.cjs +72 -12
  11. package/.claude/helpers/router.cjs +79 -5
  12. package/.claude/helpers/statusline.cjs +193 -399
  13. package/.claude/helpers/utils/micro-agents.cjs +338 -0
  14. package/.claude/helpers/utils/monograph.cjs +349 -0
  15. package/.claude/helpers/utils/telemetry.cjs +144 -0
  16. package/.claude/skills/agent-browser-testing/SKILL.md +3 -2
  17. package/.claude/skills/monomind/browse-agentcore.md +116 -0
  18. package/.claude/skills/monomind/browse-electron.md +189 -0
  19. package/.claude/skills/monomind/browse-qa.md +229 -0
  20. package/.claude/skills/monomind/browse-references/authentication.md +162 -0
  21. package/.claude/skills/monomind/browse-references/trust-boundaries.md +41 -0
  22. package/.claude/skills/monomind/browse-references/video-recording.md +84 -0
  23. package/.claude/skills/monomind/browse-slack.md +189 -0
  24. package/.claude/skills/monomind/browse-vercel.md +240 -0
  25. package/.claude/skills/monomind/browse.md +724 -0
  26. package/dist/src/browser/actions.d.ts +13 -0
  27. package/dist/src/browser/actions.d.ts.map +1 -0
  28. package/dist/src/browser/actions.js +201 -0
  29. package/dist/src/browser/actions.js.map +1 -0
  30. package/dist/src/browser/browser.d.ts +14 -0
  31. package/dist/src/browser/browser.d.ts.map +1 -0
  32. package/dist/src/browser/browser.js +198 -0
  33. package/dist/src/browser/browser.js.map +1 -0
  34. package/dist/src/browser/cdp.d.ts +17 -0
  35. package/dist/src/browser/cdp.d.ts.map +1 -0
  36. package/dist/src/browser/cdp.js +106 -0
  37. package/dist/src/browser/cdp.js.map +1 -0
  38. package/dist/src/browser/index.d.ts +11 -0
  39. package/dist/src/browser/index.d.ts.map +1 -0
  40. package/dist/src/browser/index.js +11 -0
  41. package/dist/src/browser/index.js.map +1 -0
  42. package/dist/src/browser/network.d.ts +11 -0
  43. package/dist/src/browser/network.d.ts.map +1 -0
  44. package/dist/src/browser/network.js +81 -0
  45. package/dist/src/browser/network.js.map +1 -0
  46. package/dist/src/browser/screenshot.d.ts +15 -0
  47. package/dist/src/browser/screenshot.d.ts.map +1 -0
  48. package/dist/src/browser/screenshot.js +36 -0
  49. package/dist/src/browser/screenshot.js.map +1 -0
  50. package/dist/src/browser/session.d.ts +8 -0
  51. package/dist/src/browser/session.d.ts.map +1 -0
  52. package/dist/src/browser/session.js +50 -0
  53. package/dist/src/browser/session.js.map +1 -0
  54. package/dist/src/browser/snapshot.d.ts +12 -0
  55. package/dist/src/browser/snapshot.d.ts.map +1 -0
  56. package/dist/src/browser/snapshot.js +147 -0
  57. package/dist/src/browser/snapshot.js.map +1 -0
  58. package/dist/src/browser/tabs.d.ts +8 -0
  59. package/dist/src/browser/tabs.d.ts.map +1 -0
  60. package/dist/src/browser/tabs.js +25 -0
  61. package/dist/src/browser/tabs.js.map +1 -0
  62. package/dist/src/browser/types.d.ts +109 -0
  63. package/dist/src/browser/types.d.ts.map +1 -0
  64. package/dist/src/browser/types.js +16 -0
  65. package/dist/src/browser/types.js.map +1 -0
  66. package/dist/src/browser/wait.d.ts +4 -0
  67. package/dist/src/browser/wait.d.ts.map +1 -0
  68. package/dist/src/browser/wait.js +122 -0
  69. package/dist/src/browser/wait.js.map +1 -0
  70. package/dist/src/commands/browse.d.ts +8 -0
  71. package/dist/src/commands/browse.d.ts.map +1 -0
  72. package/dist/src/commands/browse.js +573 -0
  73. package/dist/src/commands/browse.js.map +1 -0
  74. package/dist/src/commands/index.d.ts.map +1 -1
  75. package/dist/src/commands/index.js +2 -0
  76. package/dist/src/commands/index.js.map +1 -1
  77. package/dist/src/commands/init.d.ts.map +1 -1
  78. package/dist/src/commands/init.js +25 -1
  79. package/dist/src/commands/init.js.map +1 -1
  80. package/dist/src/init/executor.d.ts.map +1 -1
  81. package/dist/src/init/executor.js +27 -0
  82. package/dist/src/init/executor.js.map +1 -1
  83. package/dist/src/ui/dashboard-v2.html +1692 -0
  84. package/dist/src/ui/server.mjs +15 -1
  85. package/dist/tsconfig.tsbuildinfo +1 -1
  86. package/package.json +2 -1
  87. package/scripts/understand-analyze.mjs +14 -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 |