htpx-cli 0.1.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 +274 -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/init.d.ts +9 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +25 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/intercept.d.ts +8 -0
- package/dist/cli/commands/intercept.d.ts.map +1 -0
- package/dist/cli/commands/intercept.js +59 -0
- package/dist/cli/commands/intercept.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 +13 -0
- package/dist/cli/commands/project.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 +36 -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 +27 -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 +27 -0
- package/dist/cli/commands/tui.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 +20 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/tui/App.d.ts +10 -0
- package/dist/cli/tui/App.d.ts.map +1 -0
- package/dist/cli/tui/App.js +96 -0
- package/dist/cli/tui/App.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/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/RequestDetails.d.ts +13 -0
- package/dist/cli/tui/components/RequestDetails.d.ts.map +1 -0
- package/dist/cli/tui/components/RequestDetails.js +19 -0
- package/dist/cli/tui/components/RequestDetails.js.map +1 -0
- package/dist/cli/tui/components/RequestList.d.ts +15 -0
- package/dist/cli/tui/components/RequestList.d.ts.map +1 -0
- package/dist/cli/tui/components/RequestList.js +17 -0
- package/dist/cli/tui/components/RequestList.js.map +1 -0
- package/dist/cli/tui/components/RequestListItem.d.ts +13 -0
- package/dist/cli/tui/components/RequestListItem.d.ts.map +1 -0
- package/dist/cli/tui/components/RequestListItem.js +53 -0
- package/dist/cli/tui/components/RequestListItem.js.map +1 -0
- package/dist/cli/tui/components/StatusBar.d.ts +10 -0
- package/dist/cli/tui/components/StatusBar.d.ts.map +1 -0
- package/dist/cli/tui/components/StatusBar.js +18 -0
- package/dist/cli/tui/components/StatusBar.js.map +1 -0
- package/dist/cli/tui/hooks/useExport.d.ts +18 -0
- package/dist/cli/tui/hooks/useExport.d.ts.map +1 -0
- package/dist/cli/tui/hooks/useExport.js +58 -0
- package/dist/cli/tui/hooks/useExport.js.map +1 -0
- package/dist/cli/tui/hooks/useRequests.d.ts +20 -0
- package/dist/cli/tui/hooks/useRequests.d.ts.map +1 -0
- package/dist/cli/tui/hooks/useRequests.js +85 -0
- package/dist/cli/tui/hooks/useRequests.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/curl.d.ts +9 -0
- package/dist/cli/tui/utils/curl.d.ts.map +1 -0
- package/dist/cli/tui/utils/curl.js +47 -0
- package/dist/cli/tui/utils/curl.js.map +1 -0
- package/dist/cli/tui/utils/formatters.d.ts +36 -0
- package/dist/cli/tui/utils/formatters.d.ts.map +1 -0
- package/dist/cli/tui/utils/formatters.js +108 -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 +139 -0
- package/dist/cli/tui/utils/har.js.map +1 -0
- package/dist/daemon/control.d.ts +63 -0
- package/dist/daemon/control.d.ts.map +1 -0
- package/dist/daemon/control.js +260 -0
- package/dist/daemon/control.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 +107 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/proxy.d.ts +19 -0
- package/dist/daemon/proxy.d.ts.map +1 -0
- package/dist/daemon/proxy.js +89 -0
- package/dist/daemon/proxy.js.map +1 -0
- package/dist/daemon/storage.d.ts +60 -0
- package/dist/daemon/storage.d.ts.map +1 -0
- package/dist/daemon/storage.js +215 -0
- package/dist/daemon/storage.js.map +1 -0
- package/dist/shared/daemon.d.ts +14 -0
- package/dist/shared/daemon.d.ts.map +1 -0
- package/dist/shared/daemon.js +161 -0
- package/dist/shared/daemon.js.map +1 -0
- package/dist/shared/project.d.ts +61 -0
- package/dist/shared/project.d.ts.map +1 -0
- package/dist/shared/project.js +143 -0
- package/dist/shared/project.js.map +1 -0
- package/dist/shared/types.d.ts +32 -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/package.json +89 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRequests.js","sourceRoot":"","sources":["../../../../src/cli/tui/hooks/useRequests.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAEjE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAc3E;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,UAA8B,EAAE;IAC1D,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAE/C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAoB,EAAE,CAAC,CAAC;IAChE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,MAAM,SAAS,GAAG,MAAM,CAAuB,IAAI,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,MAAM,CAAS,CAAC,CAAC,CAAC;IAEvC,4BAA4B;IAC5B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;QACtC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,QAAQ,CAAC,gDAAgD,CAAC,CAAC;YAC3D,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;QACxC,SAAS,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACjE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,6BAA6B;IAC7B,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC3C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC;QACjC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,2DAA2D;YAC3D,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAEpD,wCAAwC;YACxC,IAAI,KAAK,KAAK,YAAY,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5D,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;oBAC5C,KAAK;oBACL,KAAK,EAAE,IAAI;iBACZ,CAAC,CAAC;gBACH,WAAW,CAAC,WAAW,CAAC,CAAC;gBACzB,YAAY,CAAC,OAAO,GAAG,KAAK,CAAC;YAC/B,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC;YACnF,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBACnE,QAAQ,CAAC,kDAAkD,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,OAAO,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAE7B,0BAA0B;IAC1B,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACrC,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,YAAY,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,qBAAqB;QAC/C,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,gBAAgB;IAChB,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,aAAa,EAAE,CAAC;IACvB,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,UAAU;IACV,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,KAAK,aAAa,EAAE,CAAC;QACvB,CAAC,EAAE,YAAY,CAAC,CAAC;QAEjB,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,EAAE,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC;IAElC,OAAO;QACL,QAAQ;QACR,SAAS;QACT,KAAK;QACL,OAAO;KACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook for subscribing to stdout dimensions.
|
|
3
|
+
*
|
|
4
|
+
* Replaces ink-use-stdout-dimensions which has compatibility issues with
|
|
5
|
+
* Node.js 24 due to CJS/ESM interop problems.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Returns [columns, rows] of the terminal, updating when the terminal is resized.
|
|
9
|
+
*/
|
|
10
|
+
export declare function useStdoutDimensions(): [number, number];
|
|
11
|
+
//# sourceMappingURL=useStdoutDimensions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStdoutDimensions.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/hooks/useStdoutDimensions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAqBtD"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook for subscribing to stdout dimensions.
|
|
3
|
+
*
|
|
4
|
+
* Replaces ink-use-stdout-dimensions which has compatibility issues with
|
|
5
|
+
* Node.js 24 due to CJS/ESM interop problems.
|
|
6
|
+
*/
|
|
7
|
+
import { useState, useEffect } from "react";
|
|
8
|
+
import { useStdout } from "ink";
|
|
9
|
+
/**
|
|
10
|
+
* Returns [columns, rows] of the terminal, updating when the terminal is resized.
|
|
11
|
+
*/
|
|
12
|
+
export function useStdoutDimensions() {
|
|
13
|
+
const { stdout } = useStdout();
|
|
14
|
+
const [dimensions, setDimensions] = useState([
|
|
15
|
+
stdout.columns || 80,
|
|
16
|
+
stdout.rows || 24,
|
|
17
|
+
]);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
const handler = () => {
|
|
20
|
+
setDimensions([stdout.columns || 80, stdout.rows || 24]);
|
|
21
|
+
};
|
|
22
|
+
stdout.on("resize", handler);
|
|
23
|
+
return () => {
|
|
24
|
+
stdout.off("resize", handler);
|
|
25
|
+
};
|
|
26
|
+
}, [stdout]);
|
|
27
|
+
return dimensions;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=useStdoutDimensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStdoutDimensions.js","sourceRoot":"","sources":["../../../../src/cli/tui/hooks/useStdoutDimensions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAEhC;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAE/B,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAmB;QAC7D,MAAM,CAAC,OAAO,IAAI,EAAE;QACpB,MAAM,CAAC,IAAI,IAAI,EAAE;KAClB,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,aAAa,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC;QAEF,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE7B,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate curl commands from captured requests.
|
|
3
|
+
*/
|
|
4
|
+
import type { CapturedRequest } from "../../../shared/types.js";
|
|
5
|
+
/**
|
|
6
|
+
* Generate a curl command from a captured request.
|
|
7
|
+
*/
|
|
8
|
+
export declare function generateCurl(request: CapturedRequest): string;
|
|
9
|
+
//# sourceMappingURL=curl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"curl.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/utils/curl.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAsBhE;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CA0B7D"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate curl commands from captured requests.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Headers that should be excluded from curl output.
|
|
6
|
+
* These are typically set automatically by curl or are connection-specific.
|
|
7
|
+
*/
|
|
8
|
+
const EXCLUDED_HEADERS = new Set([
|
|
9
|
+
"host",
|
|
10
|
+
"content-length",
|
|
11
|
+
"connection",
|
|
12
|
+
"accept-encoding",
|
|
13
|
+
"transfer-encoding",
|
|
14
|
+
]);
|
|
15
|
+
/**
|
|
16
|
+
* Escape a string for use in a shell single-quoted context.
|
|
17
|
+
* Single quotes are handled by ending the quote, adding an escaped single quote, and reopening.
|
|
18
|
+
*/
|
|
19
|
+
function shellEscape(str) {
|
|
20
|
+
return str.replace(/'/g, "'\"'\"'");
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Generate a curl command from a captured request.
|
|
24
|
+
*/
|
|
25
|
+
export function generateCurl(request) {
|
|
26
|
+
const parts = ["curl"];
|
|
27
|
+
// Add method if not GET
|
|
28
|
+
if (request.method !== "GET") {
|
|
29
|
+
parts.push(`-X ${request.method}`);
|
|
30
|
+
}
|
|
31
|
+
// Add URL
|
|
32
|
+
parts.push(`'${shellEscape(request.url)}'`);
|
|
33
|
+
// Add headers (excluding certain automatic ones)
|
|
34
|
+
for (const [name, value] of Object.entries(request.requestHeaders)) {
|
|
35
|
+
if (EXCLUDED_HEADERS.has(name.toLowerCase())) {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
parts.push(`-H '${shellEscape(name)}: ${shellEscape(value)}'`);
|
|
39
|
+
}
|
|
40
|
+
// Add body if present
|
|
41
|
+
if (request.requestBody && request.requestBody.length > 0) {
|
|
42
|
+
const bodyStr = request.requestBody.toString("utf-8");
|
|
43
|
+
parts.push(`-d '${shellEscape(bodyStr)}'`);
|
|
44
|
+
}
|
|
45
|
+
return parts.join(" \\\n ");
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=curl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"curl.js","sourceRoot":"","sources":["../../../../src/cli/tui/utils/curl.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;GAGG;AACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,MAAM;IACN,gBAAgB;IAChB,YAAY;IACZ,iBAAiB;IACjB,mBAAmB;CACpB,CAAC,CAAC;AAEH;;;GAGG;AACH,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAwB;IACnD,MAAM,KAAK,GAAa,CAAC,MAAM,CAAC,CAAC;IAEjC,wBAAwB;IACxB,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,UAAU;IACV,KAAK,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAE5C,iDAAiD;IACjD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QACnE,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC7C,SAAS;QACX,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjE,CAAC;IAED,sBAAsB;IACtB,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,OAAO,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formatting utilities for TUI display.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Format a timestamp as a relative time string (e.g., "2s ago", "5m ago").
|
|
6
|
+
*/
|
|
7
|
+
export declare function formatRelativeTime(timestamp: number): string;
|
|
8
|
+
/**
|
|
9
|
+
* Format duration in milliseconds to a human-readable string.
|
|
10
|
+
*/
|
|
11
|
+
export declare function formatDuration(durationMs: number | undefined): string;
|
|
12
|
+
/**
|
|
13
|
+
* Format byte size to human-readable string.
|
|
14
|
+
*/
|
|
15
|
+
export declare function formatSize(bytes: number | undefined): string;
|
|
16
|
+
/**
|
|
17
|
+
* Truncate a string to a maximum length, adding ellipsis if needed.
|
|
18
|
+
*/
|
|
19
|
+
export declare function truncate(str: string, maxLength: number): string;
|
|
20
|
+
/**
|
|
21
|
+
* Pad a string to a fixed width (left-aligned by default).
|
|
22
|
+
*/
|
|
23
|
+
export declare function padRight(str: string, width: number): string;
|
|
24
|
+
/**
|
|
25
|
+
* Pad a string to a fixed width (right-aligned).
|
|
26
|
+
*/
|
|
27
|
+
export declare function padLeft(str: string, width: number): string;
|
|
28
|
+
/**
|
|
29
|
+
* Format HTTP method with consistent width.
|
|
30
|
+
*/
|
|
31
|
+
export declare function formatMethod(method: string): string;
|
|
32
|
+
/**
|
|
33
|
+
* Format HTTP status code.
|
|
34
|
+
*/
|
|
35
|
+
export declare function formatStatus(status: number | undefined): string;
|
|
36
|
+
//# sourceMappingURL=formatters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/utils/formatters.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAqB5D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAiBrE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAwB5D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAK/D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAK/D"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formatting utilities for TUI display.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Format a timestamp as a relative time string (e.g., "2s ago", "5m ago").
|
|
6
|
+
*/
|
|
7
|
+
export function formatRelativeTime(timestamp) {
|
|
8
|
+
const now = Date.now();
|
|
9
|
+
const diffMs = now - timestamp;
|
|
10
|
+
const diffSec = Math.floor(diffMs / 1000);
|
|
11
|
+
if (diffSec < 60) {
|
|
12
|
+
return `${diffSec}s ago`;
|
|
13
|
+
}
|
|
14
|
+
const diffMin = Math.floor(diffSec / 60);
|
|
15
|
+
if (diffMin < 60) {
|
|
16
|
+
return `${diffMin}m ago`;
|
|
17
|
+
}
|
|
18
|
+
const diffHour = Math.floor(diffMin / 60);
|
|
19
|
+
if (diffHour < 24) {
|
|
20
|
+
return `${diffHour}h ago`;
|
|
21
|
+
}
|
|
22
|
+
const diffDay = Math.floor(diffHour / 24);
|
|
23
|
+
return `${diffDay}d ago`;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Format duration in milliseconds to a human-readable string.
|
|
27
|
+
*/
|
|
28
|
+
export function formatDuration(durationMs) {
|
|
29
|
+
if (durationMs === undefined) {
|
|
30
|
+
return "-";
|
|
31
|
+
}
|
|
32
|
+
if (durationMs < 1000) {
|
|
33
|
+
return `${durationMs}ms`;
|
|
34
|
+
}
|
|
35
|
+
const seconds = durationMs / 1000;
|
|
36
|
+
if (seconds < 60) {
|
|
37
|
+
return `${seconds.toFixed(1)}s`;
|
|
38
|
+
}
|
|
39
|
+
const minutes = Math.floor(seconds / 60);
|
|
40
|
+
const remainingSeconds = Math.floor(seconds % 60);
|
|
41
|
+
return `${minutes}m${remainingSeconds}s`;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Format byte size to human-readable string.
|
|
45
|
+
*/
|
|
46
|
+
export function formatSize(bytes) {
|
|
47
|
+
if (bytes === undefined || bytes === 0) {
|
|
48
|
+
return "-";
|
|
49
|
+
}
|
|
50
|
+
const units = ["B", "KB", "MB", "GB"];
|
|
51
|
+
let size = bytes;
|
|
52
|
+
let unitIndex = 0;
|
|
53
|
+
while (size >= 1024 && unitIndex < units.length - 1) {
|
|
54
|
+
size /= 1024;
|
|
55
|
+
unitIndex++;
|
|
56
|
+
}
|
|
57
|
+
const unit = units[unitIndex];
|
|
58
|
+
if (unit === undefined) {
|
|
59
|
+
return `${bytes}B`;
|
|
60
|
+
}
|
|
61
|
+
if (unitIndex === 0) {
|
|
62
|
+
return `${size}${unit}`;
|
|
63
|
+
}
|
|
64
|
+
return `${size.toFixed(1)}${unit}`;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Truncate a string to a maximum length, adding ellipsis if needed.
|
|
68
|
+
*/
|
|
69
|
+
export function truncate(str, maxLength) {
|
|
70
|
+
if (str.length <= maxLength) {
|
|
71
|
+
return str;
|
|
72
|
+
}
|
|
73
|
+
return str.slice(0, maxLength - 1) + "…";
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Pad a string to a fixed width (left-aligned by default).
|
|
77
|
+
*/
|
|
78
|
+
export function padRight(str, width) {
|
|
79
|
+
if (str.length >= width) {
|
|
80
|
+
return str.slice(0, width);
|
|
81
|
+
}
|
|
82
|
+
return str + " ".repeat(width - str.length);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Pad a string to a fixed width (right-aligned).
|
|
86
|
+
*/
|
|
87
|
+
export function padLeft(str, width) {
|
|
88
|
+
if (str.length >= width) {
|
|
89
|
+
return str.slice(0, width);
|
|
90
|
+
}
|
|
91
|
+
return " ".repeat(width - str.length) + str;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Format HTTP method with consistent width.
|
|
95
|
+
*/
|
|
96
|
+
export function formatMethod(method) {
|
|
97
|
+
return padRight(method.toUpperCase(), 7);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Format HTTP status code.
|
|
101
|
+
*/
|
|
102
|
+
export function formatStatus(status) {
|
|
103
|
+
if (status === undefined) {
|
|
104
|
+
return "...";
|
|
105
|
+
}
|
|
106
|
+
return String(status);
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=formatters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../../../src/cli/tui/utils/formatters.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate HAR (HTTP Archive) format from captured requests.
|
|
3
|
+
*/
|
|
4
|
+
import type { CapturedRequest } from "../../../shared/types.js";
|
|
5
|
+
/**
|
|
6
|
+
* HAR 1.2 specification types.
|
|
7
|
+
*/
|
|
8
|
+
interface HarEntry {
|
|
9
|
+
startedDateTime: string;
|
|
10
|
+
time: number;
|
|
11
|
+
request: {
|
|
12
|
+
method: string;
|
|
13
|
+
url: string;
|
|
14
|
+
httpVersion: string;
|
|
15
|
+
cookies: unknown[];
|
|
16
|
+
headers: {
|
|
17
|
+
name: string;
|
|
18
|
+
value: string;
|
|
19
|
+
}[];
|
|
20
|
+
queryString: {
|
|
21
|
+
name: string;
|
|
22
|
+
value: string;
|
|
23
|
+
}[];
|
|
24
|
+
postData?: {
|
|
25
|
+
mimeType: string;
|
|
26
|
+
text: string;
|
|
27
|
+
};
|
|
28
|
+
headersSize: number;
|
|
29
|
+
bodySize: number;
|
|
30
|
+
};
|
|
31
|
+
response: {
|
|
32
|
+
status: number;
|
|
33
|
+
statusText: string;
|
|
34
|
+
httpVersion: string;
|
|
35
|
+
cookies: unknown[];
|
|
36
|
+
headers: {
|
|
37
|
+
name: string;
|
|
38
|
+
value: string;
|
|
39
|
+
}[];
|
|
40
|
+
content: {
|
|
41
|
+
size: number;
|
|
42
|
+
mimeType: string;
|
|
43
|
+
text?: string;
|
|
44
|
+
};
|
|
45
|
+
redirectURL: string;
|
|
46
|
+
headersSize: number;
|
|
47
|
+
bodySize: number;
|
|
48
|
+
};
|
|
49
|
+
cache: Record<string, never>;
|
|
50
|
+
timings: {
|
|
51
|
+
send: number;
|
|
52
|
+
wait: number;
|
|
53
|
+
receive: number;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
interface Har {
|
|
57
|
+
log: {
|
|
58
|
+
version: string;
|
|
59
|
+
creator: {
|
|
60
|
+
name: string;
|
|
61
|
+
version: string;
|
|
62
|
+
};
|
|
63
|
+
entries: HarEntry[];
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Generate a HAR object from captured requests.
|
|
68
|
+
*/
|
|
69
|
+
export declare function generateHar(requests: CapturedRequest[]): Har;
|
|
70
|
+
/**
|
|
71
|
+
* Generate HAR JSON string from captured requests.
|
|
72
|
+
*/
|
|
73
|
+
export declare function generateHarString(requests: CapturedRequest[]): string;
|
|
74
|
+
export {};
|
|
75
|
+
//# sourceMappingURL=har.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"har.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/utils/har.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE;;GAEG;AACH,UAAU,QAAQ;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,OAAO,EAAE,CAAC;QACnB,OAAO,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QAC3C,WAAW,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QAC/C,QAAQ,CAAC,EAAE;YACT,QAAQ,EAAE,MAAM,CAAC;YACjB,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;QACF,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,OAAO,EAAE,CAAC;QACnB,OAAO,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QAC3C,OAAO,EAAE;YACP,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,MAAM,CAAC;YACjB,IAAI,CAAC,EAAE,MAAM,CAAC;SACf,CAAC;QACF,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7B,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,UAAU,GAAG;IACX,GAAG,EAAE;QACH,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE;YACP,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,OAAO,EAAE,QAAQ,EAAE,CAAC;KACrB,CAAC;CACH;AA+HD;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,GAAG,CAW5D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,CAErE"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate HAR (HTTP Archive) format from captured requests.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Parse query string from URL.
|
|
6
|
+
*/
|
|
7
|
+
function parseQueryString(url) {
|
|
8
|
+
try {
|
|
9
|
+
const parsedUrl = new URL(url);
|
|
10
|
+
const result = [];
|
|
11
|
+
parsedUrl.searchParams.forEach((value, name) => {
|
|
12
|
+
result.push({ name, value });
|
|
13
|
+
});
|
|
14
|
+
return result;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Convert headers object to HAR format.
|
|
22
|
+
*/
|
|
23
|
+
function headersToHar(headers) {
|
|
24
|
+
if (!headers) {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
return Object.entries(headers).map(([name, value]) => ({ name, value }));
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get content type from headers.
|
|
31
|
+
*/
|
|
32
|
+
function getContentType(headers) {
|
|
33
|
+
if (!headers) {
|
|
34
|
+
return "application/octet-stream";
|
|
35
|
+
}
|
|
36
|
+
const contentType = headers["content-type"] || headers["Content-Type"] || "application/octet-stream";
|
|
37
|
+
return contentType;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get status text for HTTP status code.
|
|
41
|
+
*/
|
|
42
|
+
function getStatusText(status) {
|
|
43
|
+
if (status === undefined) {
|
|
44
|
+
return "";
|
|
45
|
+
}
|
|
46
|
+
const statusTexts = {
|
|
47
|
+
200: "OK",
|
|
48
|
+
201: "Created",
|
|
49
|
+
204: "No Content",
|
|
50
|
+
301: "Moved Permanently",
|
|
51
|
+
302: "Found",
|
|
52
|
+
304: "Not Modified",
|
|
53
|
+
400: "Bad Request",
|
|
54
|
+
401: "Unauthorized",
|
|
55
|
+
403: "Forbidden",
|
|
56
|
+
404: "Not Found",
|
|
57
|
+
500: "Internal Server Error",
|
|
58
|
+
502: "Bad Gateway",
|
|
59
|
+
503: "Service Unavailable",
|
|
60
|
+
};
|
|
61
|
+
return statusTexts[status] ?? "";
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Convert a captured request to HAR entry format.
|
|
65
|
+
*/
|
|
66
|
+
function requestToHarEntry(request) {
|
|
67
|
+
const requestBodySize = request.requestBody?.length ?? 0;
|
|
68
|
+
const responseBodySize = request.responseBody?.length ?? 0;
|
|
69
|
+
const requestHeadersSize = JSON.stringify(request.requestHeaders).length;
|
|
70
|
+
const responseHeadersSize = JSON.stringify(request.responseHeaders ?? {}).length;
|
|
71
|
+
const entry = {
|
|
72
|
+
startedDateTime: new Date(request.timestamp).toISOString(),
|
|
73
|
+
time: request.durationMs ?? 0,
|
|
74
|
+
request: {
|
|
75
|
+
method: request.method,
|
|
76
|
+
url: request.url,
|
|
77
|
+
httpVersion: "HTTP/1.1",
|
|
78
|
+
cookies: [],
|
|
79
|
+
headers: headersToHar(request.requestHeaders),
|
|
80
|
+
queryString: parseQueryString(request.url),
|
|
81
|
+
headersSize: requestHeadersSize,
|
|
82
|
+
bodySize: requestBodySize,
|
|
83
|
+
},
|
|
84
|
+
response: {
|
|
85
|
+
status: request.responseStatus ?? 0,
|
|
86
|
+
statusText: getStatusText(request.responseStatus),
|
|
87
|
+
httpVersion: "HTTP/1.1",
|
|
88
|
+
cookies: [],
|
|
89
|
+
headers: headersToHar(request.responseHeaders),
|
|
90
|
+
content: {
|
|
91
|
+
size: responseBodySize,
|
|
92
|
+
mimeType: getContentType(request.responseHeaders),
|
|
93
|
+
},
|
|
94
|
+
redirectURL: "",
|
|
95
|
+
headersSize: responseHeadersSize,
|
|
96
|
+
bodySize: responseBodySize,
|
|
97
|
+
},
|
|
98
|
+
cache: {},
|
|
99
|
+
timings: {
|
|
100
|
+
send: 0,
|
|
101
|
+
wait: request.durationMs ?? 0,
|
|
102
|
+
receive: 0,
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
// Add request body if present
|
|
106
|
+
if (request.requestBody && request.requestBody.length > 0) {
|
|
107
|
+
entry.request.postData = {
|
|
108
|
+
mimeType: getContentType(request.requestHeaders),
|
|
109
|
+
text: request.requestBody.toString("utf-8"),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
// Add response body if present
|
|
113
|
+
if (request.responseBody && request.responseBody.length > 0) {
|
|
114
|
+
entry.response.content.text = request.responseBody.toString("utf-8");
|
|
115
|
+
}
|
|
116
|
+
return entry;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Generate a HAR object from captured requests.
|
|
120
|
+
*/
|
|
121
|
+
export function generateHar(requests) {
|
|
122
|
+
return {
|
|
123
|
+
log: {
|
|
124
|
+
version: "1.2",
|
|
125
|
+
creator: {
|
|
126
|
+
name: "htpx",
|
|
127
|
+
version: "1.0.0",
|
|
128
|
+
},
|
|
129
|
+
entries: requests.map(requestToHarEntry),
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Generate HAR JSON string from captured requests.
|
|
135
|
+
*/
|
|
136
|
+
export function generateHarString(requests) {
|
|
137
|
+
return JSON.stringify(generateHar(requests), null, 2);
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=har.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"har.js","sourceRoot":"","sources":["../../../../src/cli/tui/utils/har.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { RequestRepository } from "./storage.js";
|
|
2
|
+
import type { CapturedRequest, DaemonStatus, Session } from "../shared/types.js";
|
|
3
|
+
export interface ControlServerOptions {
|
|
4
|
+
socketPath: string;
|
|
5
|
+
storage: RequestRepository;
|
|
6
|
+
proxyPort: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ControlServer {
|
|
9
|
+
close: () => Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Create a Unix socket control server for daemon communication.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createControlServer(options: ControlServerOptions): ControlServer;
|
|
15
|
+
/**
|
|
16
|
+
* Client for communicating with the control server.
|
|
17
|
+
*/
|
|
18
|
+
export declare class ControlClient {
|
|
19
|
+
private socketPath;
|
|
20
|
+
private requestId;
|
|
21
|
+
constructor(socketPath: string);
|
|
22
|
+
/**
|
|
23
|
+
* Send a request to the control server and wait for response.
|
|
24
|
+
*/
|
|
25
|
+
request<T>(method: string, params?: Record<string, unknown>): Promise<T>;
|
|
26
|
+
/**
|
|
27
|
+
* Check if the daemon is running by sending a ping.
|
|
28
|
+
*/
|
|
29
|
+
ping(): Promise<boolean>;
|
|
30
|
+
/**
|
|
31
|
+
* Get daemon status.
|
|
32
|
+
*/
|
|
33
|
+
status(): Promise<DaemonStatus>;
|
|
34
|
+
/**
|
|
35
|
+
* Register a new session.
|
|
36
|
+
*/
|
|
37
|
+
registerSession(label?: string, pid?: number): Promise<Session>;
|
|
38
|
+
/**
|
|
39
|
+
* List captured requests.
|
|
40
|
+
*/
|
|
41
|
+
listRequests(options?: {
|
|
42
|
+
sessionId?: string;
|
|
43
|
+
label?: string;
|
|
44
|
+
limit?: number;
|
|
45
|
+
offset?: number;
|
|
46
|
+
}): Promise<CapturedRequest[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Get a specific request by ID.
|
|
49
|
+
*/
|
|
50
|
+
getRequest(id: string): Promise<CapturedRequest | null>;
|
|
51
|
+
/**
|
|
52
|
+
* Count requests.
|
|
53
|
+
*/
|
|
54
|
+
countRequests(options?: {
|
|
55
|
+
sessionId?: string;
|
|
56
|
+
label?: string;
|
|
57
|
+
}): Promise<number>;
|
|
58
|
+
/**
|
|
59
|
+
* Clear all requests.
|
|
60
|
+
*/
|
|
61
|
+
clearRequests(): Promise<void>;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=control.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../src/daemon/control.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAEjF,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAmBD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CA+IhF;AAiCD;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAK;gBAEV,UAAU,EAAE,MAAM;IAI9B;;OAEG;IACG,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IA6C9E;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAS9B;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IAIrC;;OAEG;IACG,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrE;;OAEG;IACG,YAAY,CAAC,OAAO,CAAC,EAAE;QAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAI9B;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAI7D;;OAEG;IACG,aAAa,CAAC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAItF;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAGrC"}
|