procsi 0.2.7 → 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.
Files changed (142) hide show
  1. package/README.md +341 -214
  2. package/dist/cli/commands/completions.d.ts +9 -0
  3. package/dist/cli/commands/completions.d.ts.map +1 -0
  4. package/dist/cli/commands/completions.js +170 -0
  5. package/dist/cli/commands/completions.js.map +1 -0
  6. package/dist/cli/commands/helpers.d.ts +9 -0
  7. package/dist/cli/commands/helpers.d.ts.map +1 -1
  8. package/dist/cli/commands/helpers.js +19 -1
  9. package/dist/cli/commands/helpers.js.map +1 -1
  10. package/dist/cli/commands/interceptors.d.ts.map +1 -1
  11. package/dist/cli/commands/interceptors.js +142 -0
  12. package/dist/cli/commands/interceptors.js.map +1 -1
  13. package/dist/cli/commands/off.d.ts.map +1 -1
  14. package/dist/cli/commands/off.js +1 -0
  15. package/dist/cli/commands/off.js.map +1 -1
  16. package/dist/cli/commands/on.d.ts.map +1 -1
  17. package/dist/cli/commands/on.js +3 -1
  18. package/dist/cli/commands/on.js.map +1 -1
  19. package/dist/cli/commands/request.d.ts +6 -0
  20. package/dist/cli/commands/request.d.ts.map +1 -0
  21. package/dist/cli/commands/request.js +216 -0
  22. package/dist/cli/commands/request.js.map +1 -0
  23. package/dist/cli/commands/requests.d.ts +6 -0
  24. package/dist/cli/commands/requests.d.ts.map +1 -0
  25. package/dist/cli/commands/requests.js +290 -0
  26. package/dist/cli/commands/requests.js.map +1 -0
  27. package/dist/cli/commands/sessions.d.ts +6 -0
  28. package/dist/cli/commands/sessions.d.ts.map +1 -0
  29. package/dist/cli/commands/sessions.js +39 -0
  30. package/dist/cli/commands/sessions.js.map +1 -0
  31. package/dist/cli/formatters/colour.d.ts +17 -0
  32. package/dist/cli/formatters/colour.d.ts.map +1 -0
  33. package/dist/cli/formatters/colour.js +23 -0
  34. package/dist/cli/formatters/colour.js.map +1 -0
  35. package/dist/cli/formatters/detail.d.ts +17 -0
  36. package/dist/cli/formatters/detail.d.ts.map +1 -0
  37. package/dist/cli/formatters/detail.js +135 -0
  38. package/dist/cli/formatters/detail.js.map +1 -0
  39. package/dist/cli/formatters/hints.d.ts +17 -0
  40. package/dist/cli/formatters/hints.d.ts.map +1 -0
  41. package/dist/cli/formatters/hints.js +29 -0
  42. package/dist/cli/formatters/hints.js.map +1 -0
  43. package/dist/cli/formatters/table.d.ts +17 -0
  44. package/dist/cli/formatters/table.d.ts.map +1 -0
  45. package/dist/cli/formatters/table.js +85 -0
  46. package/dist/cli/formatters/table.js.map +1 -0
  47. package/dist/cli/index.js +8 -0
  48. package/dist/cli/index.js.map +1 -1
  49. package/dist/cli/tui/App.d.ts.map +1 -1
  50. package/dist/cli/tui/App.js +67 -6
  51. package/dist/cli/tui/App.js.map +1 -1
  52. package/dist/cli/tui/components/AccordionPanel.d.ts.map +1 -1
  53. package/dist/cli/tui/components/AccordionPanel.js +1 -1
  54. package/dist/cli/tui/components/AccordionPanel.js.map +1 -1
  55. package/dist/cli/tui/components/EventFilterBar.d.ts +27 -0
  56. package/dist/cli/tui/components/EventFilterBar.d.ts.map +1 -0
  57. package/dist/cli/tui/components/EventFilterBar.js +145 -0
  58. package/dist/cli/tui/components/EventFilterBar.js.map +1 -0
  59. package/dist/cli/tui/components/FilterBar.d.ts.map +1 -1
  60. package/dist/cli/tui/components/FilterBar.js +34 -3
  61. package/dist/cli/tui/components/FilterBar.js.map +1 -1
  62. package/dist/cli/tui/components/HelpModal.d.ts.map +1 -1
  63. package/dist/cli/tui/components/HelpModal.js +3 -0
  64. package/dist/cli/tui/components/HelpModal.js.map +1 -1
  65. package/dist/cli/tui/components/InfoBar.d.ts +15 -0
  66. package/dist/cli/tui/components/InfoBar.d.ts.map +1 -0
  67. package/dist/cli/tui/components/InfoBar.js +45 -0
  68. package/dist/cli/tui/components/InfoBar.js.map +1 -0
  69. package/dist/cli/tui/components/InterceptorLogModal.d.ts +16 -0
  70. package/dist/cli/tui/components/InterceptorLogModal.d.ts.map +1 -0
  71. package/dist/cli/tui/components/InterceptorLogModal.js +229 -0
  72. package/dist/cli/tui/components/InterceptorLogModal.js.map +1 -0
  73. package/dist/cli/tui/components/RequestListItem.d.ts.map +1 -1
  74. package/dist/cli/tui/components/RequestListItem.js +3 -2
  75. package/dist/cli/tui/components/RequestListItem.js.map +1 -1
  76. package/dist/cli/tui/components/StatusBar.d.ts +7 -2
  77. package/dist/cli/tui/components/StatusBar.d.ts.map +1 -1
  78. package/dist/cli/tui/components/StatusBar.js +13 -6
  79. package/dist/cli/tui/components/StatusBar.js.map +1 -1
  80. package/dist/cli/tui/hooks/useInterceptorEvents.d.ts +33 -0
  81. package/dist/cli/tui/hooks/useInterceptorEvents.d.ts.map +1 -0
  82. package/dist/cli/tui/hooks/useInterceptorEvents.js +88 -0
  83. package/dist/cli/tui/hooks/useInterceptorEvents.js.map +1 -0
  84. package/dist/cli/tui/hooks/useRequests.d.ts +4 -0
  85. package/dist/cli/tui/hooks/useRequests.d.ts.map +1 -1
  86. package/dist/cli/tui/hooks/useRequests.js +36 -0
  87. package/dist/cli/tui/hooks/useRequests.js.map +1 -1
  88. package/dist/cli/tui/utils/filters.d.ts.map +1 -1
  89. package/dist/cli/tui/utils/filters.js +3 -1
  90. package/dist/cli/tui/utils/filters.js.map +1 -1
  91. package/dist/cli/utils/parse-time.d.ts +22 -0
  92. package/dist/cli/utils/parse-time.d.ts.map +1 -0
  93. package/dist/cli/utils/parse-time.js +160 -0
  94. package/dist/cli/utils/parse-time.js.map +1 -0
  95. package/dist/daemon/control.d.ts +2 -0
  96. package/dist/daemon/control.d.ts.map +1 -1
  97. package/dist/daemon/control.js +64 -2
  98. package/dist/daemon/control.js.map +1 -1
  99. package/dist/daemon/index.js +6 -1
  100. package/dist/daemon/index.js.map +1 -1
  101. package/dist/daemon/interceptor-event-log.d.ts +37 -0
  102. package/dist/daemon/interceptor-event-log.d.ts.map +1 -0
  103. package/dist/daemon/interceptor-event-log.js +163 -0
  104. package/dist/daemon/interceptor-event-log.js.map +1 -0
  105. package/dist/daemon/interceptor-loader.d.ts +3 -0
  106. package/dist/daemon/interceptor-loader.d.ts.map +1 -1
  107. package/dist/daemon/interceptor-loader.js +34 -2
  108. package/dist/daemon/interceptor-loader.js.map +1 -1
  109. package/dist/daemon/interceptor-runner.d.ts +3 -0
  110. package/dist/daemon/interceptor-runner.d.ts.map +1 -1
  111. package/dist/daemon/interceptor-runner.js +112 -8
  112. package/dist/daemon/interceptor-runner.js.map +1 -1
  113. package/dist/daemon/proxy.d.ts.map +1 -1
  114. package/dist/daemon/proxy.js +99 -4
  115. package/dist/daemon/proxy.js.map +1 -1
  116. package/dist/daemon/storage.d.ts +18 -4
  117. package/dist/daemon/storage.d.ts.map +1 -1
  118. package/dist/daemon/storage.js +111 -25
  119. package/dist/daemon/storage.js.map +1 -1
  120. package/dist/mcp/server.d.ts +3 -0
  121. package/dist/mcp/server.d.ts.map +1 -1
  122. package/dist/mcp/server.js +116 -3
  123. package/dist/mcp/server.js.map +1 -1
  124. package/dist/overrides/node.d.ts.map +1 -1
  125. package/dist/overrides/node.js +62 -0
  126. package/dist/overrides/node.js.map +1 -1
  127. package/dist/shared/constants.d.ts +10 -0
  128. package/dist/shared/constants.d.ts.map +1 -0
  129. package/dist/shared/constants.js +10 -0
  130. package/dist/shared/constants.js.map +1 -0
  131. package/dist/shared/control-client.d.ts +36 -3
  132. package/dist/shared/control-client.d.ts.map +1 -1
  133. package/dist/shared/control-client.js +27 -3
  134. package/dist/shared/control-client.js.map +1 -1
  135. package/dist/shared/process-name.d.ts +10 -0
  136. package/dist/shared/process-name.d.ts.map +1 -0
  137. package/dist/shared/process-name.js +27 -0
  138. package/dist/shared/process-name.js.map +1 -0
  139. package/dist/shared/types.d.ts +24 -0
  140. package/dist/shared/types.d.ts.map +1 -1
  141. package/package.json +2 -1
  142. package/skills/procsi/SKILL.md +5 -4
@@ -1,7 +1,21 @@
1
1
  import * as mockttp from "mockttp";
2
2
  import { createLogger } from "../shared/logger.js";
3
+ import { PROCSI_RUNTIME_SOURCE_HEADER, PROCSI_SESSION_ID_HEADER, PROCSI_SESSION_TOKEN_HEADER, } from "../shared/constants.js";
3
4
  /** Default maximum body size to capture (10MB) */
4
5
  export const DEFAULT_MAX_BODY_SIZE = 10 * 1024 * 1024;
6
+ const MAX_RUNTIME_SOURCE_LENGTH = 32;
7
+ const RUNTIME_SOURCE_PATTERN = /^[a-z0-9._-]+$/;
8
+ const LEGACY_SESSION_HEADER = "x-procsi-session";
9
+ function normaliseRuntimeSource(value) {
10
+ if (typeof value !== "string") {
11
+ return undefined;
12
+ }
13
+ const trimmed = value.trim().toLowerCase();
14
+ if (!trimmed || trimmed.length > MAX_RUNTIME_SOURCE_LENGTH) {
15
+ return undefined;
16
+ }
17
+ return RUNTIME_SOURCE_PATTERN.test(trimmed) ? trimmed : undefined;
18
+ }
5
19
  /**
6
20
  * Create and start a MITM proxy server that captures all HTTP/HTTPS traffic.
7
21
  */
@@ -12,6 +26,28 @@ export async function createProxy(options) {
12
26
  // Map to track request info for response correlation
13
27
  const requestInfo = new Map();
14
28
  const maxBodySize = options.maxBodySize ?? DEFAULT_MAX_BODY_SIZE;
29
+ // Cache session source lookups to avoid repeated DB queries
30
+ const sessionSourceCache = new Map();
31
+ function getSessionSource(sid) {
32
+ if (!sessionSourceCache.has(sid)) {
33
+ const session = storage.getSession(sid);
34
+ sessionSourceCache.set(sid, session?.source);
35
+ }
36
+ return sessionSourceCache.get(sid);
37
+ }
38
+ // Cache trusted session auth lookups by (sessionId, token)
39
+ const sessionAuthCache = new Map();
40
+ function getTrustedSessionSource(sid, token) {
41
+ const cacheKey = `${sid}:${token}`;
42
+ const cached = sessionAuthCache.get(cacheKey);
43
+ if (cached) {
44
+ return cached;
45
+ }
46
+ const auth = storage.getSessionAuth(sid, token);
47
+ const resolved = auth ? { valid: true, source: auth.source } : { valid: false };
48
+ sessionAuthCache.set(cacheKey, resolved);
49
+ return resolved;
50
+ }
15
51
  const server = mockttp.getLocal({
16
52
  https: {
17
53
  keyPath: options.caKeyPath,
@@ -53,22 +89,64 @@ export async function createProxy(options) {
53
89
  // Strip content-encoding from stored headers since we store the decoded body
54
90
  const storedHeaders = { ...headers };
55
91
  delete storedHeaders["content-encoding"];
92
+ // Read and strip internal procsi attribution headers
93
+ const requestSessionId = storedHeaders[PROCSI_SESSION_ID_HEADER];
94
+ const requestSessionToken = storedHeaders[PROCSI_SESSION_TOKEN_HEADER];
95
+ const runtimeSourceHeader = storedHeaders[PROCSI_RUNTIME_SOURCE_HEADER];
96
+ const legacySessionId = storedHeaders[LEGACY_SESSION_HEADER];
97
+ const headersCopy = { ...storedHeaders };
98
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
99
+ delete headersCopy[PROCSI_SESSION_ID_HEADER];
100
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
101
+ delete headersCopy[PROCSI_SESSION_TOKEN_HEADER];
102
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
103
+ delete headersCopy[PROCSI_RUNTIME_SOURCE_HEADER];
104
+ // Legacy header used before token hardening. Strip it for compatibility.
105
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
106
+ delete headersCopy[LEGACY_SESSION_HEADER];
107
+ const finalStoredHeaders = headersCopy;
108
+ // Trust runtime attribution only when both session ID and token are valid.
109
+ let effectiveSessionId = sessionId;
110
+ let sessionSource = getSessionSource(sessionId);
111
+ let trustedAttribution = false;
112
+ if (typeof requestSessionId === "string" && typeof requestSessionToken === "string") {
113
+ const trusted = getTrustedSessionSource(requestSessionId, requestSessionToken);
114
+ if (trusted.valid) {
115
+ effectiveSessionId = requestSessionId;
116
+ sessionSource = trusted.source;
117
+ trustedAttribution = true;
118
+ }
119
+ else {
120
+ logger?.warn("Ignoring untrusted procsi session attribution headers", {
121
+ sessionId: requestSessionId,
122
+ });
123
+ }
124
+ }
125
+ if (requestSessionId === undefined && typeof legacySessionId === "string") {
126
+ logger?.warn("Ignoring legacy untrusted procsi session header without token");
127
+ }
128
+ // Runtime hint wins when present; otherwise fall back to the session source.
129
+ const runtimeSource = trustedAttribution
130
+ ? normaliseRuntimeSource(runtimeSourceHeader)
131
+ : undefined;
132
+ const source = runtimeSource ?? sessionSource;
56
133
  logger?.trace("Request received", {
57
134
  method: request.method,
58
135
  url: request.url,
59
- headers: storedHeaders,
136
+ headers: finalStoredHeaders,
60
137
  bodyTruncated: requestBodyTruncated,
61
138
  });
62
139
  // Save request to storage and track the ID
63
140
  const ourId = storage.saveRequest({
64
- sessionId,
141
+ sessionId: effectiveSessionId,
65
142
  label,
143
+ source,
66
144
  timestamp,
67
145
  method: request.method,
68
146
  url: request.url,
69
147
  host: url.host,
70
148
  path: url.pathname + url.search,
71
- requestHeaders: storedHeaders,
149
+ requestHeaders: finalStoredHeaders,
72
150
  requestBody: decodedBody,
73
151
  requestBodyTruncated,
74
152
  });
@@ -81,7 +159,7 @@ export async function createProxy(options) {
81
159
  url: request.url,
82
160
  host: url.host,
83
161
  path: url.pathname + url.search,
84
- headers: { ...storedHeaders },
162
+ headers: { ...finalStoredHeaders },
85
163
  body: decodedBody,
86
164
  };
87
165
  const result = await interceptorRunner.handleRequest(ourId, interceptorRequest);
@@ -107,6 +185,23 @@ export async function createProxy(options) {
107
185
  storage.updateRequestInterception(ourId, result.interception.name, result.interception.type);
108
186
  }
109
187
  }
188
+ // Strip internal procsi attribution headers from the upstream request.
189
+ if (requestSessionId !== undefined ||
190
+ requestSessionToken !== undefined ||
191
+ runtimeSourceHeader !== undefined ||
192
+ legacySessionId !== undefined) {
193
+ const upstreamHeaders = flattenHeaders(request.headers);
194
+ const cleanedHeaders = { ...upstreamHeaders };
195
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
196
+ delete cleanedHeaders[PROCSI_SESSION_ID_HEADER];
197
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
198
+ delete cleanedHeaders[PROCSI_SESSION_TOKEN_HEADER];
199
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
200
+ delete cleanedHeaders[PROCSI_RUNTIME_SOURCE_HEADER];
201
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
202
+ delete cleanedHeaders[LEGACY_SESSION_HEADER];
203
+ return { headers: cleanedHeaders };
204
+ }
110
205
  // Return undefined to pass through without modification
111
206
  return undefined;
112
207
  },
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/daemon/proxy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/daemon/proxy.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { CapturedRequest, CapturedRequestSummary, InterceptionType, JsonQueryResult, RequestFilter, Session } from "../shared/types.js";
1
+ import type { CapturedRequest, CapturedRequestSummary, InterceptionType, JsonQueryResult, RegisteredSession, RequestFilter, Session } from "../shared/types.js";
2
2
  import { type LogLevel } from "../shared/logger.js";
3
3
  export interface RepositoryOptions {
4
4
  maxStoredRequests?: number;
@@ -16,13 +16,19 @@ export declare class RequestRepository {
16
16
  /**
17
17
  * Register a new session.
18
18
  */
19
- registerSession(label?: string, pid?: number): Session;
19
+ registerSession(label?: string, pid?: number, source?: string): RegisteredSession;
20
20
  /**
21
21
  * Ensure a session exists with a specific ID.
22
22
  * If the session already exists, returns it unchanged.
23
23
  * If not, creates a new session with the given ID.
24
24
  */
25
- ensureSession(id: string, label?: string, pid?: number): Session;
25
+ ensureSession(id: string, label?: string, pid?: number, source?: string): Session;
26
+ /**
27
+ * Validate a session ID/token pair and return that session's source when valid.
28
+ */
29
+ getSessionAuth(id: string, token: string): {
30
+ source?: string;
31
+ } | undefined;
26
32
  /**
27
33
  * Get a session by ID.
28
34
  */
@@ -105,7 +111,15 @@ export declare class RequestRepository {
105
111
  filter?: RequestFilter;
106
112
  }): JsonQueryResult[];
107
113
  /**
108
- * Delete all requests (useful for cleanup).
114
+ * Mark a request as saved (bookmarked). Returns whether a row was affected.
115
+ */
116
+ bookmarkRequest(id: string): boolean;
117
+ /**
118
+ * Remove the saved (bookmark) flag from a request. Returns whether a row was affected.
119
+ */
120
+ unbookmarkRequest(id: string): boolean;
121
+ /**
122
+ * Delete all unsaved requests. Saved (bookmarked) requests are preserved.
109
123
  */
110
124
  clearRequests(): void;
111
125
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/daemon/storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/daemon/storage.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,20 @@
1
1
  import Database from "better-sqlite3";
2
+ import { randomBytes } from "node:crypto";
2
3
  import { v4 as uuidv4 } from "uuid";
3
4
  import { createLogger } from "../shared/logger.js";
4
5
  import { normaliseContentType, buildTextContentTypeSqlCondition, buildJsonContentTypeSqlCondition, } from "../shared/content-type.js";
5
6
  import { DEFAULT_MAX_STORED_REQUESTS } from "../shared/config.js";
6
7
  const DEFAULT_QUERY_LIMIT = 1000;
7
8
  const EVICTION_CHECK_INTERVAL = 100;
9
+ const SESSION_TOKEN_BYTES = 16;
8
10
  const SCHEMA = `
9
11
  CREATE TABLE IF NOT EXISTS sessions (
10
12
  id TEXT PRIMARY KEY,
11
13
  label TEXT,
12
14
  pid INTEGER NOT NULL,
13
- started_at INTEGER NOT NULL
15
+ started_at INTEGER NOT NULL,
16
+ source TEXT,
17
+ internal_token TEXT
14
18
  );
15
19
 
16
20
  CREATE TABLE IF NOT EXISTS requests (
@@ -34,6 +38,8 @@ CREATE TABLE IF NOT EXISTS requests (
34
38
  response_content_type TEXT,
35
39
  intercepted_by TEXT,
36
40
  interception_type TEXT CHECK(interception_type IN ('modified', 'mocked')),
41
+ source TEXT,
42
+ saved INTEGER DEFAULT 0,
37
43
  created_at INTEGER DEFAULT (unixepoch()),
38
44
  FOREIGN KEY (session_id) REFERENCES sessions(id)
39
45
  );
@@ -83,10 +89,31 @@ const MIGRATIONS = [
83
89
  ALTER TABLE requests ADD COLUMN interception_type TEXT;
84
90
  `,
85
91
  },
92
+ {
93
+ version: 6,
94
+ description: "Add saved/bookmark column",
95
+ sql: `ALTER TABLE requests ADD COLUMN saved INTEGER DEFAULT 0;`,
96
+ },
97
+ {
98
+ version: 7,
99
+ description: "Add source column for request/session attribution",
100
+ sql: `
101
+ ALTER TABLE sessions ADD COLUMN source TEXT;
102
+ ALTER TABLE requests ADD COLUMN source TEXT;
103
+ `,
104
+ },
105
+ {
106
+ version: 8,
107
+ description: "Add internal session token for trusted runtime attribution headers",
108
+ sql: `ALTER TABLE sessions ADD COLUMN internal_token TEXT;`,
109
+ },
86
110
  ];
87
111
  const STATUS_RANGE_MULTIPLIER = 100;
88
112
  const MIN_HTTP_STATUS = 100;
89
113
  const MAX_HTTP_STATUS = 599;
114
+ function generateSessionToken() {
115
+ return randomBytes(SESSION_TOKEN_BYTES).toString("hex");
116
+ }
90
117
  /**
91
118
  * Escape SQL LIKE wildcards in user input to prevent unintended pattern matching.
92
119
  */
@@ -148,10 +175,13 @@ function applyFilterConditions(conditions, params, filter) {
148
175
  applyStatusCondition(conditions, params, filter.statusRange);
149
176
  }
150
177
  if (filter.search) {
151
- const escaped = escapeLikeWildcards(filter.search);
152
- const pattern = `%${escaped}%`;
153
- conditions.push("(url LIKE ? ESCAPE '\\' OR path LIKE ? ESCAPE '\\')");
154
- params.push(pattern, pattern);
178
+ const terms = filter.search.split(/\s+/).filter(Boolean);
179
+ for (const term of terms) {
180
+ const escaped = escapeLikeWildcards(term);
181
+ const pattern = `%${escaped}%`;
182
+ conditions.push("(url LIKE ? ESCAPE '\\' OR path LIKE ? ESCAPE '\\')");
183
+ params.push(pattern, pattern);
184
+ }
155
185
  }
156
186
  if (filter.host) {
157
187
  if (filter.host.startsWith(".")) {
@@ -183,6 +213,16 @@ function applyFilterConditions(conditions, params, filter) {
183
213
  conditions.push("intercepted_by = ?");
184
214
  params.push(filter.interceptedBy);
185
215
  }
216
+ if (filter.saved === true) {
217
+ conditions.push("saved = 1");
218
+ }
219
+ else if (filter.saved === false) {
220
+ conditions.push("saved = 0");
221
+ }
222
+ if (filter.source) {
223
+ conditions.push("source = ?");
224
+ params.push(filter.source);
225
+ }
186
226
  if (filter.headerName) {
187
227
  const name = filter.headerName.toLowerCase();
188
228
  const jsonPath = `$."${name}"`;
@@ -264,18 +304,20 @@ export class RequestRepository {
264
304
  /**
265
305
  * Register a new session.
266
306
  */
267
- registerSession(label, pid = process.pid) {
307
+ registerSession(label, pid = process.pid, source) {
268
308
  const session = {
269
309
  id: uuidv4(),
270
310
  label,
311
+ source,
312
+ token: generateSessionToken(),
271
313
  pid,
272
314
  startedAt: Date.now(),
273
315
  };
274
316
  const stmt = this.db.prepare(`
275
- INSERT INTO sessions (id, label, pid, started_at)
276
- VALUES (?, ?, ?, ?)
317
+ INSERT INTO sessions (id, label, pid, started_at, source, internal_token)
318
+ VALUES (?, ?, ?, ?, ?, ?)
277
319
  `);
278
- stmt.run(session.id, session.label ?? null, session.pid, session.startedAt);
320
+ stmt.run(session.id, session.label ?? null, session.pid, session.startedAt, session.source ?? null, session.token);
279
321
  return session;
280
322
  }
281
323
  /**
@@ -283,27 +325,45 @@ export class RequestRepository {
283
325
  * If the session already exists, returns it unchanged.
284
326
  * If not, creates a new session with the given ID.
285
327
  */
286
- ensureSession(id, label, pid = process.pid) {
328
+ ensureSession(id, label, pid = process.pid, source) {
287
329
  const startedAt = Date.now();
288
330
  const stmt = this.db.prepare(`
289
- INSERT OR IGNORE INTO sessions (id, label, pid, started_at)
290
- VALUES (?, ?, ?, ?)
331
+ INSERT OR IGNORE INTO sessions (id, label, pid, started_at, source, internal_token)
332
+ VALUES (?, ?, ?, ?, ?, ?)
291
333
  `);
292
- stmt.run(id, label ?? null, pid, startedAt);
334
+ stmt.run(id, label ?? null, pid, startedAt, source ?? null, null);
293
335
  // Return the session (either newly created or existing)
294
336
  const existing = this.getSession(id);
295
337
  if (existing) {
296
338
  return existing;
297
339
  }
298
340
  // This should never happen since we just inserted, but satisfies the type checker
299
- return { id, label, pid, startedAt };
341
+ return { id, label, source, pid, startedAt };
342
+ }
343
+ /**
344
+ * Validate a session ID/token pair and return that session's source when valid.
345
+ */
346
+ getSessionAuth(id, token) {
347
+ const stmt = this.db.prepare(`
348
+ SELECT source
349
+ FROM sessions
350
+ WHERE id = ? AND internal_token = ?
351
+ LIMIT 1
352
+ `);
353
+ const row = stmt.get(id, token);
354
+ if (!row) {
355
+ return undefined;
356
+ }
357
+ return {
358
+ source: row.source ?? undefined,
359
+ };
300
360
  }
301
361
  /**
302
362
  * Get a session by ID.
303
363
  */
304
364
  getSession(id) {
305
365
  const stmt = this.db.prepare(`
306
- SELECT id, label, pid, started_at as startedAt
366
+ SELECT id, label, pid, started_at as startedAt, source
307
367
  FROM sessions
308
368
  WHERE id = ?
309
369
  `);
@@ -314,6 +374,7 @@ export class RequestRepository {
314
374
  return {
315
375
  id: row.id,
316
376
  label: row.label ?? undefined,
377
+ source: row.source ?? undefined,
317
378
  pid: row.pid,
318
379
  startedAt: row.startedAt,
319
380
  };
@@ -323,7 +384,7 @@ export class RequestRepository {
323
384
  */
324
385
  listSessions() {
325
386
  const stmt = this.db.prepare(`
326
- SELECT id, label, pid, started_at as startedAt
387
+ SELECT id, label, pid, started_at as startedAt, source
327
388
  FROM sessions
328
389
  ORDER BY started_at DESC
329
390
  `);
@@ -331,6 +392,7 @@ export class RequestRepository {
331
392
  return rows.map((row) => ({
332
393
  id: row.id,
333
394
  label: row.label ?? undefined,
395
+ source: row.source ?? undefined,
334
396
  pid: row.pid,
335
397
  startedAt: row.startedAt,
336
398
  }));
@@ -347,11 +409,11 @@ export class RequestRepository {
347
409
  INSERT INTO requests (
348
410
  id, session_id, label, timestamp, method, url, host, path,
349
411
  request_headers, request_body, request_body_truncated, response_status, response_headers,
350
- response_body, response_body_truncated, duration_ms, request_content_type
412
+ response_body, response_body_truncated, duration_ms, request_content_type, source
351
413
  )
352
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
414
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
353
415
  `);
354
- stmt.run(id, request.sessionId, request.label ?? null, request.timestamp, request.method, request.url, request.host, request.path, request.requestHeaders ? JSON.stringify(request.requestHeaders) : null, request.requestBody ?? null, request.requestBodyTruncated ? 1 : 0, request.responseStatus ?? null, request.responseHeaders ? JSON.stringify(request.responseHeaders) : null, request.responseBody ?? null, request.responseBodyTruncated ? 1 : 0, request.durationMs ?? null, requestContentType);
416
+ stmt.run(id, request.sessionId, request.label ?? null, request.timestamp, request.method, request.url, request.host, request.path, request.requestHeaders ? JSON.stringify(request.requestHeaders) : null, request.requestBody ?? null, request.requestBodyTruncated ? 1 : 0, request.responseStatus ?? null, request.responseHeaders ? JSON.stringify(request.responseHeaders) : null, request.responseBody ?? null, request.responseBodyTruncated ? 1 : 0, request.durationMs ?? null, requestContentType, request.source ?? null);
355
417
  this.logger?.debug("Request saved", {
356
418
  id,
357
419
  sessionId: request.sessionId,
@@ -446,6 +508,7 @@ export class RequestRepository {
446
508
  id,
447
509
  session_id,
448
510
  label,
511
+ source,
449
512
  timestamp,
450
513
  method,
451
514
  url,
@@ -456,7 +519,8 @@ export class RequestRepository {
456
519
  COALESCE(LENGTH(request_body), 0) as request_body_size,
457
520
  COALESCE(LENGTH(response_body), 0) as response_body_size,
458
521
  intercepted_by,
459
- interception_type
522
+ interception_type,
523
+ saved
460
524
  FROM requests
461
525
  ${whereClause}
462
526
  ORDER BY timestamp DESC
@@ -512,6 +576,7 @@ export class RequestRepository {
512
576
  id,
513
577
  session_id,
514
578
  label,
579
+ source,
515
580
  timestamp,
516
581
  method,
517
582
  url,
@@ -522,7 +587,8 @@ export class RequestRepository {
522
587
  COALESCE(LENGTH(request_body), 0) as request_body_size,
523
588
  COALESCE(LENGTH(response_body), 0) as response_body_size,
524
589
  intercepted_by,
525
- interception_type
590
+ interception_type,
591
+ saved
526
592
  FROM requests
527
593
  ${whereClause}
528
594
  ORDER BY timestamp DESC
@@ -658,10 +724,24 @@ export class RequestRepository {
658
724
  }));
659
725
  }
660
726
  /**
661
- * Delete all requests (useful for cleanup).
727
+ * Mark a request as saved (bookmarked). Returns whether a row was affected.
728
+ */
729
+ bookmarkRequest(id) {
730
+ const result = this.db.prepare("UPDATE requests SET saved = 1 WHERE id = ?").run(id);
731
+ return result.changes > 0;
732
+ }
733
+ /**
734
+ * Remove the saved (bookmark) flag from a request. Returns whether a row was affected.
735
+ */
736
+ unbookmarkRequest(id) {
737
+ const result = this.db.prepare("UPDATE requests SET saved = 0 WHERE id = ?").run(id);
738
+ return result.changes > 0;
739
+ }
740
+ /**
741
+ * Delete all unsaved requests. Saved (bookmarked) requests are preserved.
662
742
  */
663
743
  clearRequests() {
664
- this.db.exec("DELETE FROM requests");
744
+ this.db.exec("DELETE FROM requests WHERE saved = 0");
665
745
  }
666
746
  /**
667
747
  * Reclaim disk space by checkpointing the WAL and vacuuming.
@@ -688,14 +768,16 @@ export class RequestRepository {
688
768
  return;
689
769
  }
690
770
  this.insertsSinceLastEvictionCheck = 0;
691
- const { count } = this.db.prepare("SELECT COUNT(*) as count FROM requests").get();
771
+ const { count } = this.db
772
+ .prepare("SELECT COUNT(*) as count FROM requests WHERE saved = 0")
773
+ .get();
692
774
  if (count <= this.maxStoredRequests) {
693
775
  return;
694
776
  }
695
777
  const excess = count - this.maxStoredRequests;
696
778
  this.db
697
779
  .prepare(`DELETE FROM requests WHERE id IN (
698
- SELECT id FROM requests ORDER BY timestamp ASC LIMIT ?
780
+ SELECT id FROM requests WHERE saved = 0 ORDER BY timestamp ASC LIMIT ?
699
781
  )`)
700
782
  .run(excess);
701
783
  this.logger?.debug("Evicted old requests", {
@@ -708,6 +790,7 @@ export class RequestRepository {
708
790
  id: row.id,
709
791
  sessionId: row.session_id,
710
792
  label: row.label ?? undefined,
793
+ source: row.source ?? undefined,
711
794
  timestamp: row.timestamp,
712
795
  method: row.method,
713
796
  url: row.url,
@@ -721,6 +804,7 @@ export class RequestRepository {
721
804
  interceptionType: row.interception_type === "modified" || row.interception_type === "mocked"
722
805
  ? row.interception_type
723
806
  : undefined,
807
+ ...(row.saved === 1 ? { saved: true } : {}),
724
808
  };
725
809
  }
726
810
  safeParseHeaders(json) {
@@ -736,6 +820,7 @@ export class RequestRepository {
736
820
  id: row.id,
737
821
  sessionId: row.session_id,
738
822
  label: row.label ?? undefined,
823
+ source: row.source ?? undefined,
739
824
  timestamp: row.timestamp,
740
825
  method: row.method,
741
826
  url: row.url,
@@ -755,6 +840,7 @@ export class RequestRepository {
755
840
  interceptionType: row.interception_type === "modified" || row.interception_type === "mocked"
756
841
  ? row.interception_type
757
842
  : undefined,
843
+ ...(row.saved === 1 ? { saved: true } : {}),
758
844
  };
759
845
  }
760
846
  }