neuron-inspector 0.8.0 → 1.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.
- package/README.md +345 -42
- package/dist/automations/executor.d.ts +21 -0
- package/dist/automations/executor.js +835 -0
- package/dist/automations/executor.js.map +1 -0
- package/dist/automations/index.d.ts +7 -0
- package/dist/automations/index.js +21 -0
- package/dist/automations/index.js.map +1 -0
- package/dist/automations/store.d.ts +15 -0
- package/dist/automations/store.js +193 -0
- package/dist/automations/store.js.map +1 -0
- package/dist/automations/tools.d.ts +14 -0
- package/dist/automations/tools.js +735 -0
- package/dist/automations/tools.js.map +1 -0
- package/dist/automations/types.d.ts +211 -0
- package/dist/automations/types.js +4 -0
- package/dist/automations/types.js.map +1 -0
- package/dist/business-tools.d.ts +17 -0
- package/dist/business-tools.js +3065 -0
- package/dist/business-tools.js.map +1 -0
- package/dist/collections/__tests__/assertions.test.js +203 -0
- package/dist/collections/__tests__/assertions.test.js.map +1 -0
- package/dist/collections/__tests__/dynamic-vars.test.d.ts +1 -0
- package/dist/collections/__tests__/dynamic-vars.test.js +169 -0
- package/dist/collections/__tests__/dynamic-vars.test.js.map +1 -0
- package/dist/collections/__tests__/execution.test.d.ts +1 -0
- package/dist/collections/__tests__/execution.test.js +271 -0
- package/dist/collections/__tests__/execution.test.js.map +1 -0
- package/dist/collections/__tests__/integration.test.d.ts +1 -0
- package/dist/collections/__tests__/integration.test.js +478 -0
- package/dist/collections/__tests__/integration.test.js.map +1 -0
- package/dist/collections/__tests__/resolver.test.d.ts +1 -0
- package/dist/collections/__tests__/resolver.test.js +282 -0
- package/dist/collections/__tests__/resolver.test.js.map +1 -0
- package/dist/collections/__tests__/scenario.test.d.ts +1 -0
- package/dist/collections/__tests__/scenario.test.js +367 -0
- package/dist/collections/__tests__/scenario.test.js.map +1 -0
- package/dist/collections/__tests__/scripts.test.d.ts +1 -0
- package/dist/collections/__tests__/scripts.test.js +245 -0
- package/dist/collections/__tests__/scripts.test.js.map +1 -0
- package/dist/collections/__tests__/store.test.d.ts +1 -0
- package/dist/collections/__tests__/store.test.js +313 -0
- package/dist/collections/__tests__/store.test.js.map +1 -0
- package/dist/collections/assertions.d.ts +16 -0
- package/dist/collections/assertions.js +107 -0
- package/dist/collections/assertions.js.map +1 -0
- package/dist/collections/dynamic-vars.d.ts +75 -0
- package/dist/collections/dynamic-vars.js +187 -0
- package/dist/collections/dynamic-vars.js.map +1 -0
- package/dist/collections/executor.d.ts +100 -0
- package/dist/collections/executor.js +301 -0
- package/dist/collections/executor.js.map +1 -0
- package/dist/collections/http.d.ts +9 -0
- package/dist/collections/http.js +194 -0
- package/dist/collections/http.js.map +1 -0
- package/dist/collections/index.d.ts +12 -0
- package/dist/collections/index.js +27 -0
- package/dist/collections/index.js.map +1 -0
- package/dist/collections/postman.d.ts +10 -0
- package/dist/collections/postman.js +288 -0
- package/dist/collections/postman.js.map +1 -0
- package/dist/collections/resolver.d.ts +74 -0
- package/dist/collections/resolver.js +330 -0
- package/dist/collections/resolver.js.map +1 -0
- package/dist/collections/scripts.d.ts +20 -0
- package/dist/collections/scripts.js +225 -0
- package/dist/collections/scripts.js.map +1 -0
- package/dist/collections/store.d.ts +68 -0
- package/dist/collections/store.js +507 -0
- package/dist/collections/store.js.map +1 -0
- package/dist/collections/tools.d.ts +8 -0
- package/dist/collections/tools.js +1276 -0
- package/dist/collections/tools.js.map +1 -0
- package/dist/collections/types.d.ts +226 -0
- package/dist/collections/types.js +3 -0
- package/dist/collections/types.js.map +1 -0
- package/dist/compound-tools.js +136 -2
- package/dist/compound-tools.js.map +1 -1
- package/dist/killswitch.d.ts +8 -0
- package/dist/killswitch.js +304 -0
- package/dist/killswitch.js.map +1 -0
- package/dist/monitor.d.ts +36 -2
- package/dist/monitor.js +213 -38
- package/dist/monitor.js.map +1 -1
- package/dist/paths.d.ts +16 -0
- package/dist/paths.js +39 -0
- package/dist/paths.js.map +1 -0
- package/dist/recipe-tools.js +67 -9
- package/dist/recipe-tools.js.map +1 -1
- package/dist/recipes.d.ts +6 -0
- package/dist/recipes.js +83 -8
- package/dist/recipes.js.map +1 -1
- package/dist/resilience.d.ts +112 -0
- package/dist/resilience.js +319 -0
- package/dist/resilience.js.map +1 -0
- package/dist/scheduler.js +4 -8
- package/dist/scheduler.js.map +1 -1
- package/dist/server.js +221 -60
- package/dist/server.js.map +1 -1
- package/dist/session-state.js +2 -2
- package/dist/session-state.js.map +1 -1
- package/dist/tools.js +54 -0
- package/dist/tools.js.map +1 -1
- package/package.json +4 -3
- package/recipes/autopilot/agent.md +316 -0
- package/recipes/autopilot/learnings.md +33 -0
- package/recipes/autopilot/recipe.yaml +96 -0
- package/recipes/inbox-responder/agent.md +268 -0
- package/recipes/inbox-responder/learnings.md +25 -0
- package/recipes/inbox-responder/recipe.yaml +82 -0
- package/recipes/linkedin-job-scraper/agent.md +144 -0
- package/recipes/linkedin-job-scraper/learnings.md +3 -0
- package/recipes/linkedin-job-scraper/recipe.yaml +71 -0
- package/recipes/linkedin-outreach/learnings.md +17 -1
- package/recipes/planner/agent.md +66 -1
- package/recipes/planner/learnings.md +49 -1
- package/recipes/sheets-data-entry/agent.md +166 -0
- package/recipes/sheets-data-entry/learnings.md +3 -0
- package/recipes/sheets-data-entry/recipe.yaml +78 -0
- package/recipes/social-ops/learnings.md +33 -13
- package/recipes/x-job-scraper/agent.md +156 -0
- package/recipes/x-job-scraper/learnings.md +3 -0
- package/recipes/x-job-scraper/recipe.yaml +72 -0
- package/dist/__tests__/correlation.test.js +0 -53
- package/dist/__tests__/correlation.test.js.map +0 -1
- /package/dist/{__tests__/correlation.test.d.ts → collections/__tests__/assertions.test.d.ts} +0 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
name: X Job Scraper
|
|
2
|
+
version: 1.0.0
|
|
3
|
+
description: >
|
|
4
|
+
Searches X (Twitter) for job postings using keyword queries and hashtags,
|
|
5
|
+
extracts structured data from tweets (role, company, link, author), and
|
|
6
|
+
outputs a clean JSON list. Handles X's infinite scroll, login state, and
|
|
7
|
+
rate limits. Learns which search queries surface real postings vs noise.
|
|
8
|
+
author: neuron
|
|
9
|
+
tags: [jobs, twitter, x, scraping, research]
|
|
10
|
+
|
|
11
|
+
variables:
|
|
12
|
+
search_query:
|
|
13
|
+
prompt: "Job keywords or hashtags to search"
|
|
14
|
+
type: text
|
|
15
|
+
required: true
|
|
16
|
+
example: "#hiring backend engineer, #remotejobs Nigeria"
|
|
17
|
+
additional_hashtags:
|
|
18
|
+
prompt: "Extra hashtags to include (comma-separated)"
|
|
19
|
+
type: text
|
|
20
|
+
default: "#hiring, #techjobs, #jobalert"
|
|
21
|
+
location_keywords:
|
|
22
|
+
prompt: "Location terms to filter by (comma-separated, checked in tweet text)"
|
|
23
|
+
type: text
|
|
24
|
+
default: ""
|
|
25
|
+
example: "Nigeria, Lagos, remote, worldwide"
|
|
26
|
+
max_results:
|
|
27
|
+
prompt: "Maximum number of job tweets to extract"
|
|
28
|
+
type: number
|
|
29
|
+
default: 30
|
|
30
|
+
recency:
|
|
31
|
+
prompt: "How far back to search"
|
|
32
|
+
options: [today, this_week, this_month]
|
|
33
|
+
default: this_week
|
|
34
|
+
exclude_keywords:
|
|
35
|
+
prompt: "Skip tweets containing these words (comma-separated)"
|
|
36
|
+
type: text
|
|
37
|
+
default: ""
|
|
38
|
+
example: "unpaid, intern only, crypto"
|
|
39
|
+
min_followers:
|
|
40
|
+
prompt: "Minimum follower count for the posting account"
|
|
41
|
+
type: number
|
|
42
|
+
default: 100
|
|
43
|
+
|
|
44
|
+
tools:
|
|
45
|
+
required:
|
|
46
|
+
- neuron_navigate
|
|
47
|
+
- neuron_extract_data
|
|
48
|
+
- neuron_find_elements
|
|
49
|
+
- neuron_click
|
|
50
|
+
- neuron_scroll
|
|
51
|
+
- neuron_screenshot
|
|
52
|
+
- neuron_list_tabs
|
|
53
|
+
optional:
|
|
54
|
+
- neuron_evaluate_js
|
|
55
|
+
- neuron_open_tab
|
|
56
|
+
- neuron_type
|
|
57
|
+
- neuron_detect_blocker
|
|
58
|
+
- neuron_wait_for
|
|
59
|
+
- neuron_search_traffic
|
|
60
|
+
|
|
61
|
+
pipes:
|
|
62
|
+
outputs:
|
|
63
|
+
jobs:
|
|
64
|
+
format: json
|
|
65
|
+
path: "{{output_path}}/x-jobs-{{date_slug}}.json"
|
|
66
|
+
description: "Array of job tweet objects with role, company, url, tweet_url, author, posted_date"
|
|
67
|
+
inputs: {}
|
|
68
|
+
|
|
69
|
+
limits:
|
|
70
|
+
max_tabs: 3
|
|
71
|
+
max_duration_minutes: 15
|
|
72
|
+
require_human_approval: false
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
-
import { PendingCalls } from "../correlation.js";
|
|
3
|
-
function mockWs() {
|
|
4
|
-
return { send: vi.fn() };
|
|
5
|
-
}
|
|
6
|
-
describe("PendingCalls", () => {
|
|
7
|
-
let calls;
|
|
8
|
-
beforeEach(() => {
|
|
9
|
-
calls = new PendingCalls();
|
|
10
|
-
});
|
|
11
|
-
it("resolves when onResponse is called with matching requestId", async () => {
|
|
12
|
-
const ws = mockWs();
|
|
13
|
-
const promise = calls.call(ws, "queryDOM", { tabId: 1 }, 5000);
|
|
14
|
-
// Extract the requestId from the sent message
|
|
15
|
-
const sent = JSON.parse(ws.send.mock.calls[0][0]);
|
|
16
|
-
expect(sent.type).toBe("TOOL_CALL");
|
|
17
|
-
expect(sent.payload.name).toBe("queryDOM");
|
|
18
|
-
// Simulate response
|
|
19
|
-
calls.onResponse({ requestId: sent.requestId, payload: { tag: "body" } });
|
|
20
|
-
const result = await promise;
|
|
21
|
-
expect(result).toEqual({ tag: "body" });
|
|
22
|
-
});
|
|
23
|
-
it("rejects on timeout", async () => {
|
|
24
|
-
vi.useFakeTimers();
|
|
25
|
-
const ws = mockWs();
|
|
26
|
-
const promise = calls.call(ws, "slow", {}, 100);
|
|
27
|
-
vi.advanceTimersByTime(101);
|
|
28
|
-
await expect(promise).rejects.toThrow('timed out after 100ms');
|
|
29
|
-
expect(calls.size).toBe(0);
|
|
30
|
-
vi.useRealTimers();
|
|
31
|
-
});
|
|
32
|
-
it("rejects with error message from response", async () => {
|
|
33
|
-
const ws = mockWs();
|
|
34
|
-
const promise = calls.call(ws, "failing", {}, 5000);
|
|
35
|
-
const sent = JSON.parse(ws.send.mock.calls[0][0]);
|
|
36
|
-
calls.onResponse({ requestId: sent.requestId, error: "Tab not found" });
|
|
37
|
-
await expect(promise).rejects.toThrow("Tab not found");
|
|
38
|
-
});
|
|
39
|
-
it("ignores responses with unknown requestId", () => {
|
|
40
|
-
const handled = calls.onResponse({ requestId: "unknown-id", payload: {} });
|
|
41
|
-
expect(handled).toBe(false);
|
|
42
|
-
});
|
|
43
|
-
it("clears all pending on clear()", async () => {
|
|
44
|
-
const ws = mockWs();
|
|
45
|
-
const p1 = calls.call(ws, "a", {}, 5000);
|
|
46
|
-
const p2 = calls.call(ws, "b", {}, 5000);
|
|
47
|
-
calls.clear();
|
|
48
|
-
await expect(p1).rejects.toThrow("Connection closed");
|
|
49
|
-
await expect(p2).rejects.toThrow("Connection closed");
|
|
50
|
-
expect(calls.size).toBe(0);
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
//# sourceMappingURL=correlation.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"correlation.test.js","sourceRoot":"","sources":["../../src/__tests__/correlation.test.ts"],"names":[],"mappings":"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"}
|
/package/dist/{__tests__/correlation.test.d.ts → collections/__tests__/assertions.test.d.ts}
RENAMED
|
File without changes
|