imperium-crawl 1.5.3 → 2.0.0

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 (81) hide show
  1. package/README.md +40 -32
  2. package/dist/constants.d.ts +2 -1
  3. package/dist/constants.d.ts.map +1 -1
  4. package/dist/constants.js +3 -1
  5. package/dist/constants.js.map +1 -1
  6. package/dist/network/interceptor.d.ts +19 -0
  7. package/dist/network/interceptor.d.ts.map +1 -0
  8. package/dist/network/interceptor.js +82 -0
  9. package/dist/network/interceptor.js.map +1 -0
  10. package/dist/network/types.d.ts +27 -0
  11. package/dist/network/types.d.ts.map +1 -0
  12. package/dist/network/types.js +2 -0
  13. package/dist/network/types.js.map +1 -0
  14. package/dist/security/action-policy.d.ts +26 -0
  15. package/dist/security/action-policy.d.ts.map +1 -0
  16. package/dist/security/action-policy.js +136 -0
  17. package/dist/security/action-policy.js.map +1 -0
  18. package/dist/security/auth-vault.d.ts +49 -0
  19. package/dist/security/auth-vault.d.ts.map +1 -0
  20. package/dist/security/auth-vault.js +133 -0
  21. package/dist/security/auth-vault.js.map +1 -0
  22. package/dist/security/domain-filter.d.ts +19 -0
  23. package/dist/security/domain-filter.d.ts.map +1 -0
  24. package/dist/security/domain-filter.js +114 -0
  25. package/dist/security/domain-filter.js.map +1 -0
  26. package/dist/security/types.d.ts +19 -0
  27. package/dist/security/types.d.ts.map +1 -0
  28. package/dist/security/types.js +2 -0
  29. package/dist/security/types.js.map +1 -0
  30. package/dist/sessions/encryption.d.ts +37 -0
  31. package/dist/sessions/encryption.d.ts.map +1 -0
  32. package/dist/sessions/encryption.js +108 -0
  33. package/dist/sessions/encryption.js.map +1 -0
  34. package/dist/sessions/index.d.ts +1 -0
  35. package/dist/sessions/index.d.ts.map +1 -1
  36. package/dist/sessions/index.js +1 -0
  37. package/dist/sessions/index.js.map +1 -1
  38. package/dist/sessions/manager.d.ts +3 -0
  39. package/dist/sessions/manager.d.ts.map +1 -1
  40. package/dist/sessions/manager.js +28 -2
  41. package/dist/sessions/manager.js.map +1 -1
  42. package/dist/snapshot/annotator.d.ts +21 -0
  43. package/dist/snapshot/annotator.d.ts.map +1 -0
  44. package/dist/snapshot/annotator.js +152 -0
  45. package/dist/snapshot/annotator.js.map +1 -0
  46. package/dist/snapshot/boundary.d.ts +7 -0
  47. package/dist/snapshot/boundary.d.ts.map +1 -0
  48. package/dist/snapshot/boundary.js +12 -0
  49. package/dist/snapshot/boundary.js.map +1 -0
  50. package/dist/snapshot/differ.d.ts +40 -0
  51. package/dist/snapshot/differ.d.ts.map +1 -0
  52. package/dist/snapshot/differ.js +194 -0
  53. package/dist/snapshot/differ.js.map +1 -0
  54. package/dist/snapshot/extractor.d.ts +27 -0
  55. package/dist/snapshot/extractor.d.ts.map +1 -0
  56. package/dist/snapshot/extractor.js +265 -0
  57. package/dist/snapshot/extractor.js.map +1 -0
  58. package/dist/snapshot/index.d.ts +8 -0
  59. package/dist/snapshot/index.d.ts.map +1 -0
  60. package/dist/snapshot/index.js +6 -0
  61. package/dist/snapshot/index.js.map +1 -0
  62. package/dist/snapshot/store.d.ts +28 -0
  63. package/dist/snapshot/store.d.ts.map +1 -0
  64. package/dist/snapshot/store.js +65 -0
  65. package/dist/snapshot/store.js.map +1 -0
  66. package/dist/snapshot/types.d.ts +42 -0
  67. package/dist/snapshot/types.d.ts.map +1 -0
  68. package/dist/snapshot/types.js +2 -0
  69. package/dist/snapshot/types.js.map +1 -0
  70. package/dist/tools/index.d.ts.map +1 -1
  71. package/dist/tools/index.js +2 -0
  72. package/dist/tools/index.js.map +1 -1
  73. package/dist/tools/interact.d.ts +194 -5
  74. package/dist/tools/interact.d.ts.map +1 -1
  75. package/dist/tools/interact.js +355 -20
  76. package/dist/tools/interact.js.map +1 -1
  77. package/dist/tools/snapshot.d.ts +53 -0
  78. package/dist/tools/snapshot.d.ts.map +1 -0
  79. package/dist/tools/snapshot.js +160 -0
  80. package/dist/tools/snapshot.js.map +1 -0
  81. package/package.json +1 -1
@@ -0,0 +1,160 @@
1
+ import { z } from "zod";
2
+ import { isPlaywrightAvailable } from "../stealth/browser.js";
3
+ import { acquirePage } from "../stealth/chrome-profile.js";
4
+ import { resolveProxy } from "../stealth/proxy.js";
5
+ import { normalizeUrl } from "../utils/url.js";
6
+ import { getSessionManager } from "../sessions/index.js";
7
+ import { getEnhancedSnapshot, getSnapshotStore, annotateScreenshot } from "../snapshot/index.js";
8
+ import { installDomainFilter } from "../security/domain-filter.js";
9
+ import { MAX_URL_LENGTH, MAX_TIMEOUT_MS } from "../constants.js";
10
+ export const name = "snapshot";
11
+ export const description = "Take an ARIA-based accessibility snapshot of a web page. Returns a structured tree with interactive element refs (e.g. [ref=e1]) that can be used in the interact tool for precise element targeting. Workflow: snapshot → analyze refs → interact with ref targeting → snapshot again to verify.";
12
+ export const schema = z.object({
13
+ url: z.string().max(MAX_URL_LENGTH).describe("URL to snapshot"),
14
+ session_id: z
15
+ .string()
16
+ .max(200)
17
+ .optional()
18
+ .describe("Session ID to restore cookies and store refs. Also used as snapshot key for ref resolution."),
19
+ interactive: z
20
+ .boolean()
21
+ .default(true)
22
+ .describe("Only include interactive elements (buttons, links, inputs). Set false for full page content. (default: true)"),
23
+ cursor: z
24
+ .boolean()
25
+ .default(false)
26
+ .describe("Detect cursor:pointer/onclick elements without ARIA roles (default: false)"),
27
+ compact: z
28
+ .boolean()
29
+ .default(true)
30
+ .describe("Filter structural elements without refs for a cleaner tree (default: true)"),
31
+ scope_selector: z
32
+ .string()
33
+ .max(500)
34
+ .optional()
35
+ .describe("CSS selector to scope snapshot to a subtree (e.g. '#main-content', '.sidebar')"),
36
+ return_screenshot: z
37
+ .boolean()
38
+ .default(false)
39
+ .describe("Include a screenshot of the page"),
40
+ annotate: z
41
+ .boolean()
42
+ .default(false)
43
+ .describe("Overlay numbered badges on interactive elements in the screenshot. Requires return_screenshot: true."),
44
+ chrome_profile: z
45
+ .string()
46
+ .max(1000)
47
+ .optional()
48
+ .describe("Path to Chrome user data directory. Overrides CHROME_PROFILE_PATH env var."),
49
+ proxy: z
50
+ .string()
51
+ .max(MAX_URL_LENGTH)
52
+ .optional()
53
+ .describe("Proxy URL. Overrides PROXY_URL env var."),
54
+ timeout: z
55
+ .number()
56
+ .min(1000)
57
+ .max(MAX_TIMEOUT_MS)
58
+ .default(30000)
59
+ .describe("Navigation timeout in ms (default: 30000)"),
60
+ allowed_domains: z
61
+ .array(z.string().max(500))
62
+ .max(100)
63
+ .optional()
64
+ .describe("Domain whitelist. Blocks requests to non-allowed domains. Supports wildcards (e.g. '*.example.com')."),
65
+ });
66
+ export async function execute(input) {
67
+ if (!(await isPlaywrightAvailable())) {
68
+ return {
69
+ content: [{
70
+ type: "text",
71
+ text: JSON.stringify({
72
+ error: "rebrowser-playwright is required for the snapshot tool. Install with: npm i rebrowser-playwright",
73
+ }, null, 2),
74
+ }],
75
+ };
76
+ }
77
+ const url = normalizeUrl(input.url);
78
+ const proxyUrl = resolveProxy(input.proxy);
79
+ const snapshotId = input.session_id ?? `snap_${Date.now()}`;
80
+ const handle = await acquirePage({
81
+ chromeProfile: input.chrome_profile,
82
+ proxyUrl,
83
+ });
84
+ try {
85
+ const { page } = handle;
86
+ // Install domain filter
87
+ if (input.allowed_domains?.length) {
88
+ await installDomainFilter(page.context(), input.allowed_domains);
89
+ }
90
+ // Restore session cookies if session_id provided
91
+ if (input.session_id) {
92
+ const session = await getSessionManager().load(input.session_id);
93
+ if (session?.cookies.length) {
94
+ await page.context().addCookies(session.cookies);
95
+ }
96
+ }
97
+ // Navigate
98
+ await page.goto(url, { waitUntil: "load", timeout: input.timeout });
99
+ // Take snapshot
100
+ const snapshot = await getEnhancedSnapshot(page, {
101
+ interactive: input.interactive,
102
+ cursor: input.cursor,
103
+ compact: input.compact,
104
+ selector: input.scope_selector,
105
+ });
106
+ // Store refs for later use by interact tool
107
+ getSnapshotStore().save(snapshotId, snapshot.refs, page.url());
108
+ // Build output
109
+ const output = {
110
+ snapshot_id: snapshotId,
111
+ url: page.url(),
112
+ tree: snapshot.tree,
113
+ stats: {
114
+ ...snapshot.stats,
115
+ refCount: Object.keys(snapshot.refs).length,
116
+ treeLines: snapshot.tree.split("\n").length,
117
+ treeChars: snapshot.tree.length,
118
+ },
119
+ };
120
+ const content = [
121
+ { type: "text", text: JSON.stringify(output, null, 2) },
122
+ ];
123
+ // Optional screenshot (plain or annotated)
124
+ if (input.return_screenshot) {
125
+ const buf = input.annotate
126
+ ? await annotateScreenshot(page, snapshot.refs)
127
+ : await page.screenshot({ fullPage: false });
128
+ content.push({
129
+ type: "image",
130
+ data: buf.toString("base64"),
131
+ mimeType: "image/png",
132
+ });
133
+ }
134
+ // Save session if session_id provided
135
+ if (input.session_id) {
136
+ try {
137
+ const cookies = await page.context().cookies();
138
+ const stored = cookies.map((c) => ({
139
+ name: c.name,
140
+ value: c.value,
141
+ domain: c.domain,
142
+ path: c.path,
143
+ expires: c.expires,
144
+ httpOnly: c.httpOnly,
145
+ secure: c.secure,
146
+ sameSite: c.sameSite,
147
+ }));
148
+ await getSessionManager().save(input.session_id, stored, page.url());
149
+ }
150
+ catch {
151
+ // Non-critical — snapshot was still taken successfully
152
+ }
153
+ }
154
+ return { content };
155
+ }
156
+ finally {
157
+ await handle.cleanup();
158
+ }
159
+ }
160
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/tools/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjE,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAAC;AAE/B,MAAM,CAAC,MAAM,WAAW,GACtB,mSAAmS,CAAC;AAEtS,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAC/D,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,6FAA6F,CAAC;IAC1G,WAAW,EAAE,CAAC;SACX,OAAO,EAAE;SACT,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,8GAA8G,CAAC;IAC3H,MAAM,EAAE,CAAC;SACN,OAAO,EAAE;SACT,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,4EAA4E,CAAC;IACzF,OAAO,EAAE,CAAC;SACP,OAAO,EAAE;SACT,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,4EAA4E,CAAC;IACzF,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,gFAAgF,CAAC;IAC7F,iBAAiB,EAAE,CAAC;SACjB,OAAO,EAAE;SACT,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,kCAAkC,CAAC;IAC/C,QAAQ,EAAE,CAAC;SACR,OAAO,EAAE;SACT,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,sGAAsG,CAAC;IACnH,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,GAAG,CAAC,IAAI,CAAC;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,4EAA4E,CAAC;IACzF,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,CAAC,cAAc,CAAC;SACnB,QAAQ,EAAE;SACV,QAAQ,CAAC,yCAAyC,CAAC;IACtD,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,CAAC,IAAI,CAAC;SACT,GAAG,CAAC,cAAc,CAAC;SACnB,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,2CAA2C,CAAC;IACxD,eAAe,EAAE,CAAC;SACf,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;SAC1B,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,sGAAsG,CAAC;CACpH,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAoB;IAChD,IAAI,CAAC,CAAC,MAAM,qBAAqB,EAAE,CAAC,EAAE,CAAC;QACrC,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,KAAK,EAAE,kGAAkG;qBAC1G,EAAE,IAAI,EAAE,CAAC,CAAC;iBACZ,CAAC;SACH,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,QAAQ,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAE5D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;QAC/B,aAAa,EAAE,KAAK,CAAC,cAAc;QACnC,QAAQ;KACT,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QAExB,wBAAwB;QACxB,IAAI,KAAK,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;YAClC,MAAM,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;QACnE,CAAC;QAED,iDAAiD;QACjD,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,MAAM,iBAAiB,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACjE,IAAI,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC5B,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAED,WAAW;QACX,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAEpE,gBAAgB;QAChB,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE;YAC/C,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,cAAc;SAC/B,CAAC,CAAC;QAEH,4CAA4C;QAC5C,gBAAgB,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAE/D,eAAe;QACf,MAAM,MAAM,GAA4B;YACtC,WAAW,EAAE,UAAU;YACvB,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;YACf,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,KAAK,EAAE;gBACL,GAAG,QAAQ,CAAC,KAAK;gBACjB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM;gBAC3C,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM;gBAC3C,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM;aAChC;SACF,CAAC;QAEF,MAAM,OAAO,GAA6E;YACxF,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;SACxD,CAAC;QAEF,2CAA2C;QAC3C,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ;gBACxB,CAAC,CAAC,MAAM,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;gBAC/C,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAC5B,QAAQ,EAAE,WAAW;aACtB,CAAC,CAAC;QACL,CAAC;QAED,sCAAsC;QACtC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;gBAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACjC,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,QAAQ,EAAE,CAAC,CAAC,QAAqC;iBAClD,CAAC,CAAC,CAAC;gBACJ,MAAM,iBAAiB,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACvE,CAAC;YAAC,MAAM,CAAC;gBACP,uDAAuD;YACzD,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "imperium-crawl",
3
- "version": "1.5.3",
3
+ "version": "2.0.0",
4
4
  "description": "Open-source MCP server with Firecrawl-like scraping, crawling, search, and custom skills",
5
5
  "type": "module",
6
6
  "bin": {