neuron-inspector 0.7.0 → 0.8.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 (99) hide show
  1. package/dist/compound-tools.js +2 -136
  2. package/dist/compound-tools.js.map +1 -1
  3. package/dist/monitor.js +208 -7
  4. package/dist/monitor.js.map +1 -1
  5. package/dist/recipe-tools.js +6 -39
  6. package/dist/recipe-tools.js.map +1 -1
  7. package/dist/recipes.d.ts +0 -4
  8. package/dist/recipes.js +3 -49
  9. package/dist/recipes.js.map +1 -1
  10. package/dist/server.js +53 -166
  11. package/dist/server.js.map +1 -1
  12. package/dist/tools.js +0 -26
  13. package/dist/tools.js.map +1 -1
  14. package/package.json +3 -4
  15. package/recipes/linkedin-outreach/learnings.md +1 -17
  16. package/recipes/planner/agent.md +1 -66
  17. package/recipes/planner/learnings.md +1 -49
  18. package/recipes/social-ops/learnings.md +13 -33
  19. package/dist/__tests__/monitor.test.d.ts +0 -1
  20. package/dist/__tests__/monitor.test.js +0 -286
  21. package/dist/__tests__/monitor.test.js.map +0 -1
  22. package/dist/__tests__/recipes.test.d.ts +0 -1
  23. package/dist/__tests__/recipes.test.js +0 -415
  24. package/dist/__tests__/recipes.test.js.map +0 -1
  25. package/dist/__tests__/scheduler.test.d.ts +0 -1
  26. package/dist/__tests__/scheduler.test.js +0 -316
  27. package/dist/__tests__/scheduler.test.js.map +0 -1
  28. package/dist/__tests__/session-state.test.d.ts +0 -1
  29. package/dist/__tests__/session-state.test.js +0 -335
  30. package/dist/__tests__/session-state.test.js.map +0 -1
  31. package/dist/collections/__tests__/assertions.test.d.ts +0 -1
  32. package/dist/collections/__tests__/assertions.test.js +0 -203
  33. package/dist/collections/__tests__/assertions.test.js.map +0 -1
  34. package/dist/collections/__tests__/dynamic-vars.test.d.ts +0 -1
  35. package/dist/collections/__tests__/dynamic-vars.test.js +0 -169
  36. package/dist/collections/__tests__/dynamic-vars.test.js.map +0 -1
  37. package/dist/collections/__tests__/execution.test.d.ts +0 -1
  38. package/dist/collections/__tests__/execution.test.js +0 -271
  39. package/dist/collections/__tests__/execution.test.js.map +0 -1
  40. package/dist/collections/__tests__/integration.test.d.ts +0 -1
  41. package/dist/collections/__tests__/integration.test.js +0 -478
  42. package/dist/collections/__tests__/integration.test.js.map +0 -1
  43. package/dist/collections/__tests__/resolver.test.d.ts +0 -1
  44. package/dist/collections/__tests__/resolver.test.js +0 -282
  45. package/dist/collections/__tests__/resolver.test.js.map +0 -1
  46. package/dist/collections/__tests__/scenario.test.d.ts +0 -1
  47. package/dist/collections/__tests__/scenario.test.js +0 -367
  48. package/dist/collections/__tests__/scenario.test.js.map +0 -1
  49. package/dist/collections/__tests__/scripts.test.d.ts +0 -1
  50. package/dist/collections/__tests__/scripts.test.js +0 -245
  51. package/dist/collections/__tests__/scripts.test.js.map +0 -1
  52. package/dist/collections/__tests__/store.test.d.ts +0 -1
  53. package/dist/collections/__tests__/store.test.js +0 -313
  54. package/dist/collections/__tests__/store.test.js.map +0 -1
  55. package/dist/collections/assertions.d.ts +0 -16
  56. package/dist/collections/assertions.js +0 -107
  57. package/dist/collections/assertions.js.map +0 -1
  58. package/dist/collections/dynamic-vars.d.ts +0 -75
  59. package/dist/collections/dynamic-vars.js +0 -187
  60. package/dist/collections/dynamic-vars.js.map +0 -1
  61. package/dist/collections/executor.d.ts +0 -100
  62. package/dist/collections/executor.js +0 -301
  63. package/dist/collections/executor.js.map +0 -1
  64. package/dist/collections/http.d.ts +0 -9
  65. package/dist/collections/http.js +0 -194
  66. package/dist/collections/http.js.map +0 -1
  67. package/dist/collections/index.d.ts +0 -12
  68. package/dist/collections/index.js +0 -27
  69. package/dist/collections/index.js.map +0 -1
  70. package/dist/collections/postman.d.ts +0 -10
  71. package/dist/collections/postman.js +0 -288
  72. package/dist/collections/postman.js.map +0 -1
  73. package/dist/collections/resolver.d.ts +0 -74
  74. package/dist/collections/resolver.js +0 -330
  75. package/dist/collections/resolver.js.map +0 -1
  76. package/dist/collections/scripts.d.ts +0 -20
  77. package/dist/collections/scripts.js +0 -225
  78. package/dist/collections/scripts.js.map +0 -1
  79. package/dist/collections/store.d.ts +0 -68
  80. package/dist/collections/store.js +0 -507
  81. package/dist/collections/store.js.map +0 -1
  82. package/dist/collections/tools.d.ts +0 -8
  83. package/dist/collections/tools.js +0 -1276
  84. package/dist/collections/tools.js.map +0 -1
  85. package/dist/collections/types.d.ts +0 -226
  86. package/dist/collections/types.js +0 -3
  87. package/dist/collections/types.js.map +0 -1
  88. package/dist/killswitch.d.ts +0 -8
  89. package/dist/killswitch.js +0 -304
  90. package/dist/killswitch.js.map +0 -1
  91. package/dist/resilience.d.ts +0 -112
  92. package/dist/resilience.js +0 -319
  93. package/dist/resilience.js.map +0 -1
  94. package/recipes/autopilot/agent.md +0 -316
  95. package/recipes/autopilot/learnings.md +0 -33
  96. package/recipes/autopilot/recipe.yaml +0 -96
  97. package/recipes/inbox-responder/agent.md +0 -268
  98. package/recipes/inbox-responder/learnings.md +0 -25
  99. package/recipes/inbox-responder/recipe.yaml +0 -82
@@ -1,6 +1,6 @@
1
1
  # Learnings
2
2
 
3
- Updated 2026-09-05 from first live execution failures.
3
+ No planning sessions yet. This file updates after 5+ plans.
4
4
 
5
5
  ## Platform Research Defaults
6
6
 
@@ -25,51 +25,3 @@ Starting assumptions (to be validated by actual research each session):
25
25
  - Action blocks last 24-48 hours
26
26
 
27
27
  These are starting points. ALWAYS research current limits during Phase 2.
28
-
29
- ## Execution Failures — Confirmed (2026-09-05 live testing)
30
-
31
- These are real failures that occurred during the first live test. Every plan MUST account for them.
32
-
33
- ### Background tab interaction (CRITICAL)
34
- **What happened:** Agent clicked Send on LinkedIn and Gmail. Both reported success. Neither actually sent — buttons and dropdowns render at zero dimensions in background tabs.
35
- **Fix:** EVERY plan step that clicks, types, or submits MUST include `neuron_focus_tab` first. No exceptions.
36
-
37
- ### Framework change detection (CRITICAL)
38
- **What happened:** Agent typed a message into LinkedIn's compose box. The text appeared visually, but LinkedIn's Ember.js framework didn't detect it — the Send button stayed disabled.
39
- **Why:** Direct DOM property assignment (`el.value = x`, `el.textContent = x`) is invisible to React/Ember/Angular/Vue. These frameworks use their own state management and only detect input from native browser events.
40
- **Fix:** `neuron_type` now uses `document.execCommand("insertText")` for contenteditable and native prototype setters for inputs. Plans should NOT rely on `neuron_evaluate_js` for typing.
41
-
42
- ### CSP blocking eval (HIGH)
43
- **What happened:** Agent tried to dispatch keyboard events via `neuron_evaluate_js` on LinkedIn. CSP blocked it: `unsafe-eval` not allowed.
44
- **Which platforms block eval:** LinkedIn (confirmed). Facebook, Instagram likely.
45
- **Fix:** Never plan steps that use `neuron_evaluate_js` for interaction on social platforms. Use `neuron_click`, `neuron_type`, `neuron_press_key` instead.
46
-
47
- ### Scroll direction for messages (HIGH)
48
- **What happened:** Agent extracted messages from a LinkedIn conversation. It read the first messages in the DOM — which were OLD messages from the top. The most recent message (the one to reply to) was at the bottom, off-screen.
49
- **Why:** All messaging apps (LinkedIn, Gmail threads, X DMs, IG DMs, TikTok DMs) show newest messages at the bottom. The agent must scroll to the bottom before extracting.
50
- **Fix:** Every plan step that reads messages MUST include "scroll to bottom of conversation" before extracting.
51
-
52
- ### Send verification (MEDIUM)
53
- **What happened:** Agent claimed "message sent" without verifying. The message was actually still in the compose box.
54
- **Fix:** After every send action, plan a verification step: wait 1-2 seconds, then extract the conversation and confirm the new message appears. If it doesn't, the send failed.
55
-
56
- ### Lazy-loading content (MEDIUM)
57
- **What happened:** Gmail's reply composer didn't exist when the agent tried to type into it. The composer loads asynchronously after clicking Reply.
58
- **Fix:** After any action that triggers new UI (clicking Reply, Compose, opening a modal), plan a wait + `neuron_find_elements` to confirm the target element exists before interacting with it. Don't assume it's there immediately.
59
-
60
- ### Chrome sideload path confusion (LOW)
61
- **What happened:** Chrome was loading an old extension build from a stale directory. The TOOL_CALL handler didn't exist in the old build.
62
- **Fix:** Verify the extension version before starting any plan. `neuron_diagnose` returns the extension status.
63
-
64
- ## Pre-mortem Checklist
65
-
66
- Every plan should be checked against this list before finalizing:
67
-
68
- - [ ] Every click/type/submit step has `neuron_focus_tab` before it
69
- - [ ] Every message-reading step scrolls to bottom first
70
- - [ ] No `neuron_evaluate_js` for interaction on CSP-heavy platforms (LinkedIn, Facebook, Instagram)
71
- - [ ] Every send/submit step has a verification step after it
72
- - [ ] Every step that triggers new UI has a wait + find before interacting with the new UI
73
- - [ ] Login/auth state is checked before starting (neuron_detect_blocker)
74
- - [ ] There's a plan for what happens if a captcha appears (answer: stop everything)
75
- - [ ] Selectors have text-based fallbacks for platform DOM changes
@@ -1,42 +1,22 @@
1
1
  # Learnings
2
2
 
3
- Updated 2026-09-05 after first live test on LinkedIn.
3
+ No operations executed yet. This file updates after 10+ sessions.
4
4
 
5
5
  ## Platform Selector Status
6
6
 
7
- | Platform | Last verified | Selector health | Notes |
8
- |----------|--------------|-----------------|-------|
9
- | Instagram | Not yet | Unknown | |
10
- | X/Twitter | Not yet | Unknown | |
11
- | Facebook | Not yet | Unknown | |
12
- | TikTok | Not yet | Unknown | |
13
- | LinkedIn | 2026-09-05 | Partial | Read works, send blocked by CSP |
7
+ All selectors in the Platform Playbook are initial best-effort as of September 2026.
8
+ Platforms change their DOM frequently — expect breakage. When a selector fails,
9
+ the agent falls back to `neuron_find_elements` with visible text matching and
10
+ logs the failure. This section tracks what's current.
14
11
 
15
- ## LinkedIn — Verified 2026-09-05
16
-
17
- **Working:**
18
- - `neuron_navigate` to linkedin.com/messaging/ — works
19
- - `neuron_extract_data` with `.msg-conversation-listitem__link` — extracts conversation list
20
- - `neuron_click` with `texts: ["Person Name"]` — opens conversation
21
- - `neuron_type` with `.msg-form__contenteditable` — types into message box
22
- - `neuron_find_elements` — works for DOM inspection
23
-
24
- **Broken / Limited:**
25
- - `neuron_evaluate_js` — **blocked by LinkedIn CSP** (`unsafe-eval` not allowed). Cannot dispatch keyboard events via JS.
26
- - `neuron_screenshot` — requires tab to be in foreground. Fails silently in background tabs.
27
- - `neuron_type` with `\n` — inserts literal newline text, does NOT trigger LinkedIn's Enter-to-send handler
28
- - Send mode toggle dropdown — requires foreground tab focus to render; hoverable content has zero dimensions in background
29
- - `neuron_click` with `.msg-form__send-button` — button doesn't exist when LinkedIn is in "Enter to Send" mode
30
-
31
- **Conclusion:** LinkedIn messaging is compose-only via automation. The agent can navigate, read messages, open conversations, and type replies — but cannot press Send. The user must press Enter manually. This is a LinkedIn CSP constraint, not a tool limitation.
32
-
33
- **Workaround options:**
34
- 1. User presses Enter after agent composes (current approach — approval gate)
35
- 2. Build a Chrome extension content script injection that bypasses CSP (possible but fragile)
36
- 3. Use LinkedIn's API instead of browser automation for sending (requires OAuth)
12
+ | Platform | Last verified | Selector health |
13
+ |----------|--------------|-----------------|
14
+ | Instagram | Not yet | Unknown |
15
+ | X/Twitter | Not yet | Unknown |
16
+ | Facebook | Not yet | Unknown |
17
+ | TikTok | Not yet | Unknown |
18
+ | LinkedIn | Not yet | Unknown |
37
19
 
38
20
  ## Cross-Platform Patterns
39
21
 
40
- - CSP-heavy sites (LinkedIn, possibly Facebook) block `neuron_evaluate_js`. Fall back to `neuron_click` and `neuron_type` for interaction.
41
- - `neuron_screenshot` requires foreground tab. Always check tab focus before screenshotting.
42
- - Text-based element finding (`texts: ["Label"]`) is more reliable than CSS selectors on platforms that obfuscate class names.
22
+ (Will be populated from multi-platform operations)
@@ -1 +0,0 @@
1
- export {};
@@ -1,286 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
- import * as fs from "node:fs";
3
- import * as path from "node:path";
4
- import * as os from "node:os";
5
- import { handleMonitorTool as _handleMonitorTool } from "../monitor.js";
6
- const handleMonitorTool = (name, args, checkFn) => _handleMonitorTool(name, args, checkFn);
7
- let testDir;
8
- let originalHome;
9
- beforeEach(() => {
10
- testDir = fs.mkdtempSync(path.join(os.tmpdir(), "neuron-monitor-test-"));
11
- originalHome = process.env.HOME || "";
12
- process.env.HOME = testDir;
13
- });
14
- afterEach(() => {
15
- process.env.HOME = originalHome;
16
- fs.rmSync(testDir, { recursive: true, force: true });
17
- });
18
- function monitorsPath() {
19
- return path.join(testDir, ".neuron", "monitors.yaml");
20
- }
21
- function alertsPath() {
22
- return path.join(testDir, ".neuron", "monitor-alerts.yaml");
23
- }
24
- const mockCheckFn = vi.fn(async (url, selector) => {
25
- return { text: "mock content", items: [] };
26
- });
27
- describe("neuron_monitor_create", () => {
28
- it("creates monitor with valid config", async () => {
29
- const result = await handleMonitorTool("neuron_monitor_create", {
30
- url: "https://example.com/jobs-unique-test",
31
- name: "Job Listings Monitor Unique",
32
- check_interval_minutes: 30,
33
- condition: {
34
- type: "new_items",
35
- selector: ".job-item",
36
- },
37
- enabled: false, // Disable to avoid check scheduling
38
- }, mockCheckFn);
39
- expect(result).toMatchObject({
40
- success: true,
41
- message: expect.stringContaining("created successfully"),
42
- });
43
- expect(result).toHaveProperty("monitor_id");
44
- // Verify monitor was created
45
- const listResult = await handleMonitorTool("neuron_monitor_list", {}, mockCheckFn);
46
- const created = listResult.monitors.find((m) => m.name === "Job Listings Monitor Unique");
47
- expect(created).toBeDefined();
48
- });
49
- it("throws error for missing required parameters", async () => {
50
- await expect(handleMonitorTool("neuron_monitor_create", {
51
- url: "https://example.com",
52
- }, mockCheckFn)).rejects.toThrow(/Missing required parameters/);
53
- });
54
- it("creates monitor with default check interval", async () => {
55
- const result = await handleMonitorTool("neuron_monitor_create", {
56
- url: "https://example.com/default-interval-test",
57
- name: "Default Interval Test Unique",
58
- condition: { type: "content_change" },
59
- enabled: false,
60
- }, mockCheckFn);
61
- expect(result.success).toBe(true);
62
- const listResult = await handleMonitorTool("neuron_monitor_list", {}, mockCheckFn);
63
- const created = listResult.monitors.find((m) => m.name === "Default Interval Test Unique");
64
- expect(created).toBeDefined();
65
- expect(created.check_interval_minutes).toBe(60);
66
- });
67
- it("supports all condition types", async () => {
68
- const conditionTypes = [
69
- "content_change",
70
- "text_appears",
71
- "text_disappears",
72
- "price_below",
73
- "new_items",
74
- "selector_change",
75
- ];
76
- const createdIds = [];
77
- for (const type of conditionTypes) {
78
- const result = await handleMonitorTool("neuron_monitor_create", {
79
- url: `https://example.com/condition-type-${type}`,
80
- name: `Unique Condition Monitor ${type}`,
81
- condition: { type },
82
- enabled: false,
83
- }, mockCheckFn);
84
- createdIds.push(result.monitor_id);
85
- }
86
- const listResult = await handleMonitorTool("neuron_monitor_list", {}, mockCheckFn);
87
- const created = listResult.monitors.filter((m) => m.name.startsWith("Unique Condition Monitor "));
88
- expect(created.length).toBe(conditionTypes.length);
89
- });
90
- });
91
- describe("neuron_monitor_list", () => {
92
- it("returns array of monitors", async () => {
93
- const result = await handleMonitorTool("neuron_monitor_list", {}, mockCheckFn);
94
- expect(result).toHaveProperty("monitors");
95
- expect(Array.isArray(result.monitors)).toBe(true);
96
- });
97
- it("lists all monitors with metadata", async () => {
98
- await handleMonitorTool("neuron_monitor_create", {
99
- url: "https://example.com/list-test-1",
100
- name: "List Monitor 1 Unique",
101
- condition: { type: "content_change" },
102
- enabled: false,
103
- }, mockCheckFn);
104
- await handleMonitorTool("neuron_monitor_create", {
105
- url: "https://example.com/list-test-2",
106
- name: "List Monitor 2 Unique",
107
- check_interval_minutes: 15,
108
- condition: { type: "text_appears", text: "SALE" },
109
- enabled: false,
110
- }, mockCheckFn);
111
- const result = await handleMonitorTool("neuron_monitor_list", {}, mockCheckFn);
112
- const monitor1 = result.monitors.find((m) => m.name === "List Monitor 1 Unique");
113
- const monitor2 = result.monitors.find((m) => m.name === "List Monitor 2 Unique");
114
- expect(monitor1).toMatchObject({
115
- name: "List Monitor 1 Unique",
116
- url: "https://example.com/list-test-1",
117
- enabled: false,
118
- condition_type: "content_change",
119
- alert_count: 0,
120
- });
121
- expect(monitor2).toMatchObject({
122
- name: "List Monitor 2 Unique",
123
- url: "https://example.com/list-test-2",
124
- enabled: false,
125
- check_interval_minutes: 15,
126
- condition_type: "text_appears",
127
- });
128
- });
129
- });
130
- describe("neuron_monitor_remove", () => {
131
- it("removes monitor by ID", async () => {
132
- const createResult = await handleMonitorTool("neuron_monitor_create", {
133
- url: "https://example.com/remove-test",
134
- name: "To Delete Unique",
135
- condition: { type: "content_change" },
136
- enabled: false,
137
- }, mockCheckFn);
138
- const monitorId = createResult.monitor_id;
139
- const removeResult = await handleMonitorTool("neuron_monitor_remove", { monitor_id: monitorId }, mockCheckFn);
140
- expect(removeResult).toMatchObject({
141
- success: true,
142
- message: expect.stringContaining("removed"),
143
- });
144
- const listResult = await handleMonitorTool("neuron_monitor_list", {}, mockCheckFn);
145
- const removed = listResult.monitors.find((m) => m.id === monitorId);
146
- expect(removed).toBeUndefined();
147
- });
148
- it("throws error for nonexistent monitor", async () => {
149
- await expect(handleMonitorTool("neuron_monitor_remove", { monitor_id: "nonexistent" }, mockCheckFn)).rejects.toThrow(/not found/);
150
- });
151
- });
152
- describe("neuron_monitor_check", () => {
153
- beforeEach(() => {
154
- mockCheckFn.mockClear();
155
- });
156
- it("runs check on specific monitor", async () => {
157
- mockCheckFn.mockResolvedValue({ text: "test content", items: [] });
158
- const createResult = await handleMonitorTool("neuron_monitor_create", {
159
- url: "https://example.com",
160
- name: "Check Test",
161
- condition: { type: "content_change" },
162
- }, mockCheckFn);
163
- const checkResult = await handleMonitorTool("neuron_monitor_check", { monitor_id: createResult.monitor_id }, mockCheckFn);
164
- expect(checkResult).toHaveProperty("monitor_id", createResult.monitor_id);
165
- expect(checkResult).toHaveProperty("last_check_at");
166
- expect(mockCheckFn).toHaveBeenCalledWith("https://example.com", undefined);
167
- });
168
- it("checks all enabled monitors when no ID provided", async () => {
169
- mockCheckFn.mockResolvedValue({ text: "content", items: [] });
170
- const result1 = await handleMonitorTool("neuron_monitor_create", {
171
- url: "https://example.com/check-all-1",
172
- name: "Check All Monitor 1 Unique",
173
- condition: { type: "content_change" },
174
- enabled: true,
175
- }, mockCheckFn);
176
- const result2 = await handleMonitorTool("neuron_monitor_create", {
177
- url: "https://example.com/check-all-2",
178
- name: "Check All Monitor 2 Unique",
179
- condition: { type: "content_change" },
180
- enabled: false,
181
- }, mockCheckFn);
182
- mockCheckFn.mockClear();
183
- const checkResult = await handleMonitorTool("neuron_monitor_check", {}, mockCheckFn);
184
- // Should only check enabled monitors (at least one from our test)
185
- const ourChecks = checkResult.checks.filter((c) => c.name === "Check All Monitor 1 Unique");
186
- expect(ourChecks.length).toBeGreaterThanOrEqual(1);
187
- expect(mockCheckFn).toHaveBeenCalled();
188
- });
189
- it("sets baseline on first check", async () => {
190
- mockCheckFn.mockResolvedValue({ text: "initial content", items: [] });
191
- const createResult = await handleMonitorTool("neuron_monitor_create", {
192
- url: "https://example.com",
193
- name: "Baseline Test",
194
- condition: { type: "content_change" },
195
- }, mockCheckFn);
196
- await handleMonitorTool("neuron_monitor_check", { monitor_id: createResult.monitor_id }, mockCheckFn);
197
- const listResult = await handleMonitorTool("neuron_monitor_list", {}, mockCheckFn);
198
- expect(listResult.monitors[0].last_result).toBe("no_change");
199
- });
200
- });
201
- describe("neuron_monitor_alerts", () => {
202
- it("returns alerts array", async () => {
203
- const result = await handleMonitorTool("neuron_monitor_alerts", {}, mockCheckFn);
204
- expect(result).toHaveProperty("alerts");
205
- expect(Array.isArray(result.alerts)).toBe(true);
206
- });
207
- it("limits returned alerts", async () => {
208
- const result = await handleMonitorTool("neuron_monitor_alerts", { limit: 5 }, mockCheckFn);
209
- expect(result).toHaveProperty("alerts");
210
- expect(Array.isArray(result.alerts)).toBe(true);
211
- });
212
- it("returns alerts in reverse chronological order", async () => {
213
- mockCheckFn
214
- .mockResolvedValueOnce({ text: "baseline", items: [] })
215
- .mockResolvedValueOnce({ text: "changed content", items: [] });
216
- const createResult = await handleMonitorTool("neuron_monitor_create", {
217
- url: "https://example.com",
218
- name: "Alert Test",
219
- condition: { type: "content_change" },
220
- }, mockCheckFn);
221
- await handleMonitorTool("neuron_monitor_check", { monitor_id: createResult.monitor_id }, mockCheckFn);
222
- await handleMonitorTool("neuron_monitor_check", { monitor_id: createResult.monitor_id }, mockCheckFn);
223
- const alertResult = await handleMonitorTool("neuron_monitor_alerts", { limit: 10 }, mockCheckFn);
224
- if (alertResult.alerts.length > 0) {
225
- expect(alertResult.alerts[0]).toHaveProperty("triggered_at");
226
- expect(alertResult.alerts[0]).toHaveProperty("details");
227
- }
228
- });
229
- });
230
- describe("Condition types", () => {
231
- it("validates text_appears condition requires text parameter", async () => {
232
- mockCheckFn.mockResolvedValue({ text: "no sale here", items: [] });
233
- const createResult = await handleMonitorTool("neuron_monitor_create", {
234
- url: "https://example.com",
235
- name: "Text Appears",
236
- condition: { type: "text_appears", text: "SALE" },
237
- }, mockCheckFn);
238
- await handleMonitorTool("neuron_monitor_check", { monitor_id: createResult.monitor_id }, mockCheckFn);
239
- const listResult = await handleMonitorTool("neuron_monitor_list", {}, mockCheckFn);
240
- expect(listResult.monitors[0].last_result).toBe("no_change");
241
- });
242
- it("validates price_below condition requires threshold", async () => {
243
- mockCheckFn.mockResolvedValue({ text: "$99.99", items: [] });
244
- const createResult = await handleMonitorTool("neuron_monitor_create", {
245
- url: "https://example.com/price",
246
- name: "Price Monitor",
247
- condition: { type: "price_below", threshold: 100 },
248
- }, mockCheckFn);
249
- await handleMonitorTool("neuron_monitor_check", { monitor_id: createResult.monitor_id }, mockCheckFn);
250
- const alertResult = await handleMonitorTool("neuron_monitor_alerts", { limit: 10 }, mockCheckFn);
251
- if (alertResult.alerts.length > 0) {
252
- expect(alertResult.alerts[0].details).toContain("below threshold");
253
- }
254
- });
255
- it("validates selector_change condition requires selector", async () => {
256
- mockCheckFn.mockResolvedValue({ text: "element content", items: [] });
257
- const createResult = await handleMonitorTool("neuron_monitor_create", {
258
- url: "https://example.com",
259
- name: "Selector Monitor",
260
- condition: { type: "selector_change", selector: ".price" },
261
- }, mockCheckFn);
262
- await handleMonitorTool("neuron_monitor_check", { monitor_id: createResult.monitor_id }, mockCheckFn);
263
- expect(mockCheckFn).toHaveBeenCalledWith("https://example.com", ".price");
264
- });
265
- });
266
- describe("Alert storage", () => {
267
- it("limits alerts to MAX_ALERTS (100)", async () => {
268
- const neuronDir = path.join(testDir, ".neuron");
269
- fs.mkdirSync(neuronDir, { recursive: true });
270
- const alerts = [];
271
- for (let i = 0; i < 150; i++) {
272
- alerts.push({
273
- monitor_id: `mon_${i}`,
274
- monitor_name: `Monitor ${i}`,
275
- url: "https://example.com",
276
- condition_type: "content_change",
277
- triggered_at: new Date().toISOString(),
278
- details: `Alert ${i}`,
279
- });
280
- }
281
- fs.writeFileSync(alertsPath(), `alerts:\n${alerts.map((a) => ` - monitor_id: ${a.monitor_id}\n monitor_name: "${a.monitor_name}"\n url: ${a.url}\n condition_type: ${a.condition_type}\n triggered_at: ${a.triggered_at}\n details: "${a.details}"`).join("\n")}`);
282
- const result = await handleMonitorTool("neuron_monitor_alerts", { limit: 200 }, mockCheckFn);
283
- expect(result.alerts.length).toBeLessThanOrEqual(100);
284
- });
285
- });
286
- //# sourceMappingURL=monitor.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"monitor.test.js","sourceRoot":"","sources":["../../src/__tests__/monitor.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};