procsi 0.5.0 → 0.6.1
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/dist/cli/commands/on.d.ts.map +1 -1
- package/dist/cli/commands/on.js +1 -0
- package/dist/cli/commands/on.js.map +1 -1
- package/dist/cli/commands/request.d.ts.map +1 -1
- package/dist/cli/commands/request.js +97 -2
- package/dist/cli/commands/request.js.map +1 -1
- package/dist/cli/tui/App.d.ts.map +1 -1
- package/dist/cli/tui/App.js +39 -31
- package/dist/cli/tui/App.js.map +1 -1
- package/dist/cli/tui/components/HelpModal.d.ts +6 -2
- package/dist/cli/tui/components/HelpModal.d.ts.map +1 -1
- package/dist/cli/tui/components/HelpModal.js +19 -47
- package/dist/cli/tui/components/HelpModal.js.map +1 -1
- package/dist/cli/tui/components/StatusBar.d.ts +2 -9
- package/dist/cli/tui/components/StatusBar.d.ts.map +1 -1
- package/dist/cli/tui/components/StatusBar.js +6 -13
- package/dist/cli/tui/components/StatusBar.js.map +1 -1
- package/dist/cli/tui/hooks/useExport.d.ts +10 -2
- package/dist/cli/tui/hooks/useExport.d.ts.map +1 -1
- package/dist/cli/tui/hooks/useExport.js +33 -8
- package/dist/cli/tui/hooks/useExport.js.map +1 -1
- package/dist/cli/tui/hooks/useStdoutDimensions.d.ts +4 -0
- package/dist/cli/tui/hooks/useStdoutDimensions.d.ts.map +1 -1
- package/dist/cli/tui/hooks/useStdoutDimensions.js +20 -10
- package/dist/cli/tui/hooks/useStdoutDimensions.js.map +1 -1
- package/dist/cli/tui/utils/curl.d.ts.map +1 -1
- package/dist/cli/tui/utils/curl.js +6 -13
- package/dist/cli/tui/utils/curl.js.map +1 -1
- package/dist/cli/tui/utils/export-shared.d.ts +9 -0
- package/dist/cli/tui/utils/export-shared.d.ts.map +1 -0
- package/dist/cli/tui/utils/export-shared.js +15 -0
- package/dist/cli/tui/utils/export-shared.js.map +1 -0
- package/dist/cli/tui/utils/fetch.d.ts +9 -0
- package/dist/cli/tui/utils/fetch.d.ts.map +1 -0
- package/dist/cli/tui/utils/fetch.js +77 -0
- package/dist/cli/tui/utils/fetch.js.map +1 -0
- package/dist/cli/tui/utils/httpie.d.ts +9 -0
- package/dist/cli/tui/utils/httpie.d.ts.map +1 -0
- package/dist/cli/tui/utils/httpie.js +78 -0
- package/dist/cli/tui/utils/httpie.js.map +1 -0
- package/dist/cli/tui/utils/python-requests.d.ts +19 -0
- package/dist/cli/tui/utils/python-requests.d.ts.map +1 -0
- package/dist/cli/tui/utils/python-requests.js +101 -0
- package/dist/cli/tui/utils/python-requests.js.map +1 -0
- package/dist/cli/tui/utils/terminal-size.d.ts +10 -0
- package/dist/cli/tui/utils/terminal-size.d.ts.map +1 -0
- package/dist/cli/tui/utils/terminal-size.js +179 -0
- package/dist/cli/tui/utils/terminal-size.js.map +1 -0
- package/dist/daemon/control.d.ts.map +1 -1
- package/dist/daemon/control.js +51 -7
- package/dist/daemon/control.js.map +1 -1
- package/dist/daemon/storage.d.ts +4 -0
- package/dist/daemon/storage.d.ts.map +1 -1
- package/dist/daemon/storage.js +20 -0
- package/dist/daemon/storage.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +16 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/shared/regex-filter.d.ts.map +1 -1
- package/dist/shared/regex-filter.js +6 -1
- package/dist/shared/regex-filter.js.map +1 -1
- package/dist/shared/types.d.ts +1 -1
- package/dist/shared/types.d.ts.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate JavaScript fetch() calls from captured requests.
|
|
3
|
+
*/
|
|
4
|
+
import { EXCLUDED_HEADERS } from "./export-shared.js";
|
|
5
|
+
import { isJsonContent } from "./content-type.js";
|
|
6
|
+
/**
|
|
7
|
+
* Escape a string for use inside a JavaScript single-quoted string literal.
|
|
8
|
+
* Null bytes are stripped to prevent truncation issues in some runtimes.
|
|
9
|
+
*/
|
|
10
|
+
function jsStringEscape(str) {
|
|
11
|
+
return str
|
|
12
|
+
.replace(/\0/g, "")
|
|
13
|
+
.replace(/\\/g, "\\\\")
|
|
14
|
+
.replace(/'/g, "\\'")
|
|
15
|
+
.replace(/\n/g, "\\n")
|
|
16
|
+
.replace(/\r/g, "\\r")
|
|
17
|
+
.replace(/\t/g, "\\t");
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Indent each line of a multi-line string by the given number of spaces.
|
|
21
|
+
*/
|
|
22
|
+
function indentBlock(text, spaces) {
|
|
23
|
+
const pad = " ".repeat(spaces);
|
|
24
|
+
return text
|
|
25
|
+
.split("\n")
|
|
26
|
+
.map((line, i) => (i === 0 ? line : `${pad}${line}`))
|
|
27
|
+
.join("\n");
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Generate a JavaScript fetch() call from a captured request.
|
|
31
|
+
*/
|
|
32
|
+
export function generateFetch(request) {
|
|
33
|
+
const options = [];
|
|
34
|
+
// Only include method if not GET (fetch defaults to GET)
|
|
35
|
+
if (request.method !== "GET") {
|
|
36
|
+
options.push(` method: '${request.method}'`);
|
|
37
|
+
}
|
|
38
|
+
// Collect headers (excluding automatic ones)
|
|
39
|
+
const headers = [];
|
|
40
|
+
for (const [name, value] of Object.entries(request.requestHeaders)) {
|
|
41
|
+
if (EXCLUDED_HEADERS.has(name.toLowerCase())) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
headers.push(` '${jsStringEscape(name)}': '${jsStringEscape(value)}'`);
|
|
45
|
+
}
|
|
46
|
+
if (headers.length > 0) {
|
|
47
|
+
options.push(` headers: {\n${headers.join(",\n")}\n }`);
|
|
48
|
+
}
|
|
49
|
+
// Add body if present and method is not GET/HEAD
|
|
50
|
+
if (request.requestBody &&
|
|
51
|
+
request.requestBody.length > 0 &&
|
|
52
|
+
request.method !== "GET" &&
|
|
53
|
+
request.method !== "HEAD") {
|
|
54
|
+
const bodyStr = request.requestBody.toString("utf-8");
|
|
55
|
+
const contentType = request.requestHeaders["content-type"];
|
|
56
|
+
if (isJsonContent(contentType)) {
|
|
57
|
+
try {
|
|
58
|
+
// Parse and re-stringify to get a clean representation
|
|
59
|
+
const parsed = JSON.parse(bodyStr);
|
|
60
|
+
options.push(` body: JSON.stringify(${indentBlock(JSON.stringify(parsed, null, 2), 2)})`);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Invalid JSON — use as raw string
|
|
64
|
+
options.push(` body: '${jsStringEscape(bodyStr)}'`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
options.push(` body: '${jsStringEscape(bodyStr)}'`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const url = `'${jsStringEscape(request.url)}'`;
|
|
72
|
+
if (options.length === 0) {
|
|
73
|
+
return `await fetch(${url});`;
|
|
74
|
+
}
|
|
75
|
+
return `await fetch(${url}, {\n${options.join(",\n")}\n});`;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../../src/cli/tui/utils/fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate HTTPie commands from captured requests.
|
|
3
|
+
*/
|
|
4
|
+
import type { CapturedRequest } from "../../../shared/types.js";
|
|
5
|
+
/**
|
|
6
|
+
* Generate an HTTPie command from a captured request.
|
|
7
|
+
*/
|
|
8
|
+
export declare function generateHttpie(request: CapturedRequest): string;
|
|
9
|
+
//# sourceMappingURL=httpie.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpie.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/utils/httpie.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAahE;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAoE/D"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate HTTPie commands from captured requests.
|
|
3
|
+
*/
|
|
4
|
+
import { EXCLUDED_HEADERS } from "./export-shared.js";
|
|
5
|
+
import { isJsonContent } from "./content-type.js";
|
|
6
|
+
/**
|
|
7
|
+
* Escape a string for use in a shell single-quoted context.
|
|
8
|
+
* Same approach as curl: end the quote, insert an escaped single quote, reopen.
|
|
9
|
+
* Null bytes are stripped to prevent shell truncation.
|
|
10
|
+
*/
|
|
11
|
+
function shellEscape(str) {
|
|
12
|
+
return str.replace(/\0/g, "").replace(/'/g, "'\"'\"'");
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Generate an HTTPie command from a captured request.
|
|
16
|
+
*/
|
|
17
|
+
export function generateHttpie(request) {
|
|
18
|
+
const parts = ["http"];
|
|
19
|
+
// HTTPie uses the method as the first argument (defaults to GET without body, POST with body)
|
|
20
|
+
// Always include the method for clarity
|
|
21
|
+
parts.push(request.method);
|
|
22
|
+
// Add URL
|
|
23
|
+
parts.push(`'${shellEscape(request.url)}'`);
|
|
24
|
+
// Add headers using Name:Value syntax
|
|
25
|
+
for (const [name, value] of Object.entries(request.requestHeaders)) {
|
|
26
|
+
if (EXCLUDED_HEADERS.has(name.toLowerCase())) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
parts.push(`'${shellEscape(name)}:${shellEscape(value)}'`);
|
|
30
|
+
}
|
|
31
|
+
// Add body if present and method is not GET/HEAD
|
|
32
|
+
if (request.requestBody &&
|
|
33
|
+
request.requestBody.length > 0 &&
|
|
34
|
+
request.method !== "GET" &&
|
|
35
|
+
request.method !== "HEAD") {
|
|
36
|
+
const bodyStr = request.requestBody.toString("utf-8");
|
|
37
|
+
const contentType = request.requestHeaders["content-type"];
|
|
38
|
+
if (isJsonContent(contentType)) {
|
|
39
|
+
try {
|
|
40
|
+
const parsed = JSON.parse(bodyStr);
|
|
41
|
+
// Only use key=value / key:=value syntax for flat objects
|
|
42
|
+
if (parsed !== null && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
43
|
+
const entries = Object.entries(parsed);
|
|
44
|
+
const allFlat = entries.every(([, v]) => typeof v === "string" || typeof v === "number" || typeof v === "boolean" || v === null);
|
|
45
|
+
if (allFlat) {
|
|
46
|
+
for (const [key, val] of entries) {
|
|
47
|
+
if (typeof val === "string") {
|
|
48
|
+
// key=value for strings
|
|
49
|
+
parts.push(`'${shellEscape(key)}=${shellEscape(val)}'`);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// key:=value for non-strings (numbers, booleans, null)
|
|
53
|
+
parts.push(`'${shellEscape(key)}:=${JSON.stringify(val)}'`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// Non-flat object — use --raw
|
|
59
|
+
parts.push(`--raw='${shellEscape(bodyStr)}'`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// Non-object JSON (array, primitive) — use --raw
|
|
64
|
+
parts.push(`--raw='${shellEscape(bodyStr)}'`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Invalid JSON — use --raw
|
|
69
|
+
parts.push(`--raw='${shellEscape(bodyStr)}'`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
parts.push(`--raw='${shellEscape(bodyStr)}'`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return parts.join(" \\\n ");
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=httpie.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpie.js","sourceRoot":"","sources":["../../../../src/cli/tui/utils/httpie.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate Python requests library calls from captured requests.
|
|
3
|
+
*/
|
|
4
|
+
import type { CapturedRequest } from "../../../shared/types.js";
|
|
5
|
+
/**
|
|
6
|
+
* Escape a string for use inside a Python single-quoted string literal.
|
|
7
|
+
* Null bytes are stripped to prevent interpreter issues.
|
|
8
|
+
*/
|
|
9
|
+
export declare function escapePythonString(str: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Convert a JavaScript value to its Python repr equivalent.
|
|
12
|
+
* Handles strings, numbers, booleans, null, arrays, and objects.
|
|
13
|
+
*/
|
|
14
|
+
export declare function pythonRepr(value: unknown): string;
|
|
15
|
+
/**
|
|
16
|
+
* Generate a Python requests call from a captured request.
|
|
17
|
+
*/
|
|
18
|
+
export declare function generatePythonRequests(request: CapturedRequest): string;
|
|
19
|
+
//# sourceMappingURL=python-requests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-requests.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/utils/python-requests.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAIhE;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQtD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CA0BjD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAwDvE"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate Python requests library calls from captured requests.
|
|
3
|
+
*/
|
|
4
|
+
import { EXCLUDED_HEADERS } from "./export-shared.js";
|
|
5
|
+
import { isJsonContent } from "./content-type.js";
|
|
6
|
+
/**
|
|
7
|
+
* Escape a string for use inside a Python single-quoted string literal.
|
|
8
|
+
* Null bytes are stripped to prevent interpreter issues.
|
|
9
|
+
*/
|
|
10
|
+
export function escapePythonString(str) {
|
|
11
|
+
return str
|
|
12
|
+
.replace(/\0/g, "")
|
|
13
|
+
.replace(/\\/g, "\\\\")
|
|
14
|
+
.replace(/'/g, "\\'")
|
|
15
|
+
.replace(/\n/g, "\\n")
|
|
16
|
+
.replace(/\r/g, "\\r")
|
|
17
|
+
.replace(/\t/g, "\\t");
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Convert a JavaScript value to its Python repr equivalent.
|
|
21
|
+
* Handles strings, numbers, booleans, null, arrays, and objects.
|
|
22
|
+
*/
|
|
23
|
+
export function pythonRepr(value) {
|
|
24
|
+
if (value === null || value === undefined) {
|
|
25
|
+
return "None";
|
|
26
|
+
}
|
|
27
|
+
if (value === true) {
|
|
28
|
+
return "True";
|
|
29
|
+
}
|
|
30
|
+
if (value === false) {
|
|
31
|
+
return "False";
|
|
32
|
+
}
|
|
33
|
+
if (typeof value === "number") {
|
|
34
|
+
return String(value);
|
|
35
|
+
}
|
|
36
|
+
if (typeof value === "string") {
|
|
37
|
+
return `'${escapePythonString(value)}'`;
|
|
38
|
+
}
|
|
39
|
+
if (Array.isArray(value)) {
|
|
40
|
+
const items = value.map((item) => pythonRepr(item));
|
|
41
|
+
return `[${items.join(", ")}]`;
|
|
42
|
+
}
|
|
43
|
+
if (typeof value === "object") {
|
|
44
|
+
const entries = Object.entries(value);
|
|
45
|
+
const pairs = entries.map(([k, v]) => `${pythonRepr(k)}: ${pythonRepr(v)}`);
|
|
46
|
+
return `{${pairs.join(", ")}}`;
|
|
47
|
+
}
|
|
48
|
+
return String(value);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Generate a Python requests call from a captured request.
|
|
52
|
+
*/
|
|
53
|
+
export function generatePythonRequests(request) {
|
|
54
|
+
const lines = ["import requests", ""];
|
|
55
|
+
const method = request.method.toLowerCase();
|
|
56
|
+
const args = [`'${escapePythonString(request.url)}'`];
|
|
57
|
+
// Collect headers (excluding automatic ones)
|
|
58
|
+
const headers = [];
|
|
59
|
+
const contentType = request.requestHeaders["content-type"];
|
|
60
|
+
const usingJsonKwarg = isJsonContent(contentType);
|
|
61
|
+
for (const [name, value] of Object.entries(request.requestHeaders)) {
|
|
62
|
+
if (EXCLUDED_HEADERS.has(name.toLowerCase())) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
// When using json= kwarg, requests sets content-type automatically
|
|
66
|
+
if (usingJsonKwarg && name.toLowerCase() === "content-type") {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
headers.push([name, value]);
|
|
70
|
+
}
|
|
71
|
+
if (headers.length > 0) {
|
|
72
|
+
const headerPairs = headers
|
|
73
|
+
.map(([k, v]) => ` '${escapePythonString(k)}': '${escapePythonString(v)}'`)
|
|
74
|
+
.join(",\n");
|
|
75
|
+
args.push(`headers={\n${headerPairs}\n}`);
|
|
76
|
+
}
|
|
77
|
+
// Add body if present and method is not GET/HEAD
|
|
78
|
+
if (request.requestBody &&
|
|
79
|
+
request.requestBody.length > 0 &&
|
|
80
|
+
request.method !== "GET" &&
|
|
81
|
+
request.method !== "HEAD") {
|
|
82
|
+
const bodyStr = request.requestBody.toString("utf-8");
|
|
83
|
+
if (usingJsonKwarg) {
|
|
84
|
+
try {
|
|
85
|
+
const parsed = JSON.parse(bodyStr);
|
|
86
|
+
args.push(`json=${pythonRepr(parsed)}`);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Invalid JSON — fall back to data kwarg
|
|
90
|
+
args.push(`data='${escapePythonString(bodyStr)}'`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
args.push(`data='${escapePythonString(bodyStr)}'`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const argsStr = args.length === 1 ? args[0] : `\n ${args.join(",\n ")}\n`;
|
|
98
|
+
lines.push(`response = requests.${method}(${argsStr})`);
|
|
99
|
+
return lines.join("\n");
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=python-requests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-requests.js","sourceRoot":"","sources":["../../../../src/cli/tui/utils/python-requests.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface StdoutLike {
|
|
2
|
+
columns?: number;
|
|
3
|
+
rows?: number;
|
|
4
|
+
getWindowSize?: () => [number, number];
|
|
5
|
+
emit?: (event: string) => boolean;
|
|
6
|
+
}
|
|
7
|
+
type ReadFallbackDimensions = () => [number, number] | undefined;
|
|
8
|
+
export declare function syncStdoutDimensions(stdout: StdoutLike, readFallbackDimensions?: ReadFallbackDimensions): boolean;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=terminal-size.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-size.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/utils/terminal-size.ts"],"names":[],"mappings":"AAGA,UAAU,UAAU;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;CACnC;AAED,KAAK,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;AAiIjE,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,UAAU,EAClB,sBAAsB,GAAE,sBAA+C,GACtE,OAAO,CA2ET"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { closeSync, openSync } from "node:fs";
|
|
2
|
+
import { spawnSync } from "node:child_process";
|
|
3
|
+
function isPositiveInteger(value) {
|
|
4
|
+
return typeof value === "number" && Number.isInteger(value) && value > 0;
|
|
5
|
+
}
|
|
6
|
+
function hasValidDimensions(dimensions) {
|
|
7
|
+
if (!dimensions)
|
|
8
|
+
return false;
|
|
9
|
+
const [columns, rows] = dimensions;
|
|
10
|
+
return isPositiveInteger(columns) && isPositiveInteger(rows);
|
|
11
|
+
}
|
|
12
|
+
function readDimensionsFromWindowSize(stdout) {
|
|
13
|
+
if (typeof stdout.getWindowSize !== "function") {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
return stdout.getWindowSize();
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function readDimensionsFromEnv() {
|
|
24
|
+
const columns = Number(process.env["COLUMNS"]);
|
|
25
|
+
const rows = Number(process.env["LINES"]);
|
|
26
|
+
if (!isPositiveInteger(columns) || !isPositiveInteger(rows)) {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
return [columns, rows];
|
|
30
|
+
}
|
|
31
|
+
function readDimensionsFromStty() {
|
|
32
|
+
if (process.platform === "win32") {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
let ttyFd;
|
|
36
|
+
try {
|
|
37
|
+
ttyFd = openSync("/dev/tty", "r");
|
|
38
|
+
const result = spawnSync("stty", ["size"], {
|
|
39
|
+
stdio: [ttyFd, "pipe", "ignore"],
|
|
40
|
+
encoding: "utf-8",
|
|
41
|
+
});
|
|
42
|
+
if (result.status !== 0 || !result.stdout) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
const output = result.stdout.trim();
|
|
46
|
+
const parts = output.split(/\s+/);
|
|
47
|
+
if (parts.length !== 2) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
const rows = Number(parts[0]);
|
|
51
|
+
const columns = Number(parts[1]);
|
|
52
|
+
if (!isPositiveInteger(columns) || !isPositiveInteger(rows)) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
return [columns, rows];
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
if (ttyFd !== undefined) {
|
|
62
|
+
closeSync(ttyFd);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function readDimensionsFromTput() {
|
|
67
|
+
if (process.platform === "win32") {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
let ttyFd;
|
|
71
|
+
try {
|
|
72
|
+
ttyFd = openSync("/dev/tty", "r");
|
|
73
|
+
const colsResult = spawnSync("tput", ["cols"], {
|
|
74
|
+
stdio: [ttyFd, "pipe", "ignore"],
|
|
75
|
+
encoding: "utf-8",
|
|
76
|
+
});
|
|
77
|
+
const linesResult = spawnSync("tput", ["lines"], {
|
|
78
|
+
stdio: [ttyFd, "pipe", "ignore"],
|
|
79
|
+
encoding: "utf-8",
|
|
80
|
+
});
|
|
81
|
+
if (colsResult.status !== 0 || linesResult.status !== 0) {
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
const columns = Number(colsResult.stdout?.trim());
|
|
85
|
+
const rows = Number(linesResult.stdout?.trim());
|
|
86
|
+
if (!isPositiveInteger(columns) || !isPositiveInteger(rows)) {
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
return [columns, rows];
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
if (ttyFd !== undefined) {
|
|
96
|
+
closeSync(ttyFd);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Synchronise stdout.columns/rows and emit a resize event so Ink recalculates
|
|
102
|
+
* layout using current terminal dimensions.
|
|
103
|
+
*
|
|
104
|
+
* Primary source: stdout.getWindowSize().
|
|
105
|
+
* Fallback sources: `stty size` against /dev/tty, then `tput cols/lines`,
|
|
106
|
+
* then COLUMNS/LINES env vars (for terminals where Node's width/height sources
|
|
107
|
+
* lag until later interaction).
|
|
108
|
+
*
|
|
109
|
+
* Returns true when valid dimensions were applied.
|
|
110
|
+
*/
|
|
111
|
+
function readDimensionsFallback() {
|
|
112
|
+
return readDimensionsFromStty() ?? readDimensionsFromTput();
|
|
113
|
+
}
|
|
114
|
+
export function syncStdoutDimensions(stdout, readFallbackDimensions = readDimensionsFallback) {
|
|
115
|
+
const fromWindowSize = readDimensionsFromWindowSize(stdout);
|
|
116
|
+
const fromFallback = readFallbackDimensions();
|
|
117
|
+
const fromEnv = readDimensionsFromEnv();
|
|
118
|
+
const currentColumns = stdout.columns;
|
|
119
|
+
const currentRows = stdout.rows;
|
|
120
|
+
const currentDimensions = isPositiveInteger(currentColumns) && isPositiveInteger(currentRows)
|
|
121
|
+
? [currentColumns, currentRows]
|
|
122
|
+
: undefined;
|
|
123
|
+
const validCandidates = [fromWindowSize, fromFallback, fromEnv].filter(hasValidDimensions);
|
|
124
|
+
if (validCandidates.length === 0) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
let dimensions;
|
|
128
|
+
if (currentDimensions) {
|
|
129
|
+
const [currentCols, currentRows] = currentDimensions;
|
|
130
|
+
const nonShrinkingCandidates = validCandidates.filter(([cols, rows]) => cols >= currentCols && rows >= currentRows);
|
|
131
|
+
if (nonShrinkingCandidates.length === 0) {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
const firstNonShrinkingCandidate = nonShrinkingCandidates[0];
|
|
135
|
+
if (!firstNonShrinkingCandidate) {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
dimensions = nonShrinkingCandidates.reduce((best, candidate) => {
|
|
139
|
+
const [bestCols, bestRows] = best;
|
|
140
|
+
const [candidateCols, candidateRows] = candidate;
|
|
141
|
+
if (candidateCols > bestCols)
|
|
142
|
+
return candidate;
|
|
143
|
+
if (candidateCols === bestCols && candidateRows > bestRows)
|
|
144
|
+
return candidate;
|
|
145
|
+
return best;
|
|
146
|
+
}, firstNonShrinkingCandidate);
|
|
147
|
+
if (dimensions[0] === currentCols && dimensions[1] === currentRows) {
|
|
148
|
+
process.env["COLUMNS"] = String(currentCols);
|
|
149
|
+
process.env["LINES"] = String(currentRows);
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
// No current valid dimensions yet: prefer Node's direct window size first,
|
|
155
|
+
// then fallbacks.
|
|
156
|
+
if (hasValidDimensions(fromWindowSize)) {
|
|
157
|
+
dimensions = fromWindowSize;
|
|
158
|
+
}
|
|
159
|
+
else if (hasValidDimensions(fromFallback)) {
|
|
160
|
+
dimensions = fromFallback;
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
dimensions = fromEnv;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (!hasValidDimensions(dimensions)) {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
const [columns, rows] = dimensions;
|
|
170
|
+
stdout.columns = columns;
|
|
171
|
+
stdout.rows = rows;
|
|
172
|
+
process.env["COLUMNS"] = String(columns);
|
|
173
|
+
process.env["LINES"] = String(rows);
|
|
174
|
+
if (typeof stdout.emit === "function") {
|
|
175
|
+
stdout.emit("resize");
|
|
176
|
+
}
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=terminal-size.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-size.js","sourceRoot":"","sources":["../../../../src/cli/tui/utils/terminal-size.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../src/daemon/control.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAiBzD,OAAO,KAAK,EAAE,mBAAmB,EAAe,MAAM,4BAA4B,CAAC;AAMnF,OAAO,EAAgB,KAAK,QAAQ,EAAe,MAAM,qBAAqB,CAAC;AAI/E,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAI5D,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;
|
|
1
|
+
{"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../src/daemon/control.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAiBzD,OAAO,KAAK,EAAE,mBAAmB,EAAe,MAAM,4BAA4B,CAAC;AAMnF,OAAO,EAAgB,KAAK,QAAQ,EAAe,MAAM,qBAAqB,CAAC;AAI/E,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAI5D,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAySD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAoXhF"}
|
package/dist/daemon/control.js
CHANGED
|
@@ -64,10 +64,10 @@ function optionalReplayInitiator(params, key) {
|
|
|
64
64
|
const value = params[key];
|
|
65
65
|
if (value === undefined)
|
|
66
66
|
return undefined;
|
|
67
|
-
if (value === "mcp" || value === "tui") {
|
|
67
|
+
if (value === "mcp" || value === "tui" || value === "cli") {
|
|
68
68
|
return value;
|
|
69
69
|
}
|
|
70
|
-
throw new Error(`Invalid ${key} parameter: expected "mcp" or "
|
|
70
|
+
throw new Error(`Invalid ${key} parameter: expected "mcp", "tui", or "cli"`);
|
|
71
71
|
}
|
|
72
72
|
function optionalBodySearchTarget(params, key) {
|
|
73
73
|
const value = params[key];
|
|
@@ -82,6 +82,50 @@ function optionalBodySearchTarget(params, key) {
|
|
|
82
82
|
}
|
|
83
83
|
return target;
|
|
84
84
|
}
|
|
85
|
+
function optionalQueryTarget(params, key) {
|
|
86
|
+
const value = params[key];
|
|
87
|
+
if (value === undefined)
|
|
88
|
+
return undefined;
|
|
89
|
+
if (value === "request" || value === "response" || value === "both") {
|
|
90
|
+
return value;
|
|
91
|
+
}
|
|
92
|
+
throw new Error(`Invalid ${key} parameter: "${String(value)}". Use "request", "response", or "both".`);
|
|
93
|
+
}
|
|
94
|
+
const VALID_INTERCEPTOR_EVENT_LEVELS = new Set(["info", "warn", "error"]);
|
|
95
|
+
function optionalInterceptorEventLevel(params, key) {
|
|
96
|
+
const value = params[key];
|
|
97
|
+
if (value === undefined)
|
|
98
|
+
return undefined;
|
|
99
|
+
if (typeof value === "string" && VALID_INTERCEPTOR_EVENT_LEVELS.has(value)) {
|
|
100
|
+
return value;
|
|
101
|
+
}
|
|
102
|
+
throw new Error(`Invalid ${key} parameter: "${String(value)}". Use "info", "warn", or "error".`);
|
|
103
|
+
}
|
|
104
|
+
const VALID_INTERCEPTOR_EVENT_TYPES = new Set([
|
|
105
|
+
"matched",
|
|
106
|
+
"mocked",
|
|
107
|
+
"modified",
|
|
108
|
+
"observed",
|
|
109
|
+
"match_error",
|
|
110
|
+
"match_timeout",
|
|
111
|
+
"handler_error",
|
|
112
|
+
"handler_timeout",
|
|
113
|
+
"invalid_response",
|
|
114
|
+
"forward_after_complete",
|
|
115
|
+
"load_error",
|
|
116
|
+
"loaded",
|
|
117
|
+
"reload",
|
|
118
|
+
"user_log",
|
|
119
|
+
]);
|
|
120
|
+
function optionalInterceptorEventType(params, key) {
|
|
121
|
+
const value = params[key];
|
|
122
|
+
if (value === undefined)
|
|
123
|
+
return undefined;
|
|
124
|
+
if (typeof value === "string" && VALID_INTERCEPTOR_EVENT_TYPES.has(value)) {
|
|
125
|
+
return value;
|
|
126
|
+
}
|
|
127
|
+
throw new Error(`Invalid ${key} parameter: "${String(value)}". Expected a valid interceptor event type.`);
|
|
128
|
+
}
|
|
85
129
|
/**
|
|
86
130
|
* Validate an optional RequestFilter from untyped control message params.
|
|
87
131
|
*/
|
|
@@ -185,7 +229,7 @@ export function createControlServer(options) {
|
|
|
185
229
|
}
|
|
186
230
|
const handlers = {
|
|
187
231
|
status: () => {
|
|
188
|
-
const
|
|
232
|
+
const sessionCount = storage.countSessions();
|
|
189
233
|
const requestCount = storage.countRequests();
|
|
190
234
|
const interceptorCount = interceptorLoader
|
|
191
235
|
? interceptorLoader.getInterceptors().length
|
|
@@ -193,7 +237,7 @@ export function createControlServer(options) {
|
|
|
193
237
|
return {
|
|
194
238
|
running: true,
|
|
195
239
|
proxyPort,
|
|
196
|
-
sessionCount
|
|
240
|
+
sessionCount,
|
|
197
241
|
requestCount,
|
|
198
242
|
version,
|
|
199
243
|
interceptorCount,
|
|
@@ -257,7 +301,7 @@ export function createControlServer(options) {
|
|
|
257
301
|
},
|
|
258
302
|
queryJsonBodies: (params) => {
|
|
259
303
|
const jsonPath = requireString(params, "jsonPath");
|
|
260
|
-
const target =
|
|
304
|
+
const target = optionalQueryTarget(params, "target");
|
|
261
305
|
return storage.queryJsonBodies({
|
|
262
306
|
jsonPath,
|
|
263
307
|
value: optionalString(params, "value"),
|
|
@@ -378,9 +422,9 @@ export function createControlServer(options) {
|
|
|
378
422
|
}
|
|
379
423
|
const afterSeq = optionalNumber(params, "afterSeq") ?? 0;
|
|
380
424
|
const limit = optionalNumber(params, "limit");
|
|
381
|
-
const level =
|
|
425
|
+
const level = optionalInterceptorEventLevel(params, "level");
|
|
382
426
|
const interceptor = optionalString(params, "interceptor");
|
|
383
|
-
const type =
|
|
427
|
+
const type = optionalInterceptorEventType(params, "type");
|
|
384
428
|
const events = afterSeq > 0
|
|
385
429
|
? interceptorEventLog.since(afterSeq, { limit, level, interceptor, type })
|
|
386
430
|
: interceptorEventLog.latest(limit ?? 100);
|