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.
- package/README.md +341 -214
- package/dist/cli/commands/completions.d.ts +9 -0
- package/dist/cli/commands/completions.d.ts.map +1 -0
- package/dist/cli/commands/completions.js +170 -0
- package/dist/cli/commands/completions.js.map +1 -0
- package/dist/cli/commands/helpers.d.ts +9 -0
- package/dist/cli/commands/helpers.d.ts.map +1 -1
- package/dist/cli/commands/helpers.js +19 -1
- package/dist/cli/commands/helpers.js.map +1 -1
- package/dist/cli/commands/interceptors.d.ts.map +1 -1
- package/dist/cli/commands/interceptors.js +142 -0
- package/dist/cli/commands/interceptors.js.map +1 -1
- package/dist/cli/commands/off.d.ts.map +1 -1
- package/dist/cli/commands/off.js +1 -0
- package/dist/cli/commands/off.js.map +1 -1
- package/dist/cli/commands/on.d.ts.map +1 -1
- package/dist/cli/commands/on.js +3 -1
- package/dist/cli/commands/on.js.map +1 -1
- package/dist/cli/commands/request.d.ts +6 -0
- package/dist/cli/commands/request.d.ts.map +1 -0
- package/dist/cli/commands/request.js +216 -0
- package/dist/cli/commands/request.js.map +1 -0
- package/dist/cli/commands/requests.d.ts +6 -0
- package/dist/cli/commands/requests.d.ts.map +1 -0
- package/dist/cli/commands/requests.js +290 -0
- package/dist/cli/commands/requests.js.map +1 -0
- package/dist/cli/commands/sessions.d.ts +6 -0
- package/dist/cli/commands/sessions.d.ts.map +1 -0
- package/dist/cli/commands/sessions.js +39 -0
- package/dist/cli/commands/sessions.js.map +1 -0
- package/dist/cli/formatters/colour.d.ts +17 -0
- package/dist/cli/formatters/colour.d.ts.map +1 -0
- package/dist/cli/formatters/colour.js +23 -0
- package/dist/cli/formatters/colour.js.map +1 -0
- package/dist/cli/formatters/detail.d.ts +17 -0
- package/dist/cli/formatters/detail.d.ts.map +1 -0
- package/dist/cli/formatters/detail.js +135 -0
- package/dist/cli/formatters/detail.js.map +1 -0
- package/dist/cli/formatters/hints.d.ts +17 -0
- package/dist/cli/formatters/hints.d.ts.map +1 -0
- package/dist/cli/formatters/hints.js +29 -0
- package/dist/cli/formatters/hints.js.map +1 -0
- package/dist/cli/formatters/table.d.ts +17 -0
- package/dist/cli/formatters/table.d.ts.map +1 -0
- package/dist/cli/formatters/table.js +85 -0
- package/dist/cli/formatters/table.js.map +1 -0
- package/dist/cli/index.js +8 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/tui/App.d.ts.map +1 -1
- package/dist/cli/tui/App.js +67 -6
- package/dist/cli/tui/App.js.map +1 -1
- package/dist/cli/tui/components/AccordionPanel.d.ts.map +1 -1
- package/dist/cli/tui/components/AccordionPanel.js +1 -1
- package/dist/cli/tui/components/AccordionPanel.js.map +1 -1
- package/dist/cli/tui/components/EventFilterBar.d.ts +27 -0
- package/dist/cli/tui/components/EventFilterBar.d.ts.map +1 -0
- package/dist/cli/tui/components/EventFilterBar.js +145 -0
- package/dist/cli/tui/components/EventFilterBar.js.map +1 -0
- package/dist/cli/tui/components/FilterBar.d.ts.map +1 -1
- package/dist/cli/tui/components/FilterBar.js +34 -3
- package/dist/cli/tui/components/FilterBar.js.map +1 -1
- package/dist/cli/tui/components/HelpModal.d.ts.map +1 -1
- package/dist/cli/tui/components/HelpModal.js +3 -0
- package/dist/cli/tui/components/HelpModal.js.map +1 -1
- package/dist/cli/tui/components/InfoBar.d.ts +15 -0
- package/dist/cli/tui/components/InfoBar.d.ts.map +1 -0
- package/dist/cli/tui/components/InfoBar.js +45 -0
- package/dist/cli/tui/components/InfoBar.js.map +1 -0
- package/dist/cli/tui/components/InterceptorLogModal.d.ts +16 -0
- package/dist/cli/tui/components/InterceptorLogModal.d.ts.map +1 -0
- package/dist/cli/tui/components/InterceptorLogModal.js +229 -0
- package/dist/cli/tui/components/InterceptorLogModal.js.map +1 -0
- package/dist/cli/tui/components/RequestListItem.d.ts.map +1 -1
- package/dist/cli/tui/components/RequestListItem.js +3 -2
- package/dist/cli/tui/components/RequestListItem.js.map +1 -1
- package/dist/cli/tui/components/StatusBar.d.ts +7 -2
- package/dist/cli/tui/components/StatusBar.d.ts.map +1 -1
- package/dist/cli/tui/components/StatusBar.js +13 -6
- package/dist/cli/tui/components/StatusBar.js.map +1 -1
- package/dist/cli/tui/hooks/useInterceptorEvents.d.ts +33 -0
- package/dist/cli/tui/hooks/useInterceptorEvents.d.ts.map +1 -0
- package/dist/cli/tui/hooks/useInterceptorEvents.js +88 -0
- package/dist/cli/tui/hooks/useInterceptorEvents.js.map +1 -0
- package/dist/cli/tui/hooks/useRequests.d.ts +4 -0
- package/dist/cli/tui/hooks/useRequests.d.ts.map +1 -1
- package/dist/cli/tui/hooks/useRequests.js +36 -0
- package/dist/cli/tui/hooks/useRequests.js.map +1 -1
- package/dist/cli/tui/utils/filters.d.ts.map +1 -1
- package/dist/cli/tui/utils/filters.js +3 -1
- package/dist/cli/tui/utils/filters.js.map +1 -1
- package/dist/cli/utils/parse-time.d.ts +22 -0
- package/dist/cli/utils/parse-time.d.ts.map +1 -0
- package/dist/cli/utils/parse-time.js +160 -0
- package/dist/cli/utils/parse-time.js.map +1 -0
- package/dist/daemon/control.d.ts +2 -0
- package/dist/daemon/control.d.ts.map +1 -1
- package/dist/daemon/control.js +64 -2
- package/dist/daemon/control.js.map +1 -1
- package/dist/daemon/index.js +6 -1
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/interceptor-event-log.d.ts +37 -0
- package/dist/daemon/interceptor-event-log.d.ts.map +1 -0
- package/dist/daemon/interceptor-event-log.js +163 -0
- package/dist/daemon/interceptor-event-log.js.map +1 -0
- package/dist/daemon/interceptor-loader.d.ts +3 -0
- package/dist/daemon/interceptor-loader.d.ts.map +1 -1
- package/dist/daemon/interceptor-loader.js +34 -2
- package/dist/daemon/interceptor-loader.js.map +1 -1
- package/dist/daemon/interceptor-runner.d.ts +3 -0
- package/dist/daemon/interceptor-runner.d.ts.map +1 -1
- package/dist/daemon/interceptor-runner.js +112 -8
- package/dist/daemon/interceptor-runner.js.map +1 -1
- package/dist/daemon/proxy.d.ts.map +1 -1
- package/dist/daemon/proxy.js +99 -4
- package/dist/daemon/proxy.js.map +1 -1
- package/dist/daemon/storage.d.ts +18 -4
- package/dist/daemon/storage.d.ts.map +1 -1
- package/dist/daemon/storage.js +111 -25
- package/dist/daemon/storage.js.map +1 -1
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +116 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/overrides/node.d.ts.map +1 -1
- package/dist/overrides/node.js +62 -0
- package/dist/overrides/node.js.map +1 -1
- package/dist/shared/constants.d.ts +10 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +10 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/control-client.d.ts +36 -3
- package/dist/shared/control-client.d.ts.map +1 -1
- package/dist/shared/control-client.js +27 -3
- package/dist/shared/control-client.js.map +1 -1
- package/dist/shared/process-name.d.ts +10 -0
- package/dist/shared/process-name.d.ts.map +1 -0
- package/dist/shared/process-name.js +27 -0
- package/dist/shared/process-name.js.map +1 -0
- package/dist/shared/types.d.ts +24 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/package.json +2 -1
- package/skills/procsi/SKILL.md +5 -4
package/dist/daemon/proxy.js
CHANGED
|
@@ -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:
|
|
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:
|
|
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: { ...
|
|
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
|
},
|
package/dist/daemon/proxy.js.map
CHANGED
|
@@ -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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"}
|
package/dist/daemon/storage.d.ts
CHANGED
|
@@ -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):
|
|
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
|
-
*
|
|
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":"
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/daemon/storage.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,OAAO,EACR,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAgB,KAAK,QAAQ,EAAe,MAAM,qBAAqB,CAAC;AAwS/E,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,6BAA6B,CAAK;gBAGxC,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,QAAQ,EACnB,OAAO,CAAC,EAAE,iBAAiB;IA4B7B;;OAEG;IACH,OAAO,CAAC,eAAe;IAgBvB;;OAEG;IACH,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,GAAE,MAAoB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB;IA2B9F;;;;OAIG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,GAAE,MAAoB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO;IAkB9F;;OAEG;IACH,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IAgB1E;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAsB3C;;OAEG;IACH,YAAY,IAAI,OAAO,EAAE;IAkBzB;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,MAAM;IAiDzD;;OAEG;IACH,qBAAqB,CACnB,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,qBAAqB,CAAC,EAAE,OAAO,CAAC;KACjC,GACA,IAAI;IAoBP;;OAEG;IACH,yBAAyB,CACvB,EAAE,EAAE,MAAM,EACV,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,gBAAgB,GACjC,IAAI;IASP;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAUnD;;OAEG;IACH,YAAY,CACV,OAAO,GAAE;QACP,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,aAAa,CAAC;KACnB,GACL,eAAe,EAAE;IAkCpB;;;OAGG;IACH,mBAAmB,CACjB,OAAO,GAAE;QACP,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,aAAa,CAAC;KACnB,GACL,sBAAsB,EAAE;IAmD3B;;OAEG;IACH,aAAa,CACX,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,aAAa,CAAA;KAAO,GAC3E,MAAM;IA2BT;;;OAGG;IACH,YAAY,CAAC,OAAO,EAAE;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,aAAa,CAAC;KACxB,GAAG,sBAAsB,EAAE;IAsD5B;;;OAGG;IACH,eAAe,CAAC,OAAO,EAAE;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;QACzC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,aAAa,CAAC;KACxB,GAAG,eAAe,EAAE;IA0IrB;;OAEG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAKpC;;OAEG;IACH,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAKtC;;OAEG;IACH,aAAa,IAAI,IAAI;IAIrB;;;OAGG;IACH,eAAe,IAAI,IAAI;IAKvB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAiCrB,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,YAAY;CA6BrB"}
|
package/dist/daemon/storage.js
CHANGED
|
@@ -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
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
*
|
|
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
|
|
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
|
}
|