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.
@@ -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.
@@ -189,7 +189,32 @@ hard_boundaries:
189
189
  - "[what must not be done]"
190
190
  ```
191
191
 
192
- ### Phase 6: Optionally generate a recipe
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.