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,272 @@
|
|
|
1
|
+
import * as net from "node:net";
|
|
2
|
+
const CONTROL_TIMEOUT_MS = 5000;
|
|
3
|
+
/** Maximum buffer size per connection before disconnecting (1 MB). Shared by both client and server. */
|
|
4
|
+
export const MAX_BUFFER_SIZE = 1024 * 1024;
|
|
5
|
+
/**
|
|
6
|
+
* Runtime type guard for incoming control responses.
|
|
7
|
+
*/
|
|
8
|
+
function isControlResponse(value) {
|
|
9
|
+
return (typeof value === "object" &&
|
|
10
|
+
value !== null &&
|
|
11
|
+
typeof value["id"] === "string");
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Recursively revive Buffer objects from JSON serialisation.
|
|
15
|
+
* JSON.stringify(Buffer) produces { type: 'Buffer', data: [...] }
|
|
16
|
+
* This converts them back to actual Buffer instances.
|
|
17
|
+
*/
|
|
18
|
+
export function reviveBuffers(obj) {
|
|
19
|
+
if (obj === null || obj === undefined) {
|
|
20
|
+
return obj;
|
|
21
|
+
}
|
|
22
|
+
// Check if this is a serialised Buffer
|
|
23
|
+
if (typeof obj === "object" &&
|
|
24
|
+
"type" in obj &&
|
|
25
|
+
"data" in obj &&
|
|
26
|
+
obj["type"] === "Buffer" &&
|
|
27
|
+
Array.isArray(obj["data"])) {
|
|
28
|
+
return Buffer.from(obj.data);
|
|
29
|
+
}
|
|
30
|
+
// Recurse into arrays
|
|
31
|
+
if (Array.isArray(obj)) {
|
|
32
|
+
return obj.map(reviveBuffers);
|
|
33
|
+
}
|
|
34
|
+
// Recurse into objects
|
|
35
|
+
if (typeof obj === "object") {
|
|
36
|
+
const result = {};
|
|
37
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
38
|
+
result[key] = reviveBuffers(value);
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
return obj;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Client for communicating with the control server via Unix socket.
|
|
46
|
+
* Maintains a persistent connection and multiplexes requests by ID.
|
|
47
|
+
*/
|
|
48
|
+
export class ControlClient {
|
|
49
|
+
socketPath;
|
|
50
|
+
requestId = 0;
|
|
51
|
+
socket = null;
|
|
52
|
+
pending = new Map();
|
|
53
|
+
buffer = "";
|
|
54
|
+
connectPromise = null;
|
|
55
|
+
constructor(socketPath) {
|
|
56
|
+
this.socketPath = socketPath;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Send a request to the control server and wait for response.
|
|
60
|
+
*/
|
|
61
|
+
async request(method, params) {
|
|
62
|
+
const socket = await this.getSocket();
|
|
63
|
+
const id = String(++this.requestId);
|
|
64
|
+
return new Promise((resolve, reject) => {
|
|
65
|
+
const timer = setTimeout(() => {
|
|
66
|
+
this.pending.delete(id);
|
|
67
|
+
reject(new Error("Control request timed out"));
|
|
68
|
+
}, CONTROL_TIMEOUT_MS);
|
|
69
|
+
this.pending.set(id, {
|
|
70
|
+
resolve: resolve,
|
|
71
|
+
reject,
|
|
72
|
+
timer,
|
|
73
|
+
});
|
|
74
|
+
const message = { id, method, params };
|
|
75
|
+
socket.write(JSON.stringify(message) + "\n");
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Close the persistent socket and reject any pending requests.
|
|
80
|
+
*/
|
|
81
|
+
close() {
|
|
82
|
+
if (this.socket) {
|
|
83
|
+
this.socket.end();
|
|
84
|
+
this.socket = null;
|
|
85
|
+
}
|
|
86
|
+
this.connectPromise = null;
|
|
87
|
+
this.buffer = "";
|
|
88
|
+
this.rejectAllPending(new Error("Client closed"));
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Check if the daemon is running by sending a ping.
|
|
92
|
+
*/
|
|
93
|
+
async ping() {
|
|
94
|
+
try {
|
|
95
|
+
await this.request("ping");
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get daemon status.
|
|
104
|
+
*/
|
|
105
|
+
async status() {
|
|
106
|
+
return this.request("status");
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Register a new session.
|
|
110
|
+
*/
|
|
111
|
+
async registerSession(label, pid) {
|
|
112
|
+
return this.request("registerSession", { label, pid });
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* List all active sessions.
|
|
116
|
+
*/
|
|
117
|
+
async listSessions() {
|
|
118
|
+
return this.request("listSessions");
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* List captured requests (full data including bodies).
|
|
122
|
+
*/
|
|
123
|
+
async listRequests(options) {
|
|
124
|
+
return this.request("listRequests", options);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* List request summaries (excludes body/header data for performance).
|
|
128
|
+
*/
|
|
129
|
+
async listRequestsSummary(options) {
|
|
130
|
+
return this.request("listRequestsSummary", options);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get a specific request by ID.
|
|
134
|
+
*/
|
|
135
|
+
async getRequest(id) {
|
|
136
|
+
return this.request("getRequest", { id });
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Count requests.
|
|
140
|
+
*/
|
|
141
|
+
async countRequests(options) {
|
|
142
|
+
return this.request("countRequests", options);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Search through request/response body content.
|
|
146
|
+
*/
|
|
147
|
+
async searchBodies(options) {
|
|
148
|
+
return this.request("searchBodies", options);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Query JSON bodies using json_extract.
|
|
152
|
+
*/
|
|
153
|
+
async queryJsonBodies(options) {
|
|
154
|
+
return this.request("queryJsonBodies", options);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Clear all requests.
|
|
158
|
+
*/
|
|
159
|
+
async clearRequests() {
|
|
160
|
+
await this.request("clearRequests");
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* List loaded interceptors and their metadata.
|
|
164
|
+
*/
|
|
165
|
+
async listInterceptors() {
|
|
166
|
+
return this.request("listInterceptors");
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Reload interceptors from disk.
|
|
170
|
+
*/
|
|
171
|
+
async reloadInterceptors() {
|
|
172
|
+
return this.request("reloadInterceptors");
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Lazily connect, reuse existing socket, deduplicate concurrent connect attempts.
|
|
176
|
+
*/
|
|
177
|
+
getSocket() {
|
|
178
|
+
if (this.socket && !this.socket.destroyed) {
|
|
179
|
+
return Promise.resolve(this.socket);
|
|
180
|
+
}
|
|
181
|
+
// Deduplicate concurrent connection attempts
|
|
182
|
+
if (this.connectPromise) {
|
|
183
|
+
return this.connectPromise;
|
|
184
|
+
}
|
|
185
|
+
this.connectPromise = new Promise((resolve, reject) => {
|
|
186
|
+
const socket = net.createConnection(this.socketPath);
|
|
187
|
+
socket.on("connect", () => {
|
|
188
|
+
this.socket = socket;
|
|
189
|
+
this.connectPromise = null;
|
|
190
|
+
this.buffer = "";
|
|
191
|
+
resolve(socket);
|
|
192
|
+
});
|
|
193
|
+
socket.on("data", (data) => {
|
|
194
|
+
this.handleData(data);
|
|
195
|
+
});
|
|
196
|
+
socket.on("error", (err) => {
|
|
197
|
+
// If we're still connecting, reject the connect promise
|
|
198
|
+
if (this.connectPromise) {
|
|
199
|
+
this.connectPromise = null;
|
|
200
|
+
reject(err);
|
|
201
|
+
}
|
|
202
|
+
this.handleDisconnect(err);
|
|
203
|
+
});
|
|
204
|
+
socket.on("close", () => {
|
|
205
|
+
this.handleDisconnect(new Error("Socket closed"));
|
|
206
|
+
});
|
|
207
|
+
socket.setTimeout(CONTROL_TIMEOUT_MS, () => {
|
|
208
|
+
if (this.connectPromise) {
|
|
209
|
+
this.connectPromise = null;
|
|
210
|
+
socket.destroy();
|
|
211
|
+
reject(new Error("Control connection timed out"));
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
return this.connectPromise;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Parse newline-delimited responses and resolve/reject matching pending requests.
|
|
219
|
+
*/
|
|
220
|
+
handleData(data) {
|
|
221
|
+
this.buffer += data.toString();
|
|
222
|
+
// Guard against unbounded buffer growth
|
|
223
|
+
if (this.buffer.length > MAX_BUFFER_SIZE) {
|
|
224
|
+
this.socket?.destroy();
|
|
225
|
+
this.handleDisconnect(new Error("Response buffer exceeded maximum size"));
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
let newlineIndex;
|
|
229
|
+
while ((newlineIndex = this.buffer.indexOf("\n")) !== -1) {
|
|
230
|
+
const responseStr = this.buffer.slice(0, newlineIndex);
|
|
231
|
+
this.buffer = this.buffer.slice(newlineIndex + 1);
|
|
232
|
+
try {
|
|
233
|
+
const parsed = JSON.parse(responseStr);
|
|
234
|
+
if (!isControlResponse(parsed)) {
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
const pending = this.pending.get(parsed.id);
|
|
238
|
+
if (!pending) {
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
this.pending.delete(parsed.id);
|
|
242
|
+
clearTimeout(pending.timer);
|
|
243
|
+
if (parsed.error) {
|
|
244
|
+
pending.reject(new Error(parsed.error.message));
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
pending.resolve(reviveBuffers(parsed.result));
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
// Skip malformed messages
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Handle socket disconnection — null socket, reject all pending, next request reconnects.
|
|
257
|
+
*/
|
|
258
|
+
handleDisconnect(err) {
|
|
259
|
+
this.socket = null;
|
|
260
|
+
this.connectPromise = null;
|
|
261
|
+
this.buffer = "";
|
|
262
|
+
this.rejectAllPending(err);
|
|
263
|
+
}
|
|
264
|
+
rejectAllPending(err) {
|
|
265
|
+
for (const [id, pending] of this.pending) {
|
|
266
|
+
clearTimeout(pending.timer);
|
|
267
|
+
pending.reject(err);
|
|
268
|
+
this.pending.delete(id);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=control-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-client.js","sourceRoot":"","sources":["../../src/shared/control-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { LogLevel } from "./logger.js";
|
|
2
|
+
export interface StartDaemonOptions {
|
|
3
|
+
logLevel?: LogLevel;
|
|
4
|
+
autoRestart?: boolean;
|
|
5
|
+
onVersionMismatch?: (running: string, cli: string) => void;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Check if the daemon is running for a project.
|
|
9
|
+
*/
|
|
10
|
+
export declare function isDaemonRunning(projectRoot: string): Promise<boolean>;
|
|
11
|
+
/**
|
|
12
|
+
* Get the version of the running daemon.
|
|
13
|
+
* Returns null if daemon is not running.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getDaemonVersion(projectRoot: string): Promise<string | null>;
|
|
16
|
+
/**
|
|
17
|
+
* Restart the daemon for a project.
|
|
18
|
+
* Returns the new proxy port.
|
|
19
|
+
*/
|
|
20
|
+
export declare function restartDaemon(projectRoot: string, logLevel?: LogLevel): Promise<number>;
|
|
21
|
+
/**
|
|
22
|
+
* Start the daemon for a project.
|
|
23
|
+
* Returns the proxy port.
|
|
24
|
+
*
|
|
25
|
+
* When the daemon is already running and autoRestart is true (default),
|
|
26
|
+
* restarts the daemon if there is a version mismatch between CLI and daemon.
|
|
27
|
+
*/
|
|
28
|
+
export declare function startDaemon(projectRoot: string, options?: StartDaemonOptions | LogLevel): Promise<number>;
|
|
29
|
+
/**
|
|
30
|
+
* Stop the daemon for a project.
|
|
31
|
+
*/
|
|
32
|
+
export declare function stopDaemon(projectRoot: string): Promise<void>;
|
|
33
|
+
//# sourceMappingURL=daemon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/shared/daemon.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAe5C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5D;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgB3E;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgBlF;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,QAAQ,GAAE,QAAiB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,kBAAkB,GAAG,QAAQ,GACtC,OAAO,CAAC,MAAM,CAAC,CA8BjB;AAgDD;;GAEG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBnE"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { spawn } from "node:child_process";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { getProcsiPaths, readDaemonPid, isProcessRunning, ensureProcsiDir } from "./project.js";
|
|
6
|
+
import { ControlClient } from "./control-client.js";
|
|
7
|
+
import { getProcsiVersion } from "./version.js";
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = path.dirname(__filename);
|
|
10
|
+
/**
|
|
11
|
+
* Get the path to the daemon entry point.
|
|
12
|
+
*/
|
|
13
|
+
function getDaemonPath() {
|
|
14
|
+
// This is relative to dist/shared/daemon.js
|
|
15
|
+
// The daemon entry point is at dist/daemon/index.js
|
|
16
|
+
return path.resolve(__dirname, "..", "daemon", "index.js");
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Check if the daemon is running for a project.
|
|
20
|
+
*/
|
|
21
|
+
export async function isDaemonRunning(projectRoot) {
|
|
22
|
+
const paths = getProcsiPaths(projectRoot);
|
|
23
|
+
// Check PID file first
|
|
24
|
+
const pid = readDaemonPid(projectRoot);
|
|
25
|
+
if (!pid || !isProcessRunning(pid)) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
// Verify the daemon is actually responding
|
|
29
|
+
const client = new ControlClient(paths.controlSocketFile);
|
|
30
|
+
try {
|
|
31
|
+
return await client.ping();
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
client.close();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get the version of the running daemon.
|
|
39
|
+
* Returns null if daemon is not running.
|
|
40
|
+
*/
|
|
41
|
+
export async function getDaemonVersion(projectRoot) {
|
|
42
|
+
if (!(await isDaemonRunning(projectRoot))) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
const paths = getProcsiPaths(projectRoot);
|
|
46
|
+
const client = new ControlClient(paths.controlSocketFile);
|
|
47
|
+
try {
|
|
48
|
+
const status = await client.status();
|
|
49
|
+
return status.version;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
client.close();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Restart the daemon for a project.
|
|
60
|
+
* Returns the new proxy port.
|
|
61
|
+
*/
|
|
62
|
+
export async function restartDaemon(projectRoot, logLevel = "warn") {
|
|
63
|
+
await stopDaemon(projectRoot);
|
|
64
|
+
return spawnDaemon(projectRoot, logLevel);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Start the daemon for a project.
|
|
68
|
+
* Returns the proxy port.
|
|
69
|
+
*
|
|
70
|
+
* When the daemon is already running and autoRestart is true (default),
|
|
71
|
+
* restarts the daemon if there is a version mismatch between CLI and daemon.
|
|
72
|
+
*/
|
|
73
|
+
export async function startDaemon(projectRoot, options) {
|
|
74
|
+
// Handle backward compatibility with old signature
|
|
75
|
+
const opts = typeof options === "string" ? { logLevel: options } : (options ?? {});
|
|
76
|
+
const { logLevel = "warn", autoRestart = true, onVersionMismatch } = opts;
|
|
77
|
+
// Check if already running
|
|
78
|
+
if (await isDaemonRunning(projectRoot)) {
|
|
79
|
+
const paths = getProcsiPaths(projectRoot);
|
|
80
|
+
// Check version
|
|
81
|
+
const daemonVersion = await getDaemonVersion(projectRoot);
|
|
82
|
+
const cliVersion = getProcsiVersion();
|
|
83
|
+
if (daemonVersion && daemonVersion !== cliVersion) {
|
|
84
|
+
// Version mismatch detected
|
|
85
|
+
if (onVersionMismatch) {
|
|
86
|
+
onVersionMismatch(daemonVersion, cliVersion);
|
|
87
|
+
}
|
|
88
|
+
if (autoRestart) {
|
|
89
|
+
return restartDaemon(projectRoot, logLevel);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const portContent = fs.readFileSync(paths.proxyPortFile, "utf-8").trim();
|
|
93
|
+
return parseInt(portContent, 10);
|
|
94
|
+
}
|
|
95
|
+
return spawnDaemon(projectRoot, logLevel);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Spawn a new daemon process.
|
|
99
|
+
* Internal function used by startDaemon and restartDaemon.
|
|
100
|
+
*/
|
|
101
|
+
async function spawnDaemon(projectRoot, logLevel) {
|
|
102
|
+
// Ensure .procsi directory exists
|
|
103
|
+
ensureProcsiDir(projectRoot);
|
|
104
|
+
const daemonPath = getDaemonPath();
|
|
105
|
+
const paths = getProcsiPaths(projectRoot);
|
|
106
|
+
// Spawn daemon as detached background process
|
|
107
|
+
// Clear the log file first so we only see errors from this attempt
|
|
108
|
+
const logFile = path.join(paths.procsiDir, "daemon.log");
|
|
109
|
+
fs.writeFileSync(logFile, "");
|
|
110
|
+
const out = fs.openSync(logFile, "a");
|
|
111
|
+
const err = fs.openSync(logFile, "a");
|
|
112
|
+
// The daemon is the proxy itself — it must not load its own preload script.
|
|
113
|
+
// Strip NODE_OPTIONS (which contains --require for the preload) and the
|
|
114
|
+
// guard variable so they don't leak into the child.
|
|
115
|
+
const { NODE_OPTIONS: _nodeOpts, PROCSI_ORIG_NODE_OPTIONS: _origNodeOpts, ...cleanEnv } = process.env;
|
|
116
|
+
const child = spawn("node", [daemonPath], {
|
|
117
|
+
env: {
|
|
118
|
+
...cleanEnv,
|
|
119
|
+
PROJECT_ROOT: projectRoot,
|
|
120
|
+
PROCSI_LOG_LEVEL: logLevel,
|
|
121
|
+
},
|
|
122
|
+
detached: true,
|
|
123
|
+
stdio: ["ignore", out, err],
|
|
124
|
+
});
|
|
125
|
+
// Detach from parent process
|
|
126
|
+
child.unref();
|
|
127
|
+
// Wait for daemon to start and write port file
|
|
128
|
+
const port = await waitForDaemon(projectRoot, 10000);
|
|
129
|
+
return port;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Stop the daemon for a project.
|
|
133
|
+
*/
|
|
134
|
+
export async function stopDaemon(projectRoot) {
|
|
135
|
+
const pid = readDaemonPid(projectRoot);
|
|
136
|
+
if (!pid) {
|
|
137
|
+
return; // Already stopped
|
|
138
|
+
}
|
|
139
|
+
if (!isProcessRunning(pid)) {
|
|
140
|
+
// PID file exists but process is dead - clean up
|
|
141
|
+
const paths = getProcsiPaths(projectRoot);
|
|
142
|
+
cleanupDaemonFiles(paths);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
// Send SIGTERM to daemon
|
|
146
|
+
process.kill(pid, "SIGTERM");
|
|
147
|
+
// Wait for daemon to stop
|
|
148
|
+
await waitForDaemonStop(pid, 5000);
|
|
149
|
+
// Clean up any remaining files
|
|
150
|
+
const paths = getProcsiPaths(projectRoot);
|
|
151
|
+
cleanupDaemonFiles(paths);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Wait for the daemon to start and return the proxy port.
|
|
155
|
+
*/
|
|
156
|
+
async function waitForDaemon(projectRoot, timeoutMs) {
|
|
157
|
+
const paths = getProcsiPaths(projectRoot);
|
|
158
|
+
const startTime = Date.now();
|
|
159
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
160
|
+
// Check if port file exists
|
|
161
|
+
if (fs.existsSync(paths.proxyPortFile)) {
|
|
162
|
+
const portContent = fs.readFileSync(paths.proxyPortFile, "utf-8").trim();
|
|
163
|
+
const port = parseInt(portContent, 10);
|
|
164
|
+
if (!isNaN(port)) {
|
|
165
|
+
// Verify daemon is responding
|
|
166
|
+
const client = new ControlClient(paths.controlSocketFile);
|
|
167
|
+
try {
|
|
168
|
+
if (await client.ping()) {
|
|
169
|
+
return port;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
finally {
|
|
173
|
+
client.close();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Wait a bit before checking again
|
|
178
|
+
await sleep(100);
|
|
179
|
+
}
|
|
180
|
+
// On timeout, check daemon.log for errors to surface to the user
|
|
181
|
+
const logPath = path.join(paths.procsiDir, "daemon.log");
|
|
182
|
+
let logTail = "";
|
|
183
|
+
if (fs.existsSync(logPath)) {
|
|
184
|
+
const content = fs.readFileSync(logPath, "utf-8");
|
|
185
|
+
const lines = content.trim().split("\n");
|
|
186
|
+
logTail = lines.slice(-20).join("\n"); // Last 20 lines
|
|
187
|
+
}
|
|
188
|
+
if (logTail) {
|
|
189
|
+
throw new Error(`Daemon failed to start. Log output:\n${logTail}`);
|
|
190
|
+
}
|
|
191
|
+
throw new Error("Daemon failed to start within timeout (no log output)");
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Wait for daemon process to stop.
|
|
195
|
+
*/
|
|
196
|
+
async function waitForDaemonStop(pid, timeoutMs) {
|
|
197
|
+
const startTime = Date.now();
|
|
198
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
199
|
+
if (!isProcessRunning(pid)) {
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
await sleep(100);
|
|
203
|
+
}
|
|
204
|
+
// Force kill if still running
|
|
205
|
+
try {
|
|
206
|
+
process.kill(pid, "SIGKILL");
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
// Process may have already exited
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Clean up daemon files (socket, port file, pid file).
|
|
214
|
+
*/
|
|
215
|
+
function cleanupDaemonFiles(paths) {
|
|
216
|
+
const files = [paths.controlSocketFile, paths.proxyPortFile, paths.pidFile];
|
|
217
|
+
for (const file of files) {
|
|
218
|
+
if (fs.existsSync(file)) {
|
|
219
|
+
try {
|
|
220
|
+
fs.unlinkSync(file);
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
// Ignore errors during cleanup
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
function sleep(ms) {
|
|
229
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/shared/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export type LogLevel = "error" | "warn" | "info" | "debug" | "trace" | "silent";
|
|
2
|
+
export type Component = "daemon" | "tui" | "cli" | "proxy" | "control" | "storage" | "interceptor";
|
|
3
|
+
export interface LoggerOptions {
|
|
4
|
+
maxLogSize?: number;
|
|
5
|
+
}
|
|
6
|
+
export declare class Logger {
|
|
7
|
+
private component;
|
|
8
|
+
private logFile;
|
|
9
|
+
private level;
|
|
10
|
+
private stream;
|
|
11
|
+
private buffer;
|
|
12
|
+
private flushTimer;
|
|
13
|
+
private dirEnsured;
|
|
14
|
+
private maxLogSize;
|
|
15
|
+
constructor(component: Component, logFile: string, level?: LogLevel, options?: LoggerOptions);
|
|
16
|
+
error(msg: string, data?: Record<string, unknown>): void;
|
|
17
|
+
warn(msg: string, data?: Record<string, unknown>): void;
|
|
18
|
+
info(msg: string, data?: Record<string, unknown>): void;
|
|
19
|
+
debug(msg: string, data?: Record<string, unknown>): void;
|
|
20
|
+
trace(msg: string, data?: Record<string, unknown>): void;
|
|
21
|
+
/**
|
|
22
|
+
* Flush any buffered log lines and close the write stream.
|
|
23
|
+
* Uses synchronous write for the final flush to avoid losing entries.
|
|
24
|
+
*/
|
|
25
|
+
close(): void;
|
|
26
|
+
private log;
|
|
27
|
+
private scheduleFlush;
|
|
28
|
+
private flush;
|
|
29
|
+
private ensureDir;
|
|
30
|
+
private ensureStream;
|
|
31
|
+
private shouldLog;
|
|
32
|
+
private rotateIfNeeded;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a logger for a specific component.
|
|
36
|
+
*/
|
|
37
|
+
export declare function createLogger(component: Component, projectRoot: string, level?: LogLevel, options?: LoggerOptions): Logger;
|
|
38
|
+
/**
|
|
39
|
+
* Parse verbosity flag count to log level.
|
|
40
|
+
* 0 = warn (default), 1 = info, 2 = debug, 3+ = trace
|
|
41
|
+
*/
|
|
42
|
+
export declare function parseVerbosity(verboseCount: number): LogLevel;
|
|
43
|
+
/**
|
|
44
|
+
* Check if a string is a valid log level.
|
|
45
|
+
*/
|
|
46
|
+
export declare function isValidLogLevel(level: string): level is LogLevel;
|
|
47
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/shared/logger.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAChF,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC;AAyBnG,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,MAAM;IAQf,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,KAAK;IATf,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;gBAGjB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,QAAiB,EAChC,OAAO,CAAC,EAAE,aAAa;IAKzB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIvD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIvD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIxD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIxD;;;OAGG;IACH,KAAK,IAAI,IAAI;IA8Bb,OAAO,CAAC,GAAG;IAsBX,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,KAAK;IAkBb,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,cAAc;CA+BvB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,MAAM,EACnB,KAAK,GAAE,QAAiB,EACxB,OAAO,CAAC,EAAE,aAAa,GACtB,MAAM,CAGR;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,QAAQ,CAW7D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,QAAQ,CAEhE"}
|