neuron-inspector 1.0.0 → 1.2.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 CHANGED
@@ -102,7 +102,7 @@ Each bridge logs its data directory on startup so you can confirm isolation:
102
102
 
103
103
  ```
104
104
  [bridge] Data directory: /Users/you/.neuron/letschop
105
- [bridge] Primary mode — WebSocket server on 127.0.0.1:7378
105
+ [bridge] Primary mode — HTTP + WebSocket server on 127.0.0.1:7378
106
106
  ```
107
107
 
108
108
  Data layout:
@@ -157,13 +157,21 @@ The agent calls `neuron_perf_snapshot` and gets back Core Web Vitals, render-blo
157
157
 
158
158
  ### Monitor and track
159
159
 
160
- > "Watch this collection for new items matching 'logistics'"
160
+ > "Alert me when a 500 hits /api/orders"
161
161
 
162
- `neuron_collection_watch` creates a persistent monitor that alerts when matching content appears.
162
+ `neuron_monitor_create` with `request_match` condition — watches the ring buffers for HTTP requests matching a URL pattern and status range. No tab opened.
163
163
 
164
- > "Show me all opportunities from the last 24 hours"
164
+ > "Alert when a console error matching PaymentFailed appears"
165
165
 
166
- `neuron_opportunity_radar` aggregates alerts from all your monitors into one feed.
166
+ `neuron_monitor_create` with `console_match` condition — watches console logs for matching messages. No tab opened.
167
+
168
+ > "Trigger actions from a Google Sheet edit"
169
+
170
+ Every monitor gets a webhook URL. Apps Script calls `POST http://127.0.0.1:7377/hooks/:monitorId` with a JSON payload and the monitor's action chain executes.
171
+
172
+ > "Watch this page for price drops and auto-screenshot when it triggers"
173
+
174
+ `neuron_monitor_create` with `price_below` condition and a `screenshot` action. The monitor opens the page, checks the price, and runs the action chain if triggered.
167
175
 
168
176
  > "Track who mentions our brand across platforms"
169
177
 
@@ -411,7 +419,7 @@ Manage and run recipe workflows — purpose-built agents that get better with ev
411
419
 
412
420
  | Tool | What it does |
413
421
  |------|-------------|
414
- | `neuron_monitor_create` | Create a page monitor |
422
+ | `neuron_monitor_create` | Create a monitor (page, traffic, or console). Returns a webhook URL for external triggers |
415
423
  | `neuron_monitor_list` | List all monitors |
416
424
  | `neuron_monitor_get` | Get monitor details |
417
425
  | `neuron_monitor_update` | Update monitor config |
@@ -420,6 +428,21 @@ Manage and run recipe workflows — purpose-built agents that get better with ev
420
428
  | `neuron_monitor_check` | Force an immediate check |
421
429
  | `neuron_monitor_alerts` | Get recent alerts |
422
430
 
431
+ **Condition types:**
432
+
433
+ | Type | What it watches | Needs a tab? |
434
+ |------|----------------|--------------|
435
+ | `content_change` | Any change in page content | Yes |
436
+ | `text_appears` | Specific text appears on page | Yes |
437
+ | `text_disappears` | Specific text disappears from page | Yes |
438
+ | `price_below` | Price drops below a threshold | Yes |
439
+ | `new_items` | New items in a list/feed | Yes |
440
+ | `selector_change` | Specific CSS selector content changes | Yes |
441
+ | `request_match` | HTTP requests matching URL pattern, method, status range | No — queries ring buffers |
442
+ | `console_match` | Console messages matching search text and log levels | No — queries ring buffers |
443
+
444
+ **Inbound webhook:** Every monitor exposes `POST /hooks/:monitorId` on the bridge's HTTP server. External systems (Google Sheets Apps Script, n8n, Zapier, cron jobs) can POST to this endpoint to trigger the monitor's action chain. The webhook URL is returned on creation and shown in the UI.
445
+
423
446
  ### Control Tools (4 tools)
424
447
 
425
448
  | Tool | What it does |
@@ -537,14 +560,14 @@ npx tsc --noEmit
537
560
 
538
561
  | File | Purpose |
539
562
  |------|---------|
540
- | `server.ts` | MCP server, WebSocket bridge, tool registration |
563
+ | `server.ts` | MCP server, HTTP + WebSocket bridge, webhook handler, tool registration |
541
564
  | `tools.ts` | Browser primitive definitions + name mapping |
542
565
  | `compound-tools.ts` | Compound tools (research, search, fill, audit, media) |
543
566
  | `business-tools.ts` | 29 business intelligence and developer tools |
544
567
  | `recipe-tools.ts` | Recipe management + rules + profile |
545
568
  | `scheduler.ts` | Cron-like recipe scheduling |
546
569
  | `session-state.ts` | Session state persistence |
547
- | `monitor.ts` | Page monitoring with alerts |
570
+ | `monitor.ts` | Page, traffic, and console monitoring with alerts and action chains |
548
571
  | `killswitch.ts` | Emergency stop, pause, resume |
549
572
  | `resilience.ts` | Retry, wait, health check helpers |
550
573
  | `correlation.ts` | WebSocket request/response correlation |
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,411 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { mergeCollections } from "../merge.js";
3
+ function makeCollection(overrides = {}) {
4
+ return { name: "Base", ...overrides };
5
+ }
6
+ // ── Additive merge (no overlap) ──────────────────────────────────
7
+ describe("additive merge (no overlap)", () => {
8
+ it("adds new folders from incoming", () => {
9
+ const base = makeCollection({
10
+ folders: {
11
+ auth: { endpoints: [{ name: "Login", method: "POST", path: "/login" }] },
12
+ },
13
+ });
14
+ const incoming = makeCollection({
15
+ name: "Incoming",
16
+ folders: {
17
+ orders: { endpoints: [{ name: "List Orders", method: "GET", path: "/orders" }] },
18
+ },
19
+ });
20
+ const result = mergeCollections(base, incoming);
21
+ expect(result.collection.folders).toHaveProperty("auth");
22
+ expect(result.collection.folders).toHaveProperty("orders");
23
+ expect(result.stats.folders_added).toBe(1);
24
+ expect(result.stats.endpoints_added).toBe(1);
25
+ expect(result.stats.endpoints_updated).toBe(0);
26
+ });
27
+ it("adds new environments from incoming", () => {
28
+ const base = makeCollection({
29
+ environments: { dev: { base_url: "http://localhost:3000" } },
30
+ });
31
+ const incoming = makeCollection({
32
+ name: "Incoming",
33
+ environments: { staging: { base_url: "https://staging.example.com" } },
34
+ });
35
+ const result = mergeCollections(base, incoming);
36
+ expect(result.collection.environments).toHaveProperty("dev");
37
+ expect(result.collection.environments).toHaveProperty("staging");
38
+ expect(result.stats.environments_added).toBe(1);
39
+ });
40
+ it("adds new scenarios from incoming", () => {
41
+ const base = makeCollection({
42
+ scenarios: {
43
+ login: { steps: [{ ref: "auth/POST /login" }] },
44
+ },
45
+ });
46
+ const incoming = makeCollection({
47
+ name: "Incoming",
48
+ scenarios: {
49
+ checkout: { steps: [{ ref: "orders/POST /checkout" }] },
50
+ },
51
+ });
52
+ const result = mergeCollections(base, incoming);
53
+ expect(result.collection.scenarios).toHaveProperty("login");
54
+ expect(result.collection.scenarios).toHaveProperty("checkout");
55
+ expect(result.stats.scenarios_added).toBe(1);
56
+ });
57
+ });
58
+ // ── Endpoint conflict ────────────────────────────────────────────
59
+ describe("endpoint conflict (same method+path)", () => {
60
+ it("replaces endpoint with incoming version when method+path match", () => {
61
+ const base = makeCollection({
62
+ folders: {
63
+ auth: {
64
+ endpoints: [
65
+ { name: "Login", method: "POST", path: "/login", body: { email: "old" } },
66
+ { name: "Me", method: "GET", path: "/me" },
67
+ ],
68
+ },
69
+ },
70
+ });
71
+ const incoming = makeCollection({
72
+ name: "Incoming",
73
+ folders: {
74
+ auth: {
75
+ endpoints: [
76
+ { name: "Login V2", method: "POST", path: "/login", body: { email: "new", mfa: true } },
77
+ { name: "Register", method: "POST", path: "/register" },
78
+ ],
79
+ },
80
+ },
81
+ });
82
+ const result = mergeCollections(base, incoming);
83
+ const authEndpoints = result.collection.folders.auth.endpoints;
84
+ expect(authEndpoints).toHaveLength(3);
85
+ const loginEp = authEndpoints.find((ep) => ep.method === "POST" && ep.path === "/login");
86
+ expect(loginEp.name).toBe("Login V2");
87
+ expect(loginEp.body).toEqual({ email: "new", mfa: true });
88
+ expect(result.stats.endpoints_updated).toBe(1);
89
+ expect(result.stats.endpoints_added).toBe(1);
90
+ });
91
+ it("matches endpoints case-insensitively on method", () => {
92
+ const base = makeCollection({
93
+ folders: {
94
+ api: { endpoints: [{ name: "Get Items", method: "get", path: "/items" }] },
95
+ },
96
+ });
97
+ const incoming = makeCollection({
98
+ name: "Incoming",
99
+ folders: {
100
+ api: { endpoints: [{ name: "Get Items V2", method: "GET", path: "/items" }] },
101
+ },
102
+ });
103
+ const result = mergeCollections(base, incoming);
104
+ expect(result.collection.folders.api.endpoints).toHaveLength(1);
105
+ expect(result.collection.folders.api.endpoints[0].name).toBe("Get Items V2");
106
+ expect(result.stats.endpoints_updated).toBe(1);
107
+ });
108
+ });
109
+ // ── Environment deep merge ───────────────────────────────────────
110
+ describe("environment deep merge", () => {
111
+ it("deep-merges variables and headers within existing environments", () => {
112
+ const base = makeCollection({
113
+ environments: {
114
+ dev: {
115
+ base_url: "http://localhost:3000",
116
+ variables: { api_key: "base-key", debug: "true" },
117
+ headers: { "X-Custom": "base-value" },
118
+ },
119
+ },
120
+ });
121
+ const incoming = makeCollection({
122
+ name: "Incoming",
123
+ environments: {
124
+ dev: {
125
+ base_url: "http://incoming:4000",
126
+ variables: { api_key: "incoming-key", version: "2" },
127
+ headers: { "X-New": "new-value" },
128
+ },
129
+ },
130
+ });
131
+ const result = mergeCollections(base, incoming);
132
+ const dev = result.collection.environments.dev;
133
+ // base_url: base keeps its own (it already has one)
134
+ expect(dev.base_url).toBe("http://localhost:3000");
135
+ // variables deep-merged, incoming wins on conflict
136
+ expect(dev.variables).toEqual({ api_key: "incoming-key", debug: "true", version: "2" });
137
+ // headers deep-merged
138
+ expect(dev.headers).toEqual({ "X-Custom": "base-value", "X-New": "new-value" });
139
+ expect(result.stats.environments_updated).toBe(1);
140
+ });
141
+ it("takes base_url from incoming when base env has none", () => {
142
+ const base = makeCollection({
143
+ environments: {
144
+ dev: { base_url: "" },
145
+ },
146
+ });
147
+ const incoming = makeCollection({
148
+ name: "Incoming",
149
+ environments: {
150
+ dev: { base_url: "http://incoming:4000" },
151
+ },
152
+ });
153
+ const result = mergeCollections(base, incoming);
154
+ // Empty string is falsy, so incoming wins
155
+ expect(result.collection.environments.dev.base_url).toBe("http://incoming:4000");
156
+ });
157
+ });
158
+ // ── Scenario skip ────────────────────────────────────────────────
159
+ describe("scenario merge", () => {
160
+ it("keeps base scenario when names conflict", () => {
161
+ const base = makeCollection({
162
+ scenarios: {
163
+ login: { steps: [{ ref: "auth/POST /login" }] },
164
+ },
165
+ });
166
+ const incoming = makeCollection({
167
+ name: "Incoming",
168
+ scenarios: {
169
+ login: { steps: [{ ref: "auth/POST /login" }, { ref: "auth/GET /me" }] },
170
+ },
171
+ });
172
+ const result = mergeCollections(base, incoming);
173
+ // Base scenario kept (1 step, not 2)
174
+ expect(result.collection.scenarios.login.steps).toHaveLength(1);
175
+ expect(result.stats.scenarios_skipped).toBe(1);
176
+ expect(result.stats.scenarios_added).toBe(0);
177
+ });
178
+ });
179
+ // ── Defaults deep merge ─────────────────────────────────────────
180
+ describe("defaults merge", () => {
181
+ it("deep-merges headers and variables, keeps base scalars", () => {
182
+ const base = makeCollection({
183
+ defaults: {
184
+ headers: { Authorization: "Bearer base" },
185
+ variables: { env: "base" },
186
+ timeout_ms: 5000,
187
+ },
188
+ });
189
+ const incoming = makeCollection({
190
+ name: "Incoming",
191
+ defaults: {
192
+ headers: { "X-New": "header", Authorization: "Bearer incoming" },
193
+ variables: { region: "us" },
194
+ timeout_ms: 10000,
195
+ auth: { type: "bearer", token: "tok" },
196
+ },
197
+ });
198
+ const result = mergeCollections(base, incoming);
199
+ const defaults = result.collection.defaults;
200
+ // Headers deep-merged, incoming wins per key
201
+ expect(defaults.headers).toEqual({ Authorization: "Bearer incoming", "X-New": "header" });
202
+ // Variables deep-merged
203
+ expect(defaults.variables).toEqual({ env: "base", region: "us" });
204
+ // Scalar: base keeps its timeout
205
+ expect(defaults.timeout_ms).toBe(5000);
206
+ // Auth: base had none, so take incoming
207
+ expect(defaults.auth).toEqual({ type: "bearer", token: "tok" });
208
+ });
209
+ it("takes incoming defaults wholesale when base has none", () => {
210
+ const base = makeCollection({});
211
+ const incoming = makeCollection({
212
+ name: "Incoming",
213
+ defaults: {
214
+ headers: { "X-Test": "val" },
215
+ timeout_ms: 3000,
216
+ },
217
+ });
218
+ const result = mergeCollections(base, incoming);
219
+ expect(result.collection.defaults).toEqual({ headers: { "X-Test": "val" }, timeout_ms: 3000 });
220
+ });
221
+ it("returns base defaults unchanged when incoming has none", () => {
222
+ const base = makeCollection({
223
+ defaults: { timeout_ms: 5000 },
224
+ });
225
+ const incoming = makeCollection({ name: "Incoming" });
226
+ const result = mergeCollections(base, incoming);
227
+ expect(result.collection.defaults).toEqual({ timeout_ms: 5000 });
228
+ });
229
+ });
230
+ // ── Stats accuracy ──────────────────────────────────────────────
231
+ describe("stats accuracy", () => {
232
+ it("counts all operations correctly in a mixed merge", () => {
233
+ const base = makeCollection({
234
+ folders: {
235
+ auth: {
236
+ endpoints: [
237
+ { name: "Login", method: "POST", path: "/login" },
238
+ { name: "Me", method: "GET", path: "/me" },
239
+ ],
240
+ },
241
+ },
242
+ environments: { dev: { base_url: "http://localhost" } },
243
+ scenarios: { "login-flow": { steps: [{ ref: "auth/POST /login" }] } },
244
+ });
245
+ const incoming = makeCollection({
246
+ name: "Incoming",
247
+ folders: {
248
+ auth: {
249
+ endpoints: [
250
+ { name: "Login New", method: "POST", path: "/login" },
251
+ { name: "Register", method: "POST", path: "/register" },
252
+ ],
253
+ },
254
+ orders: {
255
+ endpoints: [{ name: "List", method: "GET", path: "/orders" }],
256
+ },
257
+ },
258
+ environments: {
259
+ dev: { base_url: "http://incoming", variables: { key: "val" } },
260
+ staging: { base_url: "https://staging.example.com" },
261
+ },
262
+ scenarios: {
263
+ "login-flow": { steps: [{ ref: "auth/POST /login" }, { ref: "auth/GET /me" }] },
264
+ "order-flow": { steps: [{ ref: "orders/GET /orders" }] },
265
+ },
266
+ });
267
+ const result = mergeCollections(base, incoming);
268
+ expect(result.stats).toEqual({
269
+ endpoints_added: 2, // POST /register + GET /orders (from new folder)
270
+ endpoints_updated: 1, // POST /login replaced
271
+ environments_added: 1, // staging
272
+ environments_updated: 1, // dev
273
+ folders_added: 1, // orders
274
+ scenarios_added: 1, // order-flow
275
+ scenarios_skipped: 1, // login-flow kept base
276
+ });
277
+ });
278
+ });
279
+ // ── Empty collections ───────────────────────────────────────────
280
+ describe("empty collections", () => {
281
+ it("handles merging two empty collections", () => {
282
+ const base = makeCollection({});
283
+ const incoming = makeCollection({ name: "Incoming" });
284
+ const result = mergeCollections(base, incoming);
285
+ expect(result.collection.name).toBe("Base");
286
+ expect(result.stats).toEqual({
287
+ endpoints_added: 0,
288
+ endpoints_updated: 0,
289
+ environments_added: 0,
290
+ environments_updated: 0,
291
+ folders_added: 0,
292
+ scenarios_added: 0,
293
+ scenarios_skipped: 0,
294
+ });
295
+ expect(result.conflicts).toHaveLength(0);
296
+ });
297
+ it("handles merging into empty base from populated incoming", () => {
298
+ const base = makeCollection({});
299
+ const incoming = makeCollection({
300
+ name: "Incoming",
301
+ folders: {
302
+ auth: { endpoints: [{ name: "Login", method: "POST", path: "/login" }] },
303
+ },
304
+ environments: { dev: { base_url: "http://localhost" } },
305
+ scenarios: { flow: { steps: [{ ref: "auth/POST /login" }] } },
306
+ });
307
+ const result = mergeCollections(base, incoming);
308
+ expect(result.collection.name).toBe("Base");
309
+ expect(result.collection.folders).toHaveProperty("auth");
310
+ expect(result.collection.environments).toHaveProperty("dev");
311
+ expect(result.collection.scenarios).toHaveProperty("flow");
312
+ expect(result.stats.folders_added).toBe(1);
313
+ expect(result.stats.endpoints_added).toBe(1);
314
+ expect(result.stats.environments_added).toBe(1);
315
+ expect(result.stats.scenarios_added).toBe(1);
316
+ });
317
+ it("returns base unchanged when incoming is empty", () => {
318
+ const base = makeCollection({
319
+ folders: {
320
+ auth: { endpoints: [{ name: "Login", method: "POST", path: "/login" }] },
321
+ },
322
+ });
323
+ const incoming = makeCollection({ name: "Incoming" });
324
+ const result = mergeCollections(base, incoming);
325
+ expect(result.collection.folders.auth.endpoints).toHaveLength(1);
326
+ expect(result.stats.endpoints_added).toBe(0);
327
+ expect(result.stats.endpoints_updated).toBe(0);
328
+ expect(result.conflicts).toHaveLength(0);
329
+ });
330
+ });
331
+ // ── Identity and immutability ───────────────────────────────────
332
+ describe("identity preservation", () => {
333
+ it("keeps base name, version, and active_environment", () => {
334
+ const base = makeCollection({
335
+ name: "My API",
336
+ version: "2.0.0",
337
+ active_environment: "dev",
338
+ });
339
+ const incoming = makeCollection({
340
+ name: "Their API",
341
+ version: "3.0.0",
342
+ active_environment: "staging",
343
+ });
344
+ const result = mergeCollections(base, incoming);
345
+ expect(result.collection.name).toBe("My API");
346
+ expect(result.collection.version).toBe("2.0.0");
347
+ expect(result.collection.active_environment).toBe("dev");
348
+ });
349
+ it("does not mutate the input collections", () => {
350
+ const base = makeCollection({
351
+ folders: {
352
+ auth: { endpoints: [{ name: "Login", method: "POST", path: "/login" }] },
353
+ },
354
+ });
355
+ const incoming = makeCollection({
356
+ name: "Incoming",
357
+ folders: {
358
+ auth: { endpoints: [{ name: "Register", method: "POST", path: "/register" }] },
359
+ },
360
+ });
361
+ const baseSnapshot = JSON.stringify(base);
362
+ const incomingSnapshot = JSON.stringify(incoming);
363
+ mergeCollections(base, incoming);
364
+ expect(JSON.stringify(base)).toBe(baseSnapshot);
365
+ expect(JSON.stringify(incoming)).toBe(incomingSnapshot);
366
+ });
367
+ });
368
+ // ── Folder-level headers/variables merge ────────────────────────
369
+ describe("folder-level metadata merge", () => {
370
+ it("deep-merges folder headers and variables", () => {
371
+ const base = makeCollection({
372
+ folders: {
373
+ auth: {
374
+ headers: { Authorization: "Bearer base" },
375
+ variables: { host: "base-host" },
376
+ endpoints: [],
377
+ },
378
+ },
379
+ });
380
+ const incoming = makeCollection({
381
+ name: "Incoming",
382
+ folders: {
383
+ auth: {
384
+ headers: { "X-New": "val", Authorization: "Bearer incoming" },
385
+ variables: { version: "2" },
386
+ endpoints: [],
387
+ },
388
+ },
389
+ });
390
+ const result = mergeCollections(base, incoming);
391
+ const auth = result.collection.folders.auth;
392
+ expect(auth.headers).toEqual({ Authorization: "Bearer incoming", "X-New": "val" });
393
+ expect(auth.variables).toEqual({ host: "base-host", version: "2" });
394
+ });
395
+ });
396
+ // ── Description merge ───────────────────────────────────────────
397
+ describe("description merge", () => {
398
+ it("takes incoming description when base has none", () => {
399
+ const base = makeCollection({});
400
+ const incoming = makeCollection({ name: "Incoming", description: "From incoming" });
401
+ const result = mergeCollections(base, incoming);
402
+ expect(result.collection.description).toBe("From incoming");
403
+ });
404
+ it("keeps base description when both have one", () => {
405
+ const base = makeCollection({ description: "Base desc" });
406
+ const incoming = makeCollection({ name: "Incoming", description: "Incoming desc" });
407
+ const result = mergeCollections(base, incoming);
408
+ expect(result.collection.description).toBe("Base desc");
409
+ });
410
+ });
411
+ //# sourceMappingURL=merge.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.test.js","sourceRoot":"","sources":["../../../src/collections/__tests__/merge.test.ts"],"names":[],"mappings":"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"}
@@ -10,3 +10,5 @@ export { buildDefaultRegistry, DynamicVarRegistry } from "./dynamic-vars.js";
10
10
  export { DeclarativeScriptRunner, JsScriptRunner } from "./scripts.js";
11
11
  export { executeEndpoint, executeFolder, executeCollection, executeScenario } from "./executor.js";
12
12
  export { fromPostmanV21, toPostmanV21 } from "./postman.js";
13
+ export { mergeCollections } from "./merge.js";
14
+ export type { MergeConflict, MergeStats, MergeResult } from "./merge.js";
@@ -24,4 +24,5 @@ export { buildDefaultRegistry, DynamicVarRegistry } from "./dynamic-vars.js";
24
24
  export { DeclarativeScriptRunner, JsScriptRunner } from "./scripts.js";
25
25
  export { executeEndpoint, executeFolder, executeCollection, executeScenario } from "./executor.js";
26
26
  export { fromPostmanV21, toPostmanV21 } from "./postman.js";
27
+ export { mergeCollections } from "./merge.js";
27
28
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/collections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAI1E,mEAAmE;AACnE,+CAA+C;AAC/C,+DAA+D;AAE/D,MAAM,KAAK,GAAG,IAAI,mBAAmB,EAAE,CAAC;AACxC,MAAM,YAAY,GAAG,IAAI,iBAAiB,EAAE,CAAC;AAC7C,MAAM,kBAAkB,GAAG,oBAAoB,EAAE,CAAC;AAClD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;AAC1D,MAAM,kBAAkB,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAClD,MAAM,YAAY,GAAG,IAAI,cAAc,EAAE,CAAC;AAE1C,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,EAAE,CAAC;AACvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE,YAAY,CAAC,CAAC;AAuB5H,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC7G,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/collections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAI1E,mEAAmE;AACnE,+CAA+C;AAC/C,+DAA+D;AAE/D,MAAM,KAAK,GAAG,IAAI,mBAAmB,EAAE,CAAC;AACxC,MAAM,YAAY,GAAG,IAAI,iBAAiB,EAAE,CAAC;AAC7C,MAAM,kBAAkB,GAAG,oBAAoB,EAAE,CAAC;AAClD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;AAC1D,MAAM,kBAAkB,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAClD,MAAM,YAAY,GAAG,IAAI,cAAc,EAAE,CAAC;AAE1C,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,EAAE,CAAC;AACvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE,YAAY,CAAC,CAAC;AAuB5H,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC7G,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { Collection } from "./types.js";
2
+ export interface MergeConflict {
3
+ path: string;
4
+ type: "overwritten" | "added" | "skipped";
5
+ detail: string;
6
+ }
7
+ export interface MergeStats {
8
+ endpoints_added: number;
9
+ endpoints_updated: number;
10
+ environments_added: number;
11
+ environments_updated: number;
12
+ folders_added: number;
13
+ scenarios_added: number;
14
+ scenarios_skipped: number;
15
+ }
16
+ export interface MergeResult {
17
+ collection: Collection;
18
+ conflicts: MergeConflict[];
19
+ stats: MergeStats;
20
+ }
21
+ export declare function mergeCollections(base: Collection, incoming: Collection): MergeResult;