neuron-inspector 0.7.1 → 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 -175
  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,112 +0,0 @@
1
- /**
2
- * Resilience layer — smart waiting, retry with fallbacks, and action
3
- * verification. Makes the difference between "clicks and hopes" and
4
- * "clicks, verifies, retries with a different approach if needed."
5
- *
6
- * These wrap the raw extension primitives with reliability patterns.
7
- * Compound tools and recipes should use these instead of raw call().
8
- */
9
- import type { WebSocket } from "ws";
10
- import type { PendingCalls } from "./correlation.js";
11
- interface BridgeContext {
12
- ws: WebSocket;
13
- pending: PendingCalls;
14
- }
15
- export interface WaitOptions {
16
- /** Max time to wait in ms (default: 10000) */
17
- timeoutMs?: number;
18
- /** Poll interval in ms (default: 500) */
19
- intervalMs?: number;
20
- }
21
- /**
22
- * Wait for an element matching CSS selectors to appear in the DOM.
23
- * Polls at `intervalMs` until found or `timeoutMs` expires.
24
- * Returns the element info when found, throws on timeout.
25
- */
26
- export declare function waitForElement(ctx: BridgeContext, tabId: number, selectors: string[], opts?: WaitOptions): Promise<{
27
- found: true;
28
- selector: string;
29
- count: number;
30
- }>;
31
- /**
32
- * Wait for visible text to appear on the page.
33
- * Polls by extracting page content and searching for the text.
34
- */
35
- export declare function waitForText(ctx: BridgeContext, tabId: number, text: string, opts?: WaitOptions): Promise<{
36
- found: true;
37
- }>;
38
- /**
39
- * Wait for the page URL to change (after a navigation or redirect).
40
- */
41
- export declare function waitForNavigation(ctx: BridgeContext, tabId: number, opts?: WaitOptions & {
42
- urlContains?: string;
43
- }): Promise<{
44
- url: string;
45
- }>;
46
- export interface ClickOptions {
47
- /** CSS selectors to try, in priority order */
48
- selectors?: string[];
49
- /** Visible text labels to try */
50
- texts?: string[];
51
- /** Aria labels to try */
52
- ariaLabels?: string[];
53
- /** Scroll to find the element if not immediately visible */
54
- scrollToFind?: boolean;
55
- /** Max retry attempts (default: 3) */
56
- maxRetries?: number;
57
- /** Verify click by checking for state change (optional) */
58
- verifySelector?: string;
59
- /** Expected change after click: appears, disappears, changes */
60
- verifyChange?: "appears" | "disappears" | "changes";
61
- }
62
- /**
63
- * Click with automatic fallback chain and retry.
64
- * Tries: CSS selectors → text matching → aria-labels → scroll + retry.
65
- * Optionally verifies the click had an effect.
66
- */
67
- export declare function resilientClick(ctx: BridgeContext, tabId: number, opts: ClickOptions): Promise<{
68
- clicked: true;
69
- method: string;
70
- verified?: boolean;
71
- }>;
72
- export interface TypeOptions {
73
- selectors: string[];
74
- value: string;
75
- /** Max retry attempts (default: 3) */
76
- maxRetries?: number;
77
- /** Verify by reading back the value after typing */
78
- verify?: boolean;
79
- /** Press Enter after typing (for send-on-enter fields) */
80
- pressEnter?: boolean;
81
- }
82
- /**
83
- * Type with retry and value verification.
84
- * After typing, optionally reads back the field to confirm the text was accepted.
85
- * For contenteditable (LinkedIn, X), uses execCommand internally.
86
- */
87
- export declare function resilientType(ctx: BridgeContext, tabId: number, opts: TypeOptions): Promise<{
88
- typed: true;
89
- verified?: boolean;
90
- pressedEnter?: boolean;
91
- }>;
92
- export interface HealthStatus {
93
- extensionConnected: boolean;
94
- tabAccessible: boolean;
95
- tabUrl?: string;
96
- blockerDetected: boolean;
97
- blockerType?: string;
98
- ready: boolean;
99
- }
100
- /**
101
- * Check if a tab is healthy and ready for interaction.
102
- * Verifies: extension connected, tab accessible, no login wall/captcha.
103
- * Call this before any recipe execution.
104
- */
105
- export declare function healthCheck(ctx: BridgeContext, tabId: number): Promise<HealthStatus>;
106
- /**
107
- * Scroll a container to its bottom to load the latest content.
108
- * Tries: specific container selector → general page scroll.
109
- * Waits for content to load after scrolling.
110
- */
111
- export declare function scrollToLatest(ctx: BridgeContext, tabId: number, containerSelector?: string): Promise<void>;
112
- export type { BridgeContext };
@@ -1,319 +0,0 @@
1
- /**
2
- * Resilience layer — smart waiting, retry with fallbacks, and action
3
- * verification. Makes the difference between "clicks and hopes" and
4
- * "clicks, verifies, retries with a different approach if needed."
5
- *
6
- * These wrap the raw extension primitives with reliability patterns.
7
- * Compound tools and recipes should use these instead of raw call().
8
- */
9
- async function call(ctx, primitive, args, timeoutMs = 15000) {
10
- return ctx.pending.call(ctx.ws, primitive, args, timeoutMs);
11
- }
12
- function sleep(ms) {
13
- return new Promise((r) => setTimeout(r, ms));
14
- }
15
- /**
16
- * Wait for an element matching CSS selectors to appear in the DOM.
17
- * Polls at `intervalMs` until found or `timeoutMs` expires.
18
- * Returns the element info when found, throws on timeout.
19
- */
20
- export async function waitForElement(ctx, tabId, selectors, opts = {}) {
21
- const timeout = opts.timeoutMs ?? 10000;
22
- const interval = opts.intervalMs ?? 500;
23
- const start = Date.now();
24
- while (Date.now() - start < timeout) {
25
- try {
26
- const result = (await call(ctx, "findElements", {
27
- tabId,
28
- selectors,
29
- limit: 1,
30
- }));
31
- if (Array.isArray(result) && result.length > 0) {
32
- // Find which selector matched
33
- const matched = result[0]?.selector ?? selectors[0];
34
- return { found: true, selector: matched, count: result.length };
35
- }
36
- }
37
- catch {
38
- // findElements failed — page might still be loading, retry
39
- }
40
- await sleep(interval);
41
- }
42
- throw new Error(`Timeout: element not found after ${timeout}ms. Tried selectors: ${selectors.join(", ")}`);
43
- }
44
- /**
45
- * Wait for visible text to appear on the page.
46
- * Polls by extracting page content and searching for the text.
47
- */
48
- export async function waitForText(ctx, tabId, text, opts = {}) {
49
- const timeout = opts.timeoutMs ?? 10000;
50
- const interval = opts.intervalMs ?? 500;
51
- const start = Date.now();
52
- while (Date.now() - start < timeout) {
53
- try {
54
- const result = (await call(ctx, "findElements", {
55
- tabId,
56
- texts: [text],
57
- limit: 1,
58
- }));
59
- if (Array.isArray(result) && result.length > 0) {
60
- return { found: true };
61
- }
62
- }
63
- catch {
64
- // retry
65
- }
66
- await sleep(interval);
67
- }
68
- throw new Error(`Timeout: text "${text}" not found after ${timeout}ms`);
69
- }
70
- /**
71
- * Wait for the page URL to change (after a navigation or redirect).
72
- */
73
- export async function waitForNavigation(ctx, tabId, opts = {}) {
74
- const timeout = opts.timeoutMs ?? 10000;
75
- const interval = opts.intervalMs ?? 500;
76
- const start = Date.now();
77
- while (Date.now() - start < timeout) {
78
- try {
79
- const tabs = (await call(ctx, "listTabs", {}));
80
- const tab = tabs?.find((t) => t.id === tabId);
81
- if (tab?.url) {
82
- if (!opts.urlContains || tab.url.includes(opts.urlContains)) {
83
- return { url: tab.url };
84
- }
85
- }
86
- }
87
- catch {
88
- // retry
89
- }
90
- await sleep(interval);
91
- }
92
- throw new Error(`Timeout: navigation not detected after ${timeout}ms`);
93
- }
94
- /**
95
- * Click with automatic fallback chain and retry.
96
- * Tries: CSS selectors → text matching → aria-labels → scroll + retry.
97
- * Optionally verifies the click had an effect.
98
- */
99
- export async function resilientClick(ctx, tabId, opts) {
100
- const maxRetries = opts.maxRetries ?? 3;
101
- // Focus tab first — background tabs can't click
102
- await call(ctx, "focusTab", { tabId });
103
- await sleep(300);
104
- for (let attempt = 0; attempt < maxRetries; attempt++) {
105
- // Try CSS selectors
106
- if (opts.selectors?.length) {
107
- try {
108
- const result = (await call(ctx, "clickElement", {
109
- tabId,
110
- selectors: opts.selectors,
111
- }));
112
- if (result?.clicked) {
113
- const verified = opts.verifySelector
114
- ? await verifyAction(ctx, tabId, opts.verifySelector, opts.verifyChange)
115
- : undefined;
116
- return { clicked: true, method: `selector:${result.selector}`, verified };
117
- }
118
- }
119
- catch { /* try next method */ }
120
- }
121
- // Try text matching
122
- if (opts.texts?.length) {
123
- try {
124
- const result = (await call(ctx, "clickElement", {
125
- tabId,
126
- texts: opts.texts,
127
- }));
128
- if (result?.clicked) {
129
- const verified = opts.verifySelector
130
- ? await verifyAction(ctx, tabId, opts.verifySelector, opts.verifyChange)
131
- : undefined;
132
- return { clicked: true, method: `text:${opts.texts[0]}`, verified };
133
- }
134
- }
135
- catch { /* try next method */ }
136
- }
137
- // Try aria-labels as selectors
138
- if (opts.ariaLabels?.length) {
139
- const ariaSelectors = opts.ariaLabels.map((l) => `[aria-label="${l}"], [aria-label*="${l}"]`);
140
- try {
141
- const result = (await call(ctx, "clickElement", {
142
- tabId,
143
- selectors: ariaSelectors,
144
- }));
145
- if (result?.clicked) {
146
- const verified = opts.verifySelector
147
- ? await verifyAction(ctx, tabId, opts.verifySelector, opts.verifyChange)
148
- : undefined;
149
- return { clicked: true, method: `aria:${opts.ariaLabels[0]}`, verified };
150
- }
151
- }
152
- catch { /* try next method */ }
153
- }
154
- // Scroll and retry on non-final attempts
155
- if (opts.scrollToFind !== false && attempt < maxRetries - 1) {
156
- await call(ctx, "scrollPage", { tabId, deltaY: 400, smooth: true });
157
- await sleep(500);
158
- }
159
- }
160
- throw new Error(`Click failed after ${maxRetries} attempts. Tried: ` +
161
- [
162
- opts.selectors?.length ? `selectors(${opts.selectors.length})` : null,
163
- opts.texts?.length ? `texts(${opts.texts.join(",")})` : null,
164
- opts.ariaLabels?.length ? `aria(${opts.ariaLabels.join(",")})` : null,
165
- ].filter(Boolean).join(", "));
166
- }
167
- /**
168
- * Type with retry and value verification.
169
- * After typing, optionally reads back the field to confirm the text was accepted.
170
- * For contenteditable (LinkedIn, X), uses execCommand internally.
171
- */
172
- export async function resilientType(ctx, tabId, opts) {
173
- const maxRetries = opts.maxRetries ?? 3;
174
- // Focus tab first
175
- await call(ctx, "focusTab", { tabId });
176
- await sleep(300);
177
- for (let attempt = 0; attempt < maxRetries; attempt++) {
178
- try {
179
- const result = (await call(ctx, "typeText", {
180
- tabId,
181
- selectors: opts.selectors,
182
- value: opts.value,
183
- }));
184
- if (result?.typed) {
185
- // Verify by extracting the field's current value
186
- let verified;
187
- if (opts.verify) {
188
- await sleep(300);
189
- verified = await verifyTyped(ctx, tabId, opts.selectors, opts.value);
190
- if (!verified && attempt < maxRetries - 1) {
191
- continue; // retry — the text wasn't accepted
192
- }
193
- }
194
- // Press Enter if requested
195
- let pressedEnter;
196
- if (opts.pressEnter) {
197
- await sleep(200);
198
- try {
199
- await call(ctx, "pressKey", { tabId, key: "Enter", selectors: opts.selectors });
200
- pressedEnter = true;
201
- }
202
- catch {
203
- pressedEnter = false;
204
- }
205
- }
206
- return { typed: true, verified, pressedEnter };
207
- }
208
- }
209
- catch { /* retry */ }
210
- // Wait before retry
211
- await sleep(500);
212
- }
213
- throw new Error(`Type failed after ${maxRetries} attempts. Selectors: ${opts.selectors.join(", ")}`);
214
- }
215
- // ── Verification helpers ────────────────────────────────────
216
- async function verifyAction(ctx, tabId, selector, change) {
217
- await sleep(500);
218
- try {
219
- const result = (await call(ctx, "findElements", {
220
- tabId,
221
- selectors: [selector],
222
- limit: 1,
223
- }));
224
- const exists = Array.isArray(result) && result.length > 0;
225
- switch (change) {
226
- case "appears": return exists;
227
- case "disappears": return !exists;
228
- case "changes": return true; // can't verify generic "changed" without before/after
229
- default: return exists;
230
- }
231
- }
232
- catch {
233
- return false;
234
- }
235
- }
236
- async function verifyTyped(ctx, tabId, selectors, expectedValue) {
237
- try {
238
- const elements = (await call(ctx, "findElements", {
239
- tabId,
240
- selectors,
241
- limit: 1,
242
- }));
243
- if (!elements?.length)
244
- return false;
245
- const el = elements[0];
246
- // Check textContent or value
247
- const text = String(el.textContent ?? el.value ?? el.innerText ?? "");
248
- // Fuzzy match — the field should contain at least part of our text
249
- return text.includes(expectedValue.slice(0, 20)) || text.length > 0;
250
- }
251
- catch {
252
- return false;
253
- }
254
- }
255
- /**
256
- * Check if a tab is healthy and ready for interaction.
257
- * Verifies: extension connected, tab accessible, no login wall/captcha.
258
- * Call this before any recipe execution.
259
- */
260
- export async function healthCheck(ctx, tabId) {
261
- const status = {
262
- extensionConnected: true, // if we got here, extension is connected
263
- tabAccessible: false,
264
- blockerDetected: false,
265
- ready: false,
266
- };
267
- // Check tab is accessible
268
- try {
269
- const tabs = (await call(ctx, "listTabs", {}));
270
- const tab = tabs?.find((t) => t.id === tabId);
271
- if (tab) {
272
- status.tabAccessible = true;
273
- status.tabUrl = tab.url;
274
- }
275
- }
276
- catch {
277
- return status;
278
- }
279
- // Check for blockers (login walls, captchas, rate limits)
280
- try {
281
- const blocker = (await call(ctx, "detectBlocker", { tabId }));
282
- if (blocker?.blocked) {
283
- status.blockerDetected = true;
284
- status.blockerType = blocker.type;
285
- return status;
286
- }
287
- }
288
- catch {
289
- // detectBlocker not available or errored — assume OK
290
- }
291
- status.ready = status.tabAccessible && !status.blockerDetected;
292
- return status;
293
- }
294
- // ── Scroll to latest ────────────────────────────────────────
295
- /**
296
- * Scroll a container to its bottom to load the latest content.
297
- * Tries: specific container selector → general page scroll.
298
- * Waits for content to load after scrolling.
299
- */
300
- export async function scrollToLatest(ctx, tabId, containerSelector) {
301
- if (containerSelector) {
302
- // Try to scroll the specific container
303
- try {
304
- await call(ctx, "scrollPage", {
305
- tabId,
306
- selector: containerSelector,
307
- });
308
- await sleep(800);
309
- return;
310
- }
311
- catch {
312
- // Fall through to generic scroll
313
- }
314
- }
315
- // Generic: scroll the page to the bottom
316
- await call(ctx, "scrollPage", { tabId, deltaY: 99999, smooth: true });
317
- await sleep(800);
318
- }
319
- //# sourceMappingURL=resilience.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resilience.js","sourceRoot":"","sources":["../src/resilience.ts"],"names":[],"mappings":"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"}