neuron-inspector 0.3.1 → 0.4.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/dist/compound-tools.js +659 -0
- package/dist/compound-tools.js.map +1 -1
- package/dist/monitor.d.ts +9 -0
- package/dist/monitor.js +449 -0
- package/dist/monitor.js.map +1 -0
- package/dist/scheduler.d.ts +9 -0
- package/dist/scheduler.js +361 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/server.js +110 -41
- package/dist/server.js.map +1 -1
- package/dist/session-state.d.ts +3 -0
- package/dist/session-state.js +271 -0
- package/dist/session-state.js.map +1 -0
- package/package.json +1 -1
- package/recipes/content-repurposing/agent.md +821 -0
- package/recipes/content-repurposing/learnings.md +552 -0
- package/recipes/content-repurposing/recipe.yaml +166 -0
- package/recipes/email-outreach/agent.md +335 -0
- package/recipes/email-outreach/learnings.md +94 -0
- package/recipes/email-outreach/recipe.yaml +109 -0
- package/recipes/linkedin-outreach/agent.md +8 -0
- package/recipes/planner/agent.md +26 -1
- package/recipes/social-ops/agent.md +27 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
name: Email Outreach
|
|
2
|
+
version: 1.0.0
|
|
3
|
+
description: >
|
|
4
|
+
Opens Gmail or Outlook in the browser and sends personalized cold emails
|
|
5
|
+
using the logged-in session. No SMTP, no API keys. Researches each target,
|
|
6
|
+
finds personalization hooks, composes unique emails, and sends with human-like
|
|
7
|
+
pacing. Tracks open/reply rates and evolves subject line and body strategy.
|
|
8
|
+
author: neuron
|
|
9
|
+
tags: [email, outreach, gmail, outlook, cold-email, lead-gen]
|
|
10
|
+
|
|
11
|
+
variables:
|
|
12
|
+
email_client:
|
|
13
|
+
prompt: "Which email client to use?"
|
|
14
|
+
options: [gmail, outlook]
|
|
15
|
+
default: gmail
|
|
16
|
+
subject_template:
|
|
17
|
+
prompt: "Subject line direction (not a template — a theme to follow)"
|
|
18
|
+
type: text
|
|
19
|
+
required: true
|
|
20
|
+
example: "Reference something specific from their company/work"
|
|
21
|
+
body_template:
|
|
22
|
+
prompt: "Email body direction (1-2 sentences describing the tone and structure, NOT a literal template)"
|
|
23
|
+
type: text
|
|
24
|
+
required: true
|
|
25
|
+
example: "Short, reference something specific, one clear ask, no 'hope this email finds you well' nonsense"
|
|
26
|
+
sender_name:
|
|
27
|
+
prompt: "Your name (for email signature)"
|
|
28
|
+
type: text
|
|
29
|
+
required: true
|
|
30
|
+
example: "Rasheed Alabi"
|
|
31
|
+
product_context:
|
|
32
|
+
prompt: "What are you reaching out about? Describe the product/service/opportunity in 2-3 sentences."
|
|
33
|
+
type: text
|
|
34
|
+
required: true
|
|
35
|
+
example: "LetsChop is a meal ordering app for Nigerian organizations — handles group food orders, vendor management, and delivery logistics."
|
|
36
|
+
audience_description:
|
|
37
|
+
prompt: "Who should you reach out to? Be specific about role, industry, location, problem they have."
|
|
38
|
+
type: text
|
|
39
|
+
required: true
|
|
40
|
+
example: "HR managers and office managers in Nigerian tech companies that deal with employee meal orders"
|
|
41
|
+
daily_cap:
|
|
42
|
+
prompt: "Max emails per day"
|
|
43
|
+
type: number
|
|
44
|
+
default: 15
|
|
45
|
+
session_cap:
|
|
46
|
+
prompt: "Max emails per session (run)"
|
|
47
|
+
type: number
|
|
48
|
+
default: 5
|
|
49
|
+
min_delay_seconds:
|
|
50
|
+
prompt: "Minimum seconds between emails"
|
|
51
|
+
type: number
|
|
52
|
+
default: 90
|
|
53
|
+
output_path:
|
|
54
|
+
prompt: "Where to save outreach logs"
|
|
55
|
+
type: path
|
|
56
|
+
default: "./email-outreach"
|
|
57
|
+
approval_mode:
|
|
58
|
+
prompt: "Review each email before sending, or auto-send after first 3?"
|
|
59
|
+
options: [review-all, auto-after-3]
|
|
60
|
+
default: review-all
|
|
61
|
+
|
|
62
|
+
tools:
|
|
63
|
+
required:
|
|
64
|
+
- neuron_navigate
|
|
65
|
+
- neuron_find_elements
|
|
66
|
+
- neuron_type
|
|
67
|
+
- neuron_click
|
|
68
|
+
- neuron_scroll
|
|
69
|
+
- neuron_screenshot
|
|
70
|
+
- neuron_evaluate_js
|
|
71
|
+
- neuron_detect_blocker
|
|
72
|
+
- neuron_research_page
|
|
73
|
+
- neuron_monitor_action
|
|
74
|
+
- neuron_session_save
|
|
75
|
+
- neuron_session_load
|
|
76
|
+
- neuron_session_checkpoint
|
|
77
|
+
optional:
|
|
78
|
+
- neuron_open_tab
|
|
79
|
+
- neuron_extract_data
|
|
80
|
+
- neuron_snapshot_state
|
|
81
|
+
- neuron_diff_states
|
|
82
|
+
- neuron_search_traffic
|
|
83
|
+
|
|
84
|
+
pipes:
|
|
85
|
+
outputs:
|
|
86
|
+
outreach_log:
|
|
87
|
+
format: yaml
|
|
88
|
+
path: "{{output_path}}/outreach-log.yaml"
|
|
89
|
+
description: "Running log of all emails sent — recipient, subject, body, timestamp, open/reply status"
|
|
90
|
+
email_drafts:
|
|
91
|
+
format: markdown
|
|
92
|
+
path: "{{output_path}}/drafts.md"
|
|
93
|
+
description: "Archive of all email drafts — subject lines and bodies that were sent"
|
|
94
|
+
inputs:
|
|
95
|
+
campaign_plan:
|
|
96
|
+
from: planner
|
|
97
|
+
output: plan
|
|
98
|
+
description: "Campaign plan with target list, timing strategy, and message approach"
|
|
99
|
+
optional: true
|
|
100
|
+
research_report:
|
|
101
|
+
from: web-researcher
|
|
102
|
+
output: report
|
|
103
|
+
description: "Research on target companies/individuals for personalization"
|
|
104
|
+
optional: true
|
|
105
|
+
|
|
106
|
+
limits:
|
|
107
|
+
max_tabs: 3
|
|
108
|
+
max_duration_minutes: 45
|
|
109
|
+
require_human_approval: true
|
|
@@ -212,6 +212,14 @@ After 20+ messages with at least 8 response outcomes, review memory and update `
|
|
|
212
212
|
- Which messages got negative responses? What do they have in common?
|
|
213
213
|
- Which messages were rejected by the human reviewer? Why? Update the hard rules.
|
|
214
214
|
|
|
215
|
+
**Rule updates from data:**
|
|
216
|
+
After evolving, check if any learnings should become permanent rules:
|
|
217
|
+
- Read current rules with `neuron_rules_get`
|
|
218
|
+
- If a pattern consistently causes negative responses → propose a `never` rule (e.g., "never mention pricing in the first message")
|
|
219
|
+
- If the human rejected messages for the same reason 3+ times → propose a `global` rule
|
|
220
|
+
- If LinkedIn-specific limits were discovered → update `platform.linkedin` rules
|
|
221
|
+
- Present proposed rule changes to the user and save with `neuron_rules_set` on approval
|
|
222
|
+
|
|
215
223
|
Update the strategy based on data. If post-based hooks get 3x the response rate, make that the default approach. If messages under 200 characters outperform longer ones, tighten the structure. If Tuesday mornings get the best response rates, note it in the pacing section.
|
|
216
224
|
|
|
217
225
|
The metric is **response rate per message**, not messages sent. A 20% response rate on 50 messages beats a 2% response rate on 500.
|
package/recipes/planner/agent.md
CHANGED
|
@@ -189,7 +189,32 @@ hard_boundaries:
|
|
|
189
189
|
- "[what must not be done]"
|
|
190
190
|
```
|
|
191
191
|
|
|
192
|
-
### Phase 6:
|
|
192
|
+
### Phase 6: Update rules from findings
|
|
193
|
+
|
|
194
|
+
After researching platform constraints, update the user's rules using `neuron_rules_set`.
|
|
195
|
+
|
|
196
|
+
**Convert hard boundaries to "never" rules:**
|
|
197
|
+
If the research found things that should absolutely never be done (e.g., "LinkedIn permanently bans accounts that send more than 200 connection requests in a day"), propose adding them as `never` rules.
|
|
198
|
+
|
|
199
|
+
**Convert rate limits to platform rules:**
|
|
200
|
+
Translate discovered safe operating ranges into platform-specific rules. For example, if research found LinkedIn's safe range is 50 messages/day:
|
|
201
|
+
```
|
|
202
|
+
neuron_rules_set({
|
|
203
|
+
platform: {
|
|
204
|
+
linkedin: [
|
|
205
|
+
"Maximum 50 messages per day (researched 2026-09-05)",
|
|
206
|
+
"Minimum 120 seconds between messages",
|
|
207
|
+
"Do not send connection requests to accounts with no profile photo"
|
|
208
|
+
]
|
|
209
|
+
}
|
|
210
|
+
})
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
**Always read existing rules first** with `neuron_rules_get` to avoid overwriting rules the user already set. Merge, don't replace.
|
|
214
|
+
|
|
215
|
+
**Flag rule suggestions to the user.** Before saving, present the proposed rules and ask for confirmation. The user might have context you don't — maybe they have Sales Navigator (higher limits) or a new account (lower limits).
|
|
216
|
+
|
|
217
|
+
### Phase 7: Optionally generate a recipe
|
|
193
218
|
|
|
194
219
|
If `{{create_recipe}}` is "yes", use `neuron_recipe_create` to generate a new recipe based on the plan. The recipe should:
|
|
195
220
|
- Have the execution steps as its Strategy
|
|
@@ -309,8 +309,28 @@ outcome:
|
|
|
309
309
|
platform: "{{platform}}"
|
|
310
310
|
context: "<what it was supposed to find>"
|
|
311
311
|
session_duration_minutes: <approx>
|
|
312
|
+
rule_violations:
|
|
313
|
+
- "<any rule that was almost or actually violated, and what prevented it>"
|
|
314
|
+
proposed_rules:
|
|
315
|
+
- "<any new rule the agent thinks should be added based on this session>"
|
|
312
316
|
```
|
|
313
317
|
|
|
318
|
+
### Auto-update rules from session outcomes
|
|
319
|
+
|
|
320
|
+
After logging memory, check if any findings should become rules:
|
|
321
|
+
|
|
322
|
+
**If a blocker was hit** (rate limit, captcha, account restriction):
|
|
323
|
+
- Use `neuron_rules_get` to read current rules
|
|
324
|
+
- Propose a new platform rule with the safe limit (e.g., "Maximum 25 DMs per day on Instagram — hit rate limit at 30")
|
|
325
|
+
- Present the proposed rule to the user for approval
|
|
326
|
+
- If approved, call `neuron_rules_set` to save it
|
|
327
|
+
|
|
328
|
+
**If the human rejected an action** during the approval gate:
|
|
329
|
+
- Ask why. If it's a pattern (e.g., "don't DM people with less than 100 followers"), propose it as a global or platform rule
|
|
330
|
+
|
|
331
|
+
**If a selector failed:**
|
|
332
|
+
- Don't make a rule — update the Platform Playbook instead
|
|
333
|
+
|
|
314
334
|
## Evolve
|
|
315
335
|
|
|
316
336
|
After 10+ sessions, review memory and update `learnings.md`:
|
|
@@ -329,10 +349,17 @@ After 10+ sessions, review memory and update `learnings.md`:
|
|
|
329
349
|
- Have any limits changed?
|
|
330
350
|
- What's the actual safe operating range vs the documented limit?
|
|
331
351
|
- Any new detection patterns?
|
|
352
|
+
- **Update platform rules** via `neuron_rules_set` if limits have changed.
|
|
332
353
|
|
|
333
354
|
**Targeting:**
|
|
334
355
|
- Which target sources (post likers vs followers vs commenters vs search) yield the most receptive people?
|
|
335
356
|
- Does personalization significantly improve response rates?
|
|
336
357
|
- What fit score threshold is worth the effort?
|
|
337
358
|
|
|
359
|
+
**Rule review:**
|
|
360
|
+
- Read all proposed_rules from memory entries
|
|
361
|
+
- Any pattern that appears 3+ times → propose as a permanent rule via `neuron_rules_set`
|
|
362
|
+
- Any rule that was never triggered → flag as potentially unnecessary
|
|
363
|
+
- Present the rule update summary to the user for approval
|
|
364
|
+
|
|
338
365
|
Update the Platform Playbook with any selector changes, updated limits, or new UI patterns discovered.
|