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.
Files changed (64) hide show
  1. package/dist/cli/commands/on.d.ts.map +1 -1
  2. package/dist/cli/commands/on.js +1 -0
  3. package/dist/cli/commands/on.js.map +1 -1
  4. package/dist/cli/commands/request.d.ts.map +1 -1
  5. package/dist/cli/commands/request.js +97 -2
  6. package/dist/cli/commands/request.js.map +1 -1
  7. package/dist/cli/tui/App.d.ts.map +1 -1
  8. package/dist/cli/tui/App.js +39 -31
  9. package/dist/cli/tui/App.js.map +1 -1
  10. package/dist/cli/tui/components/HelpModal.d.ts +6 -2
  11. package/dist/cli/tui/components/HelpModal.d.ts.map +1 -1
  12. package/dist/cli/tui/components/HelpModal.js +19 -47
  13. package/dist/cli/tui/components/HelpModal.js.map +1 -1
  14. package/dist/cli/tui/components/StatusBar.d.ts +2 -9
  15. package/dist/cli/tui/components/StatusBar.d.ts.map +1 -1
  16. package/dist/cli/tui/components/StatusBar.js +6 -13
  17. package/dist/cli/tui/components/StatusBar.js.map +1 -1
  18. package/dist/cli/tui/hooks/useExport.d.ts +10 -2
  19. package/dist/cli/tui/hooks/useExport.d.ts.map +1 -1
  20. package/dist/cli/tui/hooks/useExport.js +33 -8
  21. package/dist/cli/tui/hooks/useExport.js.map +1 -1
  22. package/dist/cli/tui/hooks/useStdoutDimensions.d.ts +4 -0
  23. package/dist/cli/tui/hooks/useStdoutDimensions.d.ts.map +1 -1
  24. package/dist/cli/tui/hooks/useStdoutDimensions.js +20 -10
  25. package/dist/cli/tui/hooks/useStdoutDimensions.js.map +1 -1
  26. package/dist/cli/tui/utils/curl.d.ts.map +1 -1
  27. package/dist/cli/tui/utils/curl.js +6 -13
  28. package/dist/cli/tui/utils/curl.js.map +1 -1
  29. package/dist/cli/tui/utils/export-shared.d.ts +9 -0
  30. package/dist/cli/tui/utils/export-shared.d.ts.map +1 -0
  31. package/dist/cli/tui/utils/export-shared.js +15 -0
  32. package/dist/cli/tui/utils/export-shared.js.map +1 -0
  33. package/dist/cli/tui/utils/fetch.d.ts +9 -0
  34. package/dist/cli/tui/utils/fetch.d.ts.map +1 -0
  35. package/dist/cli/tui/utils/fetch.js +77 -0
  36. package/dist/cli/tui/utils/fetch.js.map +1 -0
  37. package/dist/cli/tui/utils/httpie.d.ts +9 -0
  38. package/dist/cli/tui/utils/httpie.d.ts.map +1 -0
  39. package/dist/cli/tui/utils/httpie.js +78 -0
  40. package/dist/cli/tui/utils/httpie.js.map +1 -0
  41. package/dist/cli/tui/utils/python-requests.d.ts +19 -0
  42. package/dist/cli/tui/utils/python-requests.d.ts.map +1 -0
  43. package/dist/cli/tui/utils/python-requests.js +101 -0
  44. package/dist/cli/tui/utils/python-requests.js.map +1 -0
  45. package/dist/cli/tui/utils/terminal-size.d.ts +10 -0
  46. package/dist/cli/tui/utils/terminal-size.d.ts.map +1 -0
  47. package/dist/cli/tui/utils/terminal-size.js +179 -0
  48. package/dist/cli/tui/utils/terminal-size.js.map +1 -0
  49. package/dist/daemon/control.d.ts.map +1 -1
  50. package/dist/daemon/control.js +51 -7
  51. package/dist/daemon/control.js.map +1 -1
  52. package/dist/daemon/storage.d.ts +4 -0
  53. package/dist/daemon/storage.d.ts.map +1 -1
  54. package/dist/daemon/storage.js +20 -0
  55. package/dist/daemon/storage.js.map +1 -1
  56. package/dist/mcp/server.d.ts.map +1 -1
  57. package/dist/mcp/server.js +16 -1
  58. package/dist/mcp/server.js.map +1 -1
  59. package/dist/shared/regex-filter.d.ts.map +1 -1
  60. package/dist/shared/regex-filter.js +6 -1
  61. package/dist/shared/regex-filter.js.map +1 -1
  62. package/dist/shared/types.d.ts +1 -1
  63. package/dist/shared/types.d.ts.map +1 -1
  64. 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;AA8OD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAwXhF"}
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"}
@@ -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 "tui"`);
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 sessions = storage.listSessions();
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: sessions.length,
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 = optionalString(params, "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 = optionalString(params, "level");
425
+ const level = optionalInterceptorEventLevel(params, "level");
382
426
  const interceptor = optionalString(params, "interceptor");
383
- const type = optionalString(params, "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);