procsi 0.2.6
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/LICENSE +665 -0
- package/README.md +587 -0
- package/dist/cli/commands/clear.d.ts +3 -0
- package/dist/cli/commands/clear.d.ts.map +1 -0
- package/dist/cli/commands/clear.js +30 -0
- package/dist/cli/commands/clear.js.map +1 -0
- package/dist/cli/commands/daemon.d.ts +3 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -0
- package/dist/cli/commands/daemon.js +59 -0
- package/dist/cli/commands/daemon.js.map +1 -0
- package/dist/cli/commands/debug-dump.d.ts +27 -0
- package/dist/cli/commands/debug-dump.d.ts.map +1 -0
- package/dist/cli/commands/debug-dump.js +102 -0
- package/dist/cli/commands/debug-dump.js.map +1 -0
- package/dist/cli/commands/helpers.d.ts +18 -0
- package/dist/cli/commands/helpers.d.ts.map +1 -0
- package/dist/cli/commands/helpers.js +34 -0
- package/dist/cli/commands/helpers.js.map +1 -0
- package/dist/cli/commands/init.d.ts +9 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +28 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/intercept.d.ts +9 -0
- package/dist/cli/commands/intercept.d.ts.map +1 -0
- package/dist/cli/commands/intercept.js +121 -0
- package/dist/cli/commands/intercept.js.map +1 -0
- package/dist/cli/commands/interceptors.d.ts +3 -0
- package/dist/cli/commands/interceptors.d.ts.map +1 -0
- package/dist/cli/commands/interceptors.js +163 -0
- package/dist/cli/commands/interceptors.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +3 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +24 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/off.d.ts +8 -0
- package/dist/cli/commands/off.d.ts.map +1 -0
- package/dist/cli/commands/off.js +34 -0
- package/dist/cli/commands/off.js.map +1 -0
- package/dist/cli/commands/on.d.ts +9 -0
- package/dist/cli/commands/on.d.ts.map +1 -0
- package/dist/cli/commands/on.js +121 -0
- package/dist/cli/commands/on.js.map +1 -0
- package/dist/cli/commands/project.d.ts +3 -0
- package/dist/cli/commands/project.d.ts.map +1 -0
- package/dist/cli/commands/project.js +15 -0
- package/dist/cli/commands/project.js.map +1 -0
- package/dist/cli/commands/restart.d.ts +3 -0
- package/dist/cli/commands/restart.d.ts.map +1 -0
- package/dist/cli/commands/restart.js +35 -0
- package/dist/cli/commands/restart.js.map +1 -0
- package/dist/cli/commands/status.d.ts +3 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +66 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +3 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +24 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/tui.d.ts +3 -0
- package/dist/cli/commands/tui.d.ts.map +1 -0
- package/dist/cli/commands/tui.js +36 -0
- package/dist/cli/commands/tui.js.map +1 -0
- package/dist/cli/commands/vars.d.ts +36 -0
- package/dist/cli/commands/vars.d.ts.map +1 -0
- package/dist/cli/commands/vars.js +207 -0
- package/dist/cli/commands/vars.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +37 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/tui/App.d.ts +15 -0
- package/dist/cli/tui/App.d.ts.map +1 -0
- package/dist/cli/tui/App.js +544 -0
- package/dist/cli/tui/App.js.map +1 -0
- package/dist/cli/tui/components/AccordionContent.d.ts +28 -0
- package/dist/cli/tui/components/AccordionContent.d.ts.map +1 -0
- package/dist/cli/tui/components/AccordionContent.js +87 -0
- package/dist/cli/tui/components/AccordionContent.js.map +1 -0
- package/dist/cli/tui/components/AccordionPanel.d.ts +38 -0
- package/dist/cli/tui/components/AccordionPanel.d.ts.map +1 -0
- package/dist/cli/tui/components/AccordionPanel.js +110 -0
- package/dist/cli/tui/components/AccordionPanel.js.map +1 -0
- package/dist/cli/tui/components/AccordionSection.d.ts +32 -0
- package/dist/cli/tui/components/AccordionSection.d.ts.map +1 -0
- package/dist/cli/tui/components/AccordionSection.js +41 -0
- package/dist/cli/tui/components/AccordionSection.js.map +1 -0
- package/dist/cli/tui/components/BodyView.d.ts +14 -0
- package/dist/cli/tui/components/BodyView.d.ts.map +1 -0
- package/dist/cli/tui/components/BodyView.js +39 -0
- package/dist/cli/tui/components/BodyView.js.map +1 -0
- package/dist/cli/tui/components/ExportModal.d.ts +34 -0
- package/dist/cli/tui/components/ExportModal.d.ts.map +1 -0
- package/dist/cli/tui/components/ExportModal.js +109 -0
- package/dist/cli/tui/components/ExportModal.js.map +1 -0
- package/dist/cli/tui/components/FilterBar.d.ts +21 -0
- package/dist/cli/tui/components/FilterBar.d.ts.map +1 -0
- package/dist/cli/tui/components/FilterBar.js +155 -0
- package/dist/cli/tui/components/FilterBar.js.map +1 -0
- package/dist/cli/tui/components/HeadersView.d.ts +13 -0
- package/dist/cli/tui/components/HeadersView.d.ts.map +1 -0
- package/dist/cli/tui/components/HeadersView.js +8 -0
- package/dist/cli/tui/components/HeadersView.js.map +1 -0
- package/dist/cli/tui/components/HelpModal.d.ts +13 -0
- package/dist/cli/tui/components/HelpModal.d.ts.map +1 -0
- package/dist/cli/tui/components/HelpModal.js +78 -0
- package/dist/cli/tui/components/HelpModal.js.map +1 -0
- package/dist/cli/tui/components/HintContent.d.ts +25 -0
- package/dist/cli/tui/components/HintContent.d.ts.map +1 -0
- package/dist/cli/tui/components/HintContent.js +44 -0
- package/dist/cli/tui/components/HintContent.js.map +1 -0
- package/dist/cli/tui/components/InfoModal.d.ts +15 -0
- package/dist/cli/tui/components/InfoModal.d.ts.map +1 -0
- package/dist/cli/tui/components/InfoModal.js +17 -0
- package/dist/cli/tui/components/InfoModal.js.map +1 -0
- package/dist/cli/tui/components/JsonExplorerModal.d.ts +24 -0
- package/dist/cli/tui/components/JsonExplorerModal.d.ts.map +1 -0
- package/dist/cli/tui/components/JsonExplorerModal.js +311 -0
- package/dist/cli/tui/components/JsonExplorerModal.js.map +1 -0
- package/dist/cli/tui/components/Modal.d.ts +26 -0
- package/dist/cli/tui/components/Modal.d.ts.map +1 -0
- package/dist/cli/tui/components/Modal.js +15 -0
- package/dist/cli/tui/components/Modal.js.map +1 -0
- package/dist/cli/tui/components/Panel.d.ts +19 -0
- package/dist/cli/tui/components/Panel.d.ts.map +1 -0
- package/dist/cli/tui/components/Panel.js +37 -0
- package/dist/cli/tui/components/Panel.js.map +1 -0
- package/dist/cli/tui/components/RequestDetails.d.ts +16 -0
- package/dist/cli/tui/components/RequestDetails.d.ts.map +1 -0
- package/dist/cli/tui/components/RequestDetails.js +23 -0
- package/dist/cli/tui/components/RequestDetails.js.map +1 -0
- package/dist/cli/tui/components/RequestList.d.ts +21 -0
- package/dist/cli/tui/components/RequestList.d.ts.map +1 -0
- package/dist/cli/tui/components/RequestList.js +30 -0
- package/dist/cli/tui/components/RequestList.js.map +1 -0
- package/dist/cli/tui/components/RequestListItem.d.ts +36 -0
- package/dist/cli/tui/components/RequestListItem.d.ts.map +1 -0
- package/dist/cli/tui/components/RequestListItem.js +130 -0
- package/dist/cli/tui/components/RequestListItem.js.map +1 -0
- package/dist/cli/tui/components/SaveModal.d.ts +30 -0
- package/dist/cli/tui/components/SaveModal.d.ts.map +1 -0
- package/dist/cli/tui/components/SaveModal.js +95 -0
- package/dist/cli/tui/components/SaveModal.js.map +1 -0
- package/dist/cli/tui/components/StatusBar.d.ts +39 -0
- package/dist/cli/tui/components/StatusBar.d.ts.map +1 -0
- package/dist/cli/tui/components/StatusBar.js +53 -0
- package/dist/cli/tui/components/StatusBar.js.map +1 -0
- package/dist/cli/tui/components/TextViewerModal.d.ts +19 -0
- package/dist/cli/tui/components/TextViewerModal.d.ts.map +1 -0
- package/dist/cli/tui/components/TextViewerModal.js +227 -0
- package/dist/cli/tui/components/TextViewerModal.js.map +1 -0
- package/dist/cli/tui/hooks/useBodyExport.d.ts +26 -0
- package/dist/cli/tui/hooks/useBodyExport.d.ts.map +1 -0
- package/dist/cli/tui/hooks/useBodyExport.js +173 -0
- package/dist/cli/tui/hooks/useBodyExport.js.map +1 -0
- package/dist/cli/tui/hooks/useExport.d.ts +29 -0
- package/dist/cli/tui/hooks/useExport.d.ts.map +1 -0
- package/dist/cli/tui/hooks/useExport.js +64 -0
- package/dist/cli/tui/hooks/useExport.js.map +1 -0
- package/dist/cli/tui/hooks/useRequests.d.ts +26 -0
- package/dist/cli/tui/hooks/useRequests.d.ts.map +1 -0
- package/dist/cli/tui/hooks/useRequests.js +131 -0
- package/dist/cli/tui/hooks/useRequests.js.map +1 -0
- package/dist/cli/tui/hooks/useSaveBinary.d.ts +26 -0
- package/dist/cli/tui/hooks/useSaveBinary.d.ts.map +1 -0
- package/dist/cli/tui/hooks/useSaveBinary.js +165 -0
- package/dist/cli/tui/hooks/useSaveBinary.js.map +1 -0
- package/dist/cli/tui/hooks/useSpinner.d.ts +5 -0
- package/dist/cli/tui/hooks/useSpinner.d.ts.map +1 -0
- package/dist/cli/tui/hooks/useSpinner.js +25 -0
- package/dist/cli/tui/hooks/useSpinner.js.map +1 -0
- package/dist/cli/tui/hooks/useStdoutDimensions.d.ts +11 -0
- package/dist/cli/tui/hooks/useStdoutDimensions.d.ts.map +1 -0
- package/dist/cli/tui/hooks/useStdoutDimensions.js +29 -0
- package/dist/cli/tui/hooks/useStdoutDimensions.js.map +1 -0
- package/dist/cli/tui/utils/binary.d.ts +24 -0
- package/dist/cli/tui/utils/binary.d.ts.map +1 -0
- package/dist/cli/tui/utils/binary.js +152 -0
- package/dist/cli/tui/utils/binary.js.map +1 -0
- package/dist/cli/tui/utils/clipboard.d.ts +9 -0
- package/dist/cli/tui/utils/clipboard.d.ts.map +1 -0
- package/dist/cli/tui/utils/clipboard.js +58 -0
- package/dist/cli/tui/utils/clipboard.js.map +1 -0
- package/dist/cli/tui/utils/content-type.d.ts +8 -0
- package/dist/cli/tui/utils/content-type.d.ts.map +1 -0
- package/dist/cli/tui/utils/content-type.js +10 -0
- package/dist/cli/tui/utils/content-type.js.map +1 -0
- package/dist/cli/tui/utils/curl.d.ts +9 -0
- package/dist/cli/tui/utils/curl.d.ts.map +1 -0
- package/dist/cli/tui/utils/curl.js +54 -0
- package/dist/cli/tui/utils/curl.js.map +1 -0
- package/dist/cli/tui/utils/filters.d.ts +6 -0
- package/dist/cli/tui/utils/filters.d.ts.map +1 -0
- package/dist/cli/tui/utils/filters.js +13 -0
- package/dist/cli/tui/utils/filters.js.map +1 -0
- package/dist/cli/tui/utils/formatters.d.ts +49 -0
- package/dist/cli/tui/utils/formatters.d.ts.map +1 -0
- package/dist/cli/tui/utils/formatters.js +200 -0
- package/dist/cli/tui/utils/formatters.js.map +1 -0
- package/dist/cli/tui/utils/har.d.ts +75 -0
- package/dist/cli/tui/utils/har.d.ts.map +1 -0
- package/dist/cli/tui/utils/har.js +117 -0
- package/dist/cli/tui/utils/har.js.map +1 -0
- package/dist/cli/tui/utils/json-tree.d.ts +69 -0
- package/dist/cli/tui/utils/json-tree.d.ts.map +1 -0
- package/dist/cli/tui/utils/json-tree.js +339 -0
- package/dist/cli/tui/utils/json-tree.js.map +1 -0
- package/dist/cli/tui/utils/open-external.d.ts +17 -0
- package/dist/cli/tui/utils/open-external.d.ts.map +1 -0
- package/dist/cli/tui/utils/open-external.js +57 -0
- package/dist/cli/tui/utils/open-external.js.map +1 -0
- package/dist/cli/tui/utils/syntax-highlight.d.ts +16 -0
- package/dist/cli/tui/utils/syntax-highlight.d.ts.map +1 -0
- package/dist/cli/tui/utils/syntax-highlight.js +64 -0
- package/dist/cli/tui/utils/syntax-highlight.js.map +1 -0
- package/dist/daemon/control.d.ts +21 -0
- package/dist/daemon/control.d.ts.map +1 -0
- package/dist/daemon/control.js +311 -0
- package/dist/daemon/control.js.map +1 -0
- package/dist/daemon/htpx-client.d.ts +8 -0
- package/dist/daemon/htpx-client.d.ts.map +1 -0
- package/dist/daemon/htpx-client.js +25 -0
- package/dist/daemon/htpx-client.js.map +1 -0
- package/dist/daemon/index.d.ts +3 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +178 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/interceptor-loader.d.ts +30 -0
- package/dist/daemon/interceptor-loader.d.ts.map +1 -0
- package/dist/daemon/interceptor-loader.js +249 -0
- package/dist/daemon/interceptor-loader.js.map +1 -0
- package/dist/daemon/interceptor-runner.d.ts +39 -0
- package/dist/daemon/interceptor-runner.d.ts.map +1 -0
- package/dist/daemon/interceptor-runner.js +312 -0
- package/dist/daemon/interceptor-runner.js.map +1 -0
- package/dist/daemon/procsi-client.d.ts +8 -0
- package/dist/daemon/procsi-client.d.ts.map +1 -0
- package/dist/daemon/procsi-client.js +25 -0
- package/dist/daemon/procsi-client.js.map +1 -0
- package/dist/daemon/proxy.d.ts +34 -0
- package/dist/daemon/proxy.d.ts.map +1 -0
- package/dist/daemon/proxy.js +213 -0
- package/dist/daemon/proxy.js.map +1 -0
- package/dist/daemon/storage.d.ts +130 -0
- package/dist/daemon/storage.d.ts.map +1 -0
- package/dist/daemon/storage.js +761 -0
- package/dist/daemon/storage.js.map +1 -0
- package/dist/interceptors.d.ts +2 -0
- package/dist/interceptors.d.ts.map +1 -0
- package/dist/interceptors.js +2 -0
- package/dist/interceptors.js.map +1 -0
- package/dist/mcp/server.d.ts +110 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +806 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/overrides/node.d.ts +30 -0
- package/dist/overrides/node.d.ts.map +1 -0
- package/dist/overrides/node.js +66 -0
- package/dist/overrides/node.js.map +1 -0
- package/dist/shared/config.d.ts +21 -0
- package/dist/shared/config.d.ts.map +1 -0
- package/dist/shared/config.js +83 -0
- package/dist/shared/config.js.map +1 -0
- package/dist/shared/content-type.d.ts +64 -0
- package/dist/shared/content-type.d.ts.map +1 -0
- package/dist/shared/content-type.js +145 -0
- package/dist/shared/content-type.js.map +1 -0
- package/dist/shared/control-client.d.ts +144 -0
- package/dist/shared/control-client.d.ts.map +1 -0
- package/dist/shared/control-client.js +272 -0
- package/dist/shared/control-client.js.map +1 -0
- package/dist/shared/daemon.d.ts +33 -0
- package/dist/shared/daemon.d.ts.map +1 -0
- package/dist/shared/daemon.js +231 -0
- package/dist/shared/daemon.js.map +1 -0
- package/dist/shared/logger.d.ts +47 -0
- package/dist/shared/logger.d.ts.map +1 -0
- package/dist/shared/logger.js +200 -0
- package/dist/shared/logger.js.map +1 -0
- package/dist/shared/project.d.ts +76 -0
- package/dist/shared/project.d.ts.map +1 -0
- package/dist/shared/project.js +185 -0
- package/dist/shared/project.js.map +1 -0
- package/dist/shared/proxy-info.d.ts +10 -0
- package/dist/shared/proxy-info.d.ts.map +1 -0
- package/dist/shared/proxy-info.js +15 -0
- package/dist/shared/proxy-info.js.map +1 -0
- package/dist/shared/types.d.ts +128 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +5 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/shared/version.d.ts +5 -0
- package/dist/shared/version.d.ts.map +1 -0
- package/dist/shared/version.js +21 -0
- package/dist/shared/version.js.map +1 -0
- package/package.json +113 -0
- package/skills/procsi/SKILL.md +228 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
const LOG_LEVEL_PRIORITY = {
|
|
4
|
+
silent: -1,
|
|
5
|
+
error: 0,
|
|
6
|
+
warn: 1,
|
|
7
|
+
info: 2,
|
|
8
|
+
debug: 3,
|
|
9
|
+
trace: 4,
|
|
10
|
+
};
|
|
11
|
+
/** 10MB max file size before rotation */
|
|
12
|
+
const DEFAULT_MAX_LOG_SIZE = 10 * 1024 * 1024;
|
|
13
|
+
/** Flush buffered log lines after this delay */
|
|
14
|
+
const FLUSH_DELAY_MS = 100;
|
|
15
|
+
export class Logger {
|
|
16
|
+
component;
|
|
17
|
+
logFile;
|
|
18
|
+
level;
|
|
19
|
+
stream = null;
|
|
20
|
+
buffer = [];
|
|
21
|
+
flushTimer = null;
|
|
22
|
+
dirEnsured = false;
|
|
23
|
+
maxLogSize;
|
|
24
|
+
constructor(component, logFile, level = "warn", options) {
|
|
25
|
+
this.component = component;
|
|
26
|
+
this.logFile = logFile;
|
|
27
|
+
this.level = level;
|
|
28
|
+
this.maxLogSize = options?.maxLogSize ?? DEFAULT_MAX_LOG_SIZE;
|
|
29
|
+
}
|
|
30
|
+
error(msg, data) {
|
|
31
|
+
this.log("error", msg, data);
|
|
32
|
+
}
|
|
33
|
+
warn(msg, data) {
|
|
34
|
+
this.log("warn", msg, data);
|
|
35
|
+
}
|
|
36
|
+
info(msg, data) {
|
|
37
|
+
this.log("info", msg, data);
|
|
38
|
+
}
|
|
39
|
+
debug(msg, data) {
|
|
40
|
+
this.log("debug", msg, data);
|
|
41
|
+
}
|
|
42
|
+
trace(msg, data) {
|
|
43
|
+
this.log("trace", msg, data);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Flush any buffered log lines and close the write stream.
|
|
47
|
+
* Uses synchronous write for the final flush to avoid losing entries.
|
|
48
|
+
*/
|
|
49
|
+
close() {
|
|
50
|
+
if (this.flushTimer !== null) {
|
|
51
|
+
clearTimeout(this.flushTimer);
|
|
52
|
+
this.flushTimer = null;
|
|
53
|
+
}
|
|
54
|
+
// Close the stream first so any pending async writes land on disk
|
|
55
|
+
if (this.stream) {
|
|
56
|
+
this.stream.end();
|
|
57
|
+
this.stream = null;
|
|
58
|
+
}
|
|
59
|
+
// Synchronously flush remaining buffer to avoid losing final entries.
|
|
60
|
+
// Write each line individually with rotation checks to maintain
|
|
61
|
+
// correct rotation behaviour at shutdown.
|
|
62
|
+
if (this.buffer.length > 0) {
|
|
63
|
+
const lines = this.buffer;
|
|
64
|
+
this.buffer = [];
|
|
65
|
+
this.ensureDir();
|
|
66
|
+
for (const line of lines) {
|
|
67
|
+
this.rotateIfNeeded();
|
|
68
|
+
try {
|
|
69
|
+
fs.appendFileSync(this.logFile, line, "utf-8");
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Silently fail if we can't write final entries
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
log(level, msg, data) {
|
|
78
|
+
if (!this.shouldLog(level)) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const entry = {
|
|
82
|
+
ts: new Date().toISOString(),
|
|
83
|
+
level,
|
|
84
|
+
component: this.component,
|
|
85
|
+
msg,
|
|
86
|
+
};
|
|
87
|
+
if (data !== undefined) {
|
|
88
|
+
entry.data = data;
|
|
89
|
+
}
|
|
90
|
+
const line = JSON.stringify(entry) + "\n";
|
|
91
|
+
this.buffer.push(line);
|
|
92
|
+
this.scheduleFlush();
|
|
93
|
+
}
|
|
94
|
+
scheduleFlush() {
|
|
95
|
+
if (this.flushTimer !== null) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
this.flushTimer = setTimeout(() => {
|
|
99
|
+
this.flushTimer = null;
|
|
100
|
+
this.flush();
|
|
101
|
+
}, FLUSH_DELAY_MS);
|
|
102
|
+
}
|
|
103
|
+
flush() {
|
|
104
|
+
if (this.buffer.length === 0) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const data = this.buffer.join("");
|
|
108
|
+
this.buffer = [];
|
|
109
|
+
this.rotateIfNeeded();
|
|
110
|
+
try {
|
|
111
|
+
const stream = this.ensureStream();
|
|
112
|
+
stream.write(data);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Silently fail if we can't write to log file
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
ensureDir() {
|
|
119
|
+
if (this.dirEnsured) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const dir = path.dirname(this.logFile);
|
|
123
|
+
if (!fs.existsSync(dir)) {
|
|
124
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
125
|
+
}
|
|
126
|
+
this.dirEnsured = true;
|
|
127
|
+
}
|
|
128
|
+
ensureStream() {
|
|
129
|
+
if (this.stream) {
|
|
130
|
+
return this.stream;
|
|
131
|
+
}
|
|
132
|
+
this.ensureDir();
|
|
133
|
+
this.stream = fs.createWriteStream(this.logFile, { flags: "a" });
|
|
134
|
+
this.stream.on("error", () => {
|
|
135
|
+
// Silently handle stream errors to avoid crashing
|
|
136
|
+
this.stream = null;
|
|
137
|
+
});
|
|
138
|
+
return this.stream;
|
|
139
|
+
}
|
|
140
|
+
shouldLog(level) {
|
|
141
|
+
return LOG_LEVEL_PRIORITY[level] <= LOG_LEVEL_PRIORITY[this.level];
|
|
142
|
+
}
|
|
143
|
+
rotateIfNeeded() {
|
|
144
|
+
try {
|
|
145
|
+
if (!fs.existsSync(this.logFile)) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const stats = fs.statSync(this.logFile);
|
|
149
|
+
if (stats.size < this.maxLogSize) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
// Close the current stream before rotating
|
|
153
|
+
if (this.stream) {
|
|
154
|
+
this.stream.end();
|
|
155
|
+
this.stream = null;
|
|
156
|
+
}
|
|
157
|
+
// Perform rotation
|
|
158
|
+
const rotatedPath = this.logFile + ".1";
|
|
159
|
+
// Delete old rotated file if it exists
|
|
160
|
+
if (fs.existsSync(rotatedPath)) {
|
|
161
|
+
fs.unlinkSync(rotatedPath);
|
|
162
|
+
}
|
|
163
|
+
// Rename current log to .1
|
|
164
|
+
fs.renameSync(this.logFile, rotatedPath);
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
// Ignore rotation errors to avoid breaking logging
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Create a logger for a specific component.
|
|
173
|
+
*/
|
|
174
|
+
export function createLogger(component, projectRoot, level = "warn", options) {
|
|
175
|
+
const logFile = path.join(projectRoot, ".procsi", "procsi.log");
|
|
176
|
+
return new Logger(component, logFile, level, options);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Parse verbosity flag count to log level.
|
|
180
|
+
* 0 = warn (default), 1 = info, 2 = debug, 3+ = trace
|
|
181
|
+
*/
|
|
182
|
+
export function parseVerbosity(verboseCount) {
|
|
183
|
+
switch (verboseCount) {
|
|
184
|
+
case 0:
|
|
185
|
+
return "warn";
|
|
186
|
+
case 1:
|
|
187
|
+
return "info";
|
|
188
|
+
case 2:
|
|
189
|
+
return "debug";
|
|
190
|
+
default:
|
|
191
|
+
return "trace";
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Check if a string is a valid log level.
|
|
196
|
+
*/
|
|
197
|
+
export function isValidLogLevel(level) {
|
|
198
|
+
return ["error", "warn", "info", "debug", "trace", "silent"].includes(level);
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/shared/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Find the project root by looking for .procsi directory or .git directory.
|
|
3
|
+
* Walks up the directory tree from the current working directory.
|
|
4
|
+
* Returns undefined if no project root is found.
|
|
5
|
+
*
|
|
6
|
+
* When override is provided, returns the resolved override path only if
|
|
7
|
+
* it contains an .procsi or .git directory; otherwise returns undefined.
|
|
8
|
+
*
|
|
9
|
+
* @param startDir - Directory to start searching from. Pass `undefined` to
|
|
10
|
+
* use `process.cwd()` (common when only providing an override).
|
|
11
|
+
* @param override - If provided, resolves this path (with `~` expansion)
|
|
12
|
+
* and checks it directly instead of walking the tree.
|
|
13
|
+
*/
|
|
14
|
+
export declare function findProjectRoot(startDir?: string, override?: string): string | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Determine the project root, creating .procsi if needed.
|
|
17
|
+
* - If .procsi exists anywhere in the tree, use that directory
|
|
18
|
+
* - If .git exists, use the git root
|
|
19
|
+
* - Otherwise, fall back to the user's home directory (global instance)
|
|
20
|
+
*
|
|
21
|
+
* When override is provided, returns the resolved override path directly
|
|
22
|
+
* (the caller is responsible for creating .procsi as needed).
|
|
23
|
+
*/
|
|
24
|
+
export declare function findOrCreateProjectRoot(startDir?: string, override?: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Get the .procsi directory path for a project root.
|
|
27
|
+
*/
|
|
28
|
+
export declare function getProcsiDir(projectRoot: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Ensure the .procsi directory exists, creating it if necessary.
|
|
31
|
+
* Returns the path to the .procsi directory.
|
|
32
|
+
*/
|
|
33
|
+
export declare function ensureProcsiDir(projectRoot: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* Get paths to various files within the .procsi directory.
|
|
36
|
+
*/
|
|
37
|
+
export declare function getProcsiPaths(projectRoot: string): {
|
|
38
|
+
procsiDir: string;
|
|
39
|
+
proxyPortFile: string;
|
|
40
|
+
controlSocketFile: string;
|
|
41
|
+
databaseFile: string;
|
|
42
|
+
caKeyFile: string;
|
|
43
|
+
caCertFile: string;
|
|
44
|
+
pidFile: string;
|
|
45
|
+
logFile: string;
|
|
46
|
+
configFile: string;
|
|
47
|
+
interceptorsDir: string;
|
|
48
|
+
proxyPreloadFile: string;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Read the proxy port from the .procsi directory.
|
|
52
|
+
* Returns undefined if the file doesn't exist.
|
|
53
|
+
*/
|
|
54
|
+
export declare function readProxyPort(projectRoot: string): number | undefined;
|
|
55
|
+
/**
|
|
56
|
+
* Write the proxy port to the .procsi directory.
|
|
57
|
+
*/
|
|
58
|
+
export declare function writeProxyPort(projectRoot: string, port: number): void;
|
|
59
|
+
/**
|
|
60
|
+
* Read the daemon PID from the .procsi directory.
|
|
61
|
+
* Returns undefined if the file doesn't exist.
|
|
62
|
+
*/
|
|
63
|
+
export declare function readDaemonPid(projectRoot: string): number | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* Write the daemon PID to the .procsi directory.
|
|
66
|
+
*/
|
|
67
|
+
export declare function writeDaemonPid(projectRoot: string, pid: number): void;
|
|
68
|
+
/**
|
|
69
|
+
* Remove the daemon PID file.
|
|
70
|
+
*/
|
|
71
|
+
export declare function removeDaemonPid(projectRoot: string): void;
|
|
72
|
+
/**
|
|
73
|
+
* Check if a process with the given PID is running.
|
|
74
|
+
*/
|
|
75
|
+
export declare function isProcessRunning(pid: number): boolean;
|
|
76
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/shared/project.ts"],"names":[],"mappings":"AAsBA;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,GAAE,MAAsB,EAChC,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CA8BpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,GAAE,MAAsB,EAChC,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAyBR;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAQ3D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM;;;;;;;;;;;;EAgBjD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAWrE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAGtE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAWrE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAGrE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAMzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQrD"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as os from "node:os";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
const PROCSI_DIR = ".procsi";
|
|
5
|
+
const HOME_DIR_PREFIX = "~";
|
|
6
|
+
/**
|
|
7
|
+
* Resolve an override path, expanding ~ to the user's home directory
|
|
8
|
+
* and converting relative paths to absolute.
|
|
9
|
+
*/
|
|
10
|
+
function resolveOverridePath(override) {
|
|
11
|
+
if (override.startsWith(HOME_DIR_PREFIX + path.sep) || override === HOME_DIR_PREFIX) {
|
|
12
|
+
return path.join(os.homedir(), override.slice(HOME_DIR_PREFIX.length));
|
|
13
|
+
}
|
|
14
|
+
// Also handle ~/foo on platforms where sep is /
|
|
15
|
+
if (override.startsWith(HOME_DIR_PREFIX + "/")) {
|
|
16
|
+
return path.join(os.homedir(), override.slice(2));
|
|
17
|
+
}
|
|
18
|
+
return path.resolve(override);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Find the project root by looking for .procsi directory or .git directory.
|
|
22
|
+
* Walks up the directory tree from the current working directory.
|
|
23
|
+
* Returns undefined if no project root is found.
|
|
24
|
+
*
|
|
25
|
+
* When override is provided, returns the resolved override path only if
|
|
26
|
+
* it contains an .procsi or .git directory; otherwise returns undefined.
|
|
27
|
+
*
|
|
28
|
+
* @param startDir - Directory to start searching from. Pass `undefined` to
|
|
29
|
+
* use `process.cwd()` (common when only providing an override).
|
|
30
|
+
* @param override - If provided, resolves this path (with `~` expansion)
|
|
31
|
+
* and checks it directly instead of walking the tree.
|
|
32
|
+
*/
|
|
33
|
+
export function findProjectRoot(startDir = process.cwd(), override) {
|
|
34
|
+
if (override !== undefined) {
|
|
35
|
+
const resolved = resolveOverridePath(override);
|
|
36
|
+
if (fs.existsSync(path.join(resolved, PROCSI_DIR)) ||
|
|
37
|
+
fs.existsSync(path.join(resolved, ".git"))) {
|
|
38
|
+
return resolved;
|
|
39
|
+
}
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
let currentDir = path.resolve(startDir);
|
|
43
|
+
const root = path.parse(currentDir).root;
|
|
44
|
+
while (currentDir !== root) {
|
|
45
|
+
// Check for .procsi directory first
|
|
46
|
+
if (fs.existsSync(path.join(currentDir, PROCSI_DIR))) {
|
|
47
|
+
return currentDir;
|
|
48
|
+
}
|
|
49
|
+
// Check for .git directory as fallback
|
|
50
|
+
if (fs.existsSync(path.join(currentDir, ".git"))) {
|
|
51
|
+
return currentDir;
|
|
52
|
+
}
|
|
53
|
+
currentDir = path.dirname(currentDir);
|
|
54
|
+
}
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Determine the project root, creating .procsi if needed.
|
|
59
|
+
* - If .procsi exists anywhere in the tree, use that directory
|
|
60
|
+
* - If .git exists, use the git root
|
|
61
|
+
* - Otherwise, fall back to the user's home directory (global instance)
|
|
62
|
+
*
|
|
63
|
+
* When override is provided, returns the resolved override path directly
|
|
64
|
+
* (the caller is responsible for creating .procsi as needed).
|
|
65
|
+
*/
|
|
66
|
+
export function findOrCreateProjectRoot(startDir = process.cwd(), override) {
|
|
67
|
+
if (override !== undefined) {
|
|
68
|
+
return resolveOverridePath(override);
|
|
69
|
+
}
|
|
70
|
+
let currentDir = path.resolve(startDir);
|
|
71
|
+
const root = path.parse(currentDir).root;
|
|
72
|
+
let gitRoot;
|
|
73
|
+
while (currentDir !== root) {
|
|
74
|
+
// Check for .procsi directory first - this takes priority
|
|
75
|
+
if (fs.existsSync(path.join(currentDir, PROCSI_DIR))) {
|
|
76
|
+
return currentDir;
|
|
77
|
+
}
|
|
78
|
+
// Remember the git root if we find one
|
|
79
|
+
if (!gitRoot && fs.existsSync(path.join(currentDir, ".git"))) {
|
|
80
|
+
gitRoot = currentDir;
|
|
81
|
+
}
|
|
82
|
+
currentDir = path.dirname(currentDir);
|
|
83
|
+
}
|
|
84
|
+
// Fall back to home directory for a global procsi instance
|
|
85
|
+
return gitRoot ?? os.homedir();
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get the .procsi directory path for a project root.
|
|
89
|
+
*/
|
|
90
|
+
export function getProcsiDir(projectRoot) {
|
|
91
|
+
return path.join(projectRoot, PROCSI_DIR);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Ensure the .procsi directory exists, creating it if necessary.
|
|
95
|
+
* Returns the path to the .procsi directory.
|
|
96
|
+
*/
|
|
97
|
+
export function ensureProcsiDir(projectRoot) {
|
|
98
|
+
const procsiDir = getProcsiDir(projectRoot);
|
|
99
|
+
if (!fs.existsSync(procsiDir)) {
|
|
100
|
+
fs.mkdirSync(procsiDir, { recursive: true });
|
|
101
|
+
}
|
|
102
|
+
return procsiDir;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get paths to various files within the .procsi directory.
|
|
106
|
+
*/
|
|
107
|
+
export function getProcsiPaths(projectRoot) {
|
|
108
|
+
const procsiDir = getProcsiDir(projectRoot);
|
|
109
|
+
return {
|
|
110
|
+
procsiDir,
|
|
111
|
+
proxyPortFile: path.join(procsiDir, "proxy.port"),
|
|
112
|
+
controlSocketFile: path.join(procsiDir, "control.sock"),
|
|
113
|
+
databaseFile: path.join(procsiDir, "requests.db"),
|
|
114
|
+
caKeyFile: path.join(procsiDir, "ca-key.pem"),
|
|
115
|
+
caCertFile: path.join(procsiDir, "ca.pem"),
|
|
116
|
+
pidFile: path.join(procsiDir, "daemon.pid"),
|
|
117
|
+
logFile: path.join(procsiDir, "procsi.log"),
|
|
118
|
+
configFile: path.join(procsiDir, "config.json"),
|
|
119
|
+
interceptorsDir: path.join(procsiDir, "interceptors"),
|
|
120
|
+
proxyPreloadFile: path.join(procsiDir, "proxy-preload.cjs"),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Read the proxy port from the .procsi directory.
|
|
125
|
+
* Returns undefined if the file doesn't exist.
|
|
126
|
+
*/
|
|
127
|
+
export function readProxyPort(projectRoot) {
|
|
128
|
+
const { proxyPortFile } = getProcsiPaths(projectRoot);
|
|
129
|
+
if (!fs.existsSync(proxyPortFile)) {
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
const content = fs.readFileSync(proxyPortFile, "utf-8").trim();
|
|
133
|
+
const port = parseInt(content, 10);
|
|
134
|
+
return isNaN(port) ? undefined : port;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Write the proxy port to the .procsi directory.
|
|
138
|
+
*/
|
|
139
|
+
export function writeProxyPort(projectRoot, port) {
|
|
140
|
+
const { proxyPortFile } = getProcsiPaths(projectRoot);
|
|
141
|
+
fs.writeFileSync(proxyPortFile, port.toString(), "utf-8");
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Read the daemon PID from the .procsi directory.
|
|
145
|
+
* Returns undefined if the file doesn't exist.
|
|
146
|
+
*/
|
|
147
|
+
export function readDaemonPid(projectRoot) {
|
|
148
|
+
const { pidFile } = getProcsiPaths(projectRoot);
|
|
149
|
+
if (!fs.existsSync(pidFile)) {
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
const content = fs.readFileSync(pidFile, "utf-8").trim();
|
|
153
|
+
const pid = parseInt(content, 10);
|
|
154
|
+
return isNaN(pid) ? undefined : pid;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Write the daemon PID to the .procsi directory.
|
|
158
|
+
*/
|
|
159
|
+
export function writeDaemonPid(projectRoot, pid) {
|
|
160
|
+
const { pidFile } = getProcsiPaths(projectRoot);
|
|
161
|
+
fs.writeFileSync(pidFile, pid.toString(), "utf-8");
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Remove the daemon PID file.
|
|
165
|
+
*/
|
|
166
|
+
export function removeDaemonPid(projectRoot) {
|
|
167
|
+
const { pidFile } = getProcsiPaths(projectRoot);
|
|
168
|
+
if (fs.existsSync(pidFile)) {
|
|
169
|
+
fs.unlinkSync(pidFile);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Check if a process with the given PID is running.
|
|
174
|
+
*/
|
|
175
|
+
export function isProcessRunning(pid) {
|
|
176
|
+
try {
|
|
177
|
+
// Sending signal 0 checks if the process exists without actually sending a signal
|
|
178
|
+
process.kill(pid, 0);
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/shared/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface ProxyInfo {
|
|
2
|
+
proxyUrl: string;
|
|
3
|
+
caCertPath: string;
|
|
4
|
+
envBlock: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Build proxy connection details from port and CA cert path.
|
|
8
|
+
*/
|
|
9
|
+
export declare function buildProxyInfo(proxyPort: number, caCertPath: string): ProxyInfo;
|
|
10
|
+
//# sourceMappingURL=proxy-info.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-info.d.ts","sourceRoot":"","sources":["../../src/shared/proxy-info.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAY/E"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build proxy connection details from port and CA cert path.
|
|
3
|
+
*/
|
|
4
|
+
export function buildProxyInfo(proxyPort, caCertPath) {
|
|
5
|
+
const proxyUrl = `http://127.0.0.1:${proxyPort}`;
|
|
6
|
+
const envBlock = [
|
|
7
|
+
`export HTTP_PROXY="${proxyUrl}"`,
|
|
8
|
+
`export HTTPS_PROXY="${proxyUrl}"`,
|
|
9
|
+
`export SSL_CERT_FILE="${caCertPath}"`,
|
|
10
|
+
`export REQUESTS_CA_BUNDLE="${caCertPath}"`,
|
|
11
|
+
`export NODE_EXTRA_CA_CERTS="${caCertPath}"`,
|
|
12
|
+
].join("\n");
|
|
13
|
+
return { proxyUrl, caCertPath, envBlock };
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=proxy-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-info.js","sourceRoot":"","sources":["../../src/shared/proxy-info.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,UAAkB;IAClE,MAAM,QAAQ,GAAG,oBAAoB,SAAS,EAAE,CAAC;IAEjD,MAAM,QAAQ,GAAG;QACf,sBAAsB,QAAQ,GAAG;QACjC,uBAAuB,QAAQ,GAAG;QAClC,yBAAyB,UAAU,GAAG;QACtC,8BAA8B,UAAU,GAAG;QAC3C,+BAA+B,UAAU,GAAG;KAC7C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core types for procsi
|
|
3
|
+
*/
|
|
4
|
+
export type InterceptionType = "modified" | "mocked";
|
|
5
|
+
export interface CapturedRequest {
|
|
6
|
+
id: string;
|
|
7
|
+
sessionId: string;
|
|
8
|
+
label?: string;
|
|
9
|
+
timestamp: number;
|
|
10
|
+
method: string;
|
|
11
|
+
url: string;
|
|
12
|
+
host: string;
|
|
13
|
+
path: string;
|
|
14
|
+
requestHeaders: Record<string, string>;
|
|
15
|
+
requestBody?: Buffer;
|
|
16
|
+
requestBodyTruncated?: boolean;
|
|
17
|
+
responseStatus?: number;
|
|
18
|
+
responseHeaders?: Record<string, string>;
|
|
19
|
+
responseBody?: Buffer;
|
|
20
|
+
responseBodyTruncated?: boolean;
|
|
21
|
+
durationMs?: number;
|
|
22
|
+
interceptedBy?: string;
|
|
23
|
+
interceptionType?: InterceptionType;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Summary version of CapturedRequest for list views.
|
|
27
|
+
* Excludes body and header data to reduce transfer size.
|
|
28
|
+
*/
|
|
29
|
+
export interface CapturedRequestSummary {
|
|
30
|
+
id: string;
|
|
31
|
+
sessionId: string;
|
|
32
|
+
label?: string;
|
|
33
|
+
timestamp: number;
|
|
34
|
+
method: string;
|
|
35
|
+
url: string;
|
|
36
|
+
host: string;
|
|
37
|
+
path: string;
|
|
38
|
+
responseStatus?: number;
|
|
39
|
+
durationMs?: number;
|
|
40
|
+
/** Size of request body in bytes (without transferring the body itself) */
|
|
41
|
+
requestBodySize: number;
|
|
42
|
+
/** Size of response body in bytes (without transferring the body itself) */
|
|
43
|
+
responseBodySize: number;
|
|
44
|
+
interceptedBy?: string;
|
|
45
|
+
interceptionType?: InterceptionType;
|
|
46
|
+
}
|
|
47
|
+
export interface Session {
|
|
48
|
+
id: string;
|
|
49
|
+
label?: string;
|
|
50
|
+
pid: number;
|
|
51
|
+
startedAt: number;
|
|
52
|
+
}
|
|
53
|
+
export interface DaemonStatus {
|
|
54
|
+
running: boolean;
|
|
55
|
+
proxyPort?: number;
|
|
56
|
+
sessionCount: number;
|
|
57
|
+
requestCount: number;
|
|
58
|
+
version: string;
|
|
59
|
+
interceptorCount?: number;
|
|
60
|
+
}
|
|
61
|
+
export interface RequestFilter {
|
|
62
|
+
methods?: string[];
|
|
63
|
+
statusRange?: string;
|
|
64
|
+
search?: string;
|
|
65
|
+
host?: string;
|
|
66
|
+
pathPrefix?: string;
|
|
67
|
+
since?: number;
|
|
68
|
+
before?: number;
|
|
69
|
+
headerName?: string;
|
|
70
|
+
headerValue?: string;
|
|
71
|
+
headerTarget?: "request" | "response" | "both";
|
|
72
|
+
interceptedBy?: string;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Result from a JSON body query — a summary with the extracted value appended.
|
|
76
|
+
*/
|
|
77
|
+
export interface JsonQueryResult extends CapturedRequestSummary {
|
|
78
|
+
extractedValue: unknown;
|
|
79
|
+
}
|
|
80
|
+
export interface InterceptorRequest {
|
|
81
|
+
method: string;
|
|
82
|
+
url: string;
|
|
83
|
+
host: string;
|
|
84
|
+
path: string;
|
|
85
|
+
headers: Record<string, string>;
|
|
86
|
+
body?: Buffer;
|
|
87
|
+
}
|
|
88
|
+
export interface InterceptorResponse {
|
|
89
|
+
status: number;
|
|
90
|
+
headers?: Record<string, string>;
|
|
91
|
+
body?: string | Buffer;
|
|
92
|
+
}
|
|
93
|
+
export interface InterceptorContext {
|
|
94
|
+
request: Readonly<InterceptorRequest>;
|
|
95
|
+
forward: () => Promise<InterceptorResponse>;
|
|
96
|
+
procsi: ProcsiClient;
|
|
97
|
+
log: (message: string) => void;
|
|
98
|
+
}
|
|
99
|
+
export interface Interceptor {
|
|
100
|
+
name?: string;
|
|
101
|
+
match?: (request: InterceptorRequest) => boolean | Promise<boolean>;
|
|
102
|
+
handler: (ctx: InterceptorContext) => Promise<InterceptorResponse | undefined | void>;
|
|
103
|
+
}
|
|
104
|
+
export interface ProcsiClient {
|
|
105
|
+
countRequests(filter?: RequestFilter): Promise<number>;
|
|
106
|
+
listRequests(options?: {
|
|
107
|
+
filter?: RequestFilter;
|
|
108
|
+
limit?: number;
|
|
109
|
+
offset?: number;
|
|
110
|
+
}): Promise<CapturedRequestSummary[]>;
|
|
111
|
+
getRequest(id: string): Promise<CapturedRequest | null>;
|
|
112
|
+
searchBodies(options: {
|
|
113
|
+
query: string;
|
|
114
|
+
filter?: RequestFilter;
|
|
115
|
+
limit?: number;
|
|
116
|
+
}): Promise<CapturedRequestSummary[]>;
|
|
117
|
+
queryJsonBodies(options: {
|
|
118
|
+
jsonPath: string;
|
|
119
|
+
filter?: RequestFilter;
|
|
120
|
+
}): Promise<JsonQueryResult[]>;
|
|
121
|
+
}
|
|
122
|
+
export interface InterceptorInfo {
|
|
123
|
+
name: string;
|
|
124
|
+
hasMatch: boolean;
|
|
125
|
+
sourceFile: string;
|
|
126
|
+
error?: string;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|