procsi 0.4.1 → 0.6.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.
Files changed (125) 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/commands/requests.d.ts +25 -0
  8. package/dist/cli/commands/requests.d.ts.map +1 -1
  9. package/dist/cli/commands/requests.js +35 -4
  10. package/dist/cli/commands/requests.js.map +1 -1
  11. package/dist/cli/formatters/detail.d.ts.map +1 -1
  12. package/dist/cli/formatters/detail.js +6 -0
  13. package/dist/cli/formatters/detail.js.map +1 -1
  14. package/dist/cli/formatters/table.d.ts.map +1 -1
  15. package/dist/cli/formatters/table.js +11 -1
  16. package/dist/cli/formatters/table.js.map +1 -1
  17. package/dist/cli/tui/App.d.ts.map +1 -1
  18. package/dist/cli/tui/App.js +81 -28
  19. package/dist/cli/tui/App.js.map +1 -1
  20. package/dist/cli/tui/components/AccordionPanel.d.ts.map +1 -1
  21. package/dist/cli/tui/components/AccordionPanel.js +2 -1
  22. package/dist/cli/tui/components/AccordionPanel.js.map +1 -1
  23. package/dist/cli/tui/components/FilterBar.d.ts +10 -2
  24. package/dist/cli/tui/components/FilterBar.d.ts.map +1 -1
  25. package/dist/cli/tui/components/FilterBar.js +100 -12
  26. package/dist/cli/tui/components/FilterBar.js.map +1 -1
  27. package/dist/cli/tui/components/HelpModal.d.ts +6 -2
  28. package/dist/cli/tui/components/HelpModal.d.ts.map +1 -1
  29. package/dist/cli/tui/components/HelpModal.js +19 -46
  30. package/dist/cli/tui/components/HelpModal.js.map +1 -1
  31. package/dist/cli/tui/components/RequestListItem.d.ts +8 -0
  32. package/dist/cli/tui/components/RequestListItem.d.ts.map +1 -1
  33. package/dist/cli/tui/components/RequestListItem.js +14 -2
  34. package/dist/cli/tui/components/RequestListItem.js.map +1 -1
  35. package/dist/cli/tui/components/StatusBar.d.ts +2 -9
  36. package/dist/cli/tui/components/StatusBar.d.ts.map +1 -1
  37. package/dist/cli/tui/components/StatusBar.js +7 -13
  38. package/dist/cli/tui/components/StatusBar.js.map +1 -1
  39. package/dist/cli/tui/hooks/useExport.d.ts +10 -2
  40. package/dist/cli/tui/hooks/useExport.d.ts.map +1 -1
  41. package/dist/cli/tui/hooks/useExport.js +33 -8
  42. package/dist/cli/tui/hooks/useExport.js.map +1 -1
  43. package/dist/cli/tui/hooks/useRequests.d.ts +4 -1
  44. package/dist/cli/tui/hooks/useRequests.d.ts.map +1 -1
  45. package/dist/cli/tui/hooks/useRequests.js +36 -9
  46. package/dist/cli/tui/hooks/useRequests.js.map +1 -1
  47. package/dist/cli/tui/hooks/useStdoutDimensions.d.ts +4 -0
  48. package/dist/cli/tui/hooks/useStdoutDimensions.d.ts.map +1 -1
  49. package/dist/cli/tui/hooks/useStdoutDimensions.js +20 -10
  50. package/dist/cli/tui/hooks/useStdoutDimensions.js.map +1 -1
  51. package/dist/cli/tui/utils/curl.d.ts.map +1 -1
  52. package/dist/cli/tui/utils/curl.js +6 -13
  53. package/dist/cli/tui/utils/curl.js.map +1 -1
  54. package/dist/cli/tui/utils/export-shared.d.ts +9 -0
  55. package/dist/cli/tui/utils/export-shared.d.ts.map +1 -0
  56. package/dist/cli/tui/utils/export-shared.js +15 -0
  57. package/dist/cli/tui/utils/export-shared.js.map +1 -0
  58. package/dist/cli/tui/utils/fetch.d.ts +9 -0
  59. package/dist/cli/tui/utils/fetch.d.ts.map +1 -0
  60. package/dist/cli/tui/utils/fetch.js +77 -0
  61. package/dist/cli/tui/utils/fetch.js.map +1 -0
  62. package/dist/cli/tui/utils/filters.d.ts.map +1 -1
  63. package/dist/cli/tui/utils/filters.js +1 -0
  64. package/dist/cli/tui/utils/filters.js.map +1 -1
  65. package/dist/cli/tui/utils/httpie.d.ts +9 -0
  66. package/dist/cli/tui/utils/httpie.d.ts.map +1 -0
  67. package/dist/cli/tui/utils/httpie.js +78 -0
  68. package/dist/cli/tui/utils/httpie.js.map +1 -0
  69. package/dist/cli/tui/utils/python-requests.d.ts +19 -0
  70. package/dist/cli/tui/utils/python-requests.d.ts.map +1 -0
  71. package/dist/cli/tui/utils/python-requests.js +101 -0
  72. package/dist/cli/tui/utils/python-requests.js.map +1 -0
  73. package/dist/cli/tui/utils/terminal-size.d.ts +20 -0
  74. package/dist/cli/tui/utils/terminal-size.d.ts.map +1 -0
  75. package/dist/cli/tui/utils/terminal-size.js +100 -0
  76. package/dist/cli/tui/utils/terminal-size.js.map +1 -0
  77. package/dist/daemon/control.d.ts +3 -0
  78. package/dist/daemon/control.d.ts.map +1 -1
  79. package/dist/daemon/control.js +199 -6
  80. package/dist/daemon/control.js.map +1 -1
  81. package/dist/daemon/index.js +7 -0
  82. package/dist/daemon/index.js.map +1 -1
  83. package/dist/daemon/procsi-client.d.ts.map +1 -1
  84. package/dist/daemon/procsi-client.js +1 -0
  85. package/dist/daemon/procsi-client.js.map +1 -1
  86. package/dist/daemon/proxy.d.ts +3 -0
  87. package/dist/daemon/proxy.d.ts.map +1 -1
  88. package/dist/daemon/proxy.js +19 -6
  89. package/dist/daemon/proxy.js.map +1 -1
  90. package/dist/daemon/replay-tracker.d.ts +11 -0
  91. package/dist/daemon/replay-tracker.d.ts.map +1 -0
  92. package/dist/daemon/replay-tracker.js +47 -0
  93. package/dist/daemon/replay-tracker.js.map +1 -0
  94. package/dist/daemon/replay.d.ts +20 -0
  95. package/dist/daemon/replay.d.ts.map +1 -0
  96. package/dist/daemon/replay.js +113 -0
  97. package/dist/daemon/replay.js.map +1 -0
  98. package/dist/daemon/storage.d.ts +16 -2
  99. package/dist/daemon/storage.d.ts.map +1 -1
  100. package/dist/daemon/storage.js +104 -7
  101. package/dist/daemon/storage.js.map +1 -1
  102. package/dist/mcp/server.d.ts +3 -0
  103. package/dist/mcp/server.d.ts.map +1 -1
  104. package/dist/mcp/server.js +183 -4
  105. package/dist/mcp/server.js.map +1 -1
  106. package/dist/shared/body-search.d.ts +28 -0
  107. package/dist/shared/body-search.d.ts.map +1 -0
  108. package/dist/shared/body-search.js +64 -0
  109. package/dist/shared/body-search.js.map +1 -0
  110. package/dist/shared/constants.d.ts +2 -0
  111. package/dist/shared/constants.d.ts.map +1 -1
  112. package/dist/shared/constants.js +2 -0
  113. package/dist/shared/constants.js.map +1 -1
  114. package/dist/shared/control-client.d.ts +23 -2
  115. package/dist/shared/control-client.d.ts.map +1 -1
  116. package/dist/shared/control-client.js +15 -2
  117. package/dist/shared/control-client.js.map +1 -1
  118. package/dist/shared/regex-filter.d.ts +35 -0
  119. package/dist/shared/regex-filter.d.ts.map +1 -0
  120. package/dist/shared/regex-filter.js +86 -0
  121. package/dist/shared/regex-filter.js.map +1 -0
  122. package/dist/shared/types.d.ts +13 -0
  123. package/dist/shared/types.d.ts.map +1 -1
  124. package/package.json +2 -1
  125. package/skills/procsi/SKILL.md +9 -4
@@ -2,18 +2,26 @@
2
2
  * Hook for exporting captured requests to various formats.
3
3
  */
4
4
  import type { CapturedRequest } from "../../../shared/types.js";
5
+ export type ExportFormat = "curl" | "fetch" | "python" | "httpie";
5
6
  export interface ExportResult {
6
7
  success: boolean;
7
8
  message: string;
8
9
  }
9
10
  interface UseExportResult {
10
- exportCurl: (request: CapturedRequest) => Promise<ExportResult>;
11
+ exportFormat: (request: CapturedRequest, format: ExportFormat) => Promise<ExportResult>;
11
12
  exportHar: (requests: CapturedRequest[], filename?: string) => ExportResult;
12
13
  }
14
+ /** Human-readable labels for status messages. */
15
+ export declare const FORMAT_LABELS: Record<ExportFormat, string>;
13
16
  /**
14
- * Generate curl command for a request and copy to clipboard.
17
+ * Generate an export string for a request in the given format and copy to clipboard.
15
18
  * Extracted as standalone function for testability.
16
19
  */
20
+ export declare function exportFormatToClipboard(request: CapturedRequest, format: ExportFormat): Promise<ExportResult>;
21
+ /**
22
+ * Generate curl command for a request and copy to clipboard.
23
+ * Kept for backwards compatibility with existing tests.
24
+ */
17
25
  export declare function exportCurlToClipboard(request: CapturedRequest): Promise<ExportResult>;
18
26
  /**
19
27
  * Export requests to HAR file.
@@ -1 +1 @@
1
- {"version":3,"file":"useExport.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/hooks/useExport.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAKhE,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,eAAe;IACvB,UAAU,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IAChE,SAAS,EAAE,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,YAAY,CAAC;CAC7E;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAc3F;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,YAAY,CAkB5F;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,eAAe,CAY3C"}
1
+ {"version":3,"file":"useExport.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/hooks/useExport.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAQhE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAElE,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,eAAe;IACvB,YAAY,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACxF,SAAS,EAAE,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,YAAY,CAAC;CAC7E;AAUD,iDAAiD;AACjD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAKtD,CAAC;AAEF;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,YAAY,CAAC,CAevB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAE3F;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,YAAY,CAkB5F;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,eAAe,CAe3C"}
@@ -5,28 +5,53 @@ import { useCallback } from "react";
5
5
  import * as fs from "node:fs";
6
6
  import * as path from "node:path";
7
7
  import { generateCurl } from "../utils/curl.js";
8
+ import { generateFetch } from "../utils/fetch.js";
9
+ import { generatePythonRequests } from "../utils/python-requests.js";
10
+ import { generateHttpie } from "../utils/httpie.js";
8
11
  import { generateHarString } from "../utils/har.js";
9
12
  import { copyToClipboard } from "../utils/clipboard.js";
13
+ /** Maps each format to its generator function. */
14
+ const FORMAT_GENERATORS = {
15
+ curl: generateCurl,
16
+ fetch: generateFetch,
17
+ python: generatePythonRequests,
18
+ httpie: generateHttpie,
19
+ };
20
+ /** Human-readable labels for status messages. */
21
+ export const FORMAT_LABELS = {
22
+ curl: "cURL",
23
+ fetch: "Fetch",
24
+ python: "Python",
25
+ httpie: "HTTPie",
26
+ };
10
27
  /**
11
- * Generate curl command for a request and copy to clipboard.
28
+ * Generate an export string for a request in the given format and copy to clipboard.
12
29
  * Extracted as standalone function for testability.
13
30
  */
14
- export async function exportCurlToClipboard(request) {
31
+ export async function exportFormatToClipboard(request, format) {
15
32
  try {
16
- const curl = generateCurl(request);
17
- await copyToClipboard(curl);
33
+ const generator = FORMAT_GENERATORS[format];
34
+ const output = generator(request);
35
+ await copyToClipboard(output);
18
36
  return {
19
37
  success: true,
20
- message: "Copied to clipboard",
38
+ message: `${FORMAT_LABELS[format]} copied to clipboard`,
21
39
  };
22
40
  }
23
41
  catch (err) {
24
42
  return {
25
43
  success: false,
26
- message: err instanceof Error ? err.message : "Failed to copy curl",
44
+ message: err instanceof Error ? err.message : `Failed to copy ${FORMAT_LABELS[format]}`,
27
45
  };
28
46
  }
29
47
  }
48
+ /**
49
+ * Generate curl command for a request and copy to clipboard.
50
+ * Kept for backwards compatibility with existing tests.
51
+ */
52
+ export async function exportCurlToClipboard(request) {
53
+ return exportFormatToClipboard(request, "curl");
54
+ }
30
55
  /**
31
56
  * Export requests to HAR file.
32
57
  * Extracted as standalone function for testability.
@@ -54,10 +79,10 @@ export function exportHarToFile(requests, filename) {
54
79
  * Wraps standalone functions with useCallback for React optimisation.
55
80
  */
56
81
  export function useExport() {
57
- const exportCurl = useCallback((request) => exportCurlToClipboard(request), []);
82
+ const exportFormatFn = useCallback((request, format) => exportFormatToClipboard(request, format), []);
58
83
  const exportHar = useCallback((requests, filename) => exportHarToFile(requests, filename), []);
59
84
  return {
60
- exportCurl,
85
+ exportFormat: exportFormatFn,
61
86
  exportHar,
62
87
  };
63
88
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useExport.js","sourceRoot":"","sources":["../../../../src/cli/tui/hooks/useExport.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAYxD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAwB;IAClE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;QAC5B,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,qBAAqB;SAC/B,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB;SACpE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAA2B,EAAE,QAAiB;IAC5E,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,QAAQ,IAAI,iBAAiB,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAE/C,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QAE/C,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,YAAY,QAAQ,CAAC,MAAM,kBAAkB,OAAO,EAAE;SAChE,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB;SACrE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,OAAwB,EAAE,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAEjG,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,QAA2B,EAAE,QAAiB,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,EACvF,EAAE,CACH,CAAC;IAEF,OAAO;QACL,UAAU;QACV,SAAS;KACV,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"useExport.js","sourceRoot":"","sources":["../../../../src/cli/tui/hooks/useExport.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,11 @@
1
1
  /**
2
2
  * Hook for fetching and polling captured requests from the daemon.
3
3
  */
4
- import type { CapturedRequest, CapturedRequestSummary, RequestFilter } from "../../../shared/types.js";
4
+ import type { BodySearchOptions, CapturedRequest, CapturedRequestSummary, RequestFilter } from "../../../shared/types.js";
5
5
  interface UseRequestsOptions {
6
6
  pollInterval?: number;
7
7
  filter?: RequestFilter;
8
+ bodySearch?: BodySearchOptions;
8
9
  projectRoot?: string;
9
10
  }
10
11
  interface UseRequestsResult {
@@ -17,6 +18,8 @@ interface UseRequestsResult {
17
18
  getFullRequest: (id: string) => Promise<CapturedRequest | null>;
18
19
  /** Fetch all requests with full data (for exports) */
19
20
  getAllFullRequests: () => Promise<CapturedRequest[]>;
21
+ /** Replay a captured request by ID. Returns the new replayed request ID on success. */
22
+ replayRequest?: (id: string) => Promise<string | null>;
20
23
  /** Toggle the saved/bookmark state of a request */
21
24
  toggleSaved: (id: string, currentlySaved: boolean) => Promise<boolean>;
22
25
  /** Clear all unsaved requests */
@@ -1 +1 @@
1
- {"version":3,"file":"useRequests.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/hooks/useRequests.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EACtB,aAAa,EACd,MAAM,0BAA0B,CAAC;AAOlC,UAAU,kBAAkB;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,iBAAiB;IACzB,qEAAqE;IACrE,QAAQ,EAAE,sBAAsB,EAAE,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,qDAAqD;IACrD,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IAChE,sDAAsD;IACtD,kBAAkB,EAAE,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACrD,mDAAmD;IACnD,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACvE,iCAAiC;IACjC,aAAa,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CACvC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,iBAAiB,CAwK/E"}
1
+ {"version":3,"file":"useRequests.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/hooks/useRequests.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,sBAAsB,EACtB,aAAa,EACd,MAAM,0BAA0B,CAAC;AAOlC,UAAU,kBAAkB;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,iBAAiB;IACzB,qEAAqE;IACrE,QAAQ,EAAE,sBAAsB,EAAE,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,qDAAqD;IACrD,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IAChE,sDAAsD;IACtD,kBAAkB,EAAE,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACrD,uFAAuF;IACvF,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACvD,mDAAmD;IACnD,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACvE,iCAAiC;IACjC,aAAa,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CACvC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,iBAAiB,CAuM/E"}
@@ -10,7 +10,7 @@ const DEFAULT_POLL_INTERVAL_MS = 2000;
10
10
  * Hook to fetch and poll for captured requests.
11
11
  */
12
12
  export function useRequests(options = {}) {
13
- const { pollInterval = DEFAULT_POLL_INTERVAL_MS, filter, projectRoot } = options;
13
+ const { pollInterval = DEFAULT_POLL_INTERVAL_MS, filter, bodySearch, projectRoot } = options;
14
14
  const [requests, setRequests] = useState([]);
15
15
  const [isLoading, setIsLoading] = useState(true);
16
16
  const [error, setError] = useState(null);
@@ -18,6 +18,7 @@ export function useRequests(options = {}) {
18
18
  const lastCountRef = useRef(0);
19
19
  const requestsLengthRef = useRef(0);
20
20
  const filterRef = useRef(filter);
21
+ const bodySearchRef = useRef(bodySearch);
21
22
  // Initialise control client
22
23
  useEffect(() => {
23
24
  const resolvedRoot = projectRoot ?? findProjectRoot();
@@ -43,17 +44,30 @@ export function useRequests(options = {}) {
43
44
  return;
44
45
  }
45
46
  const currentFilter = filterRef.current;
47
+ const currentBodySearch = bodySearchRef.current;
46
48
  try {
47
- // First check the count to avoid unnecessary data transfer
48
- const count = await client.countRequests({ filter: currentFilter });
49
- // Only fetch list if count changed or we have no requests yet
50
- if (count !== lastCountRef.current || requestsLengthRef.current === 0) {
51
- const newRequests = await client.listRequestsSummary({
49
+ if (currentBodySearch) {
50
+ const newRequests = await client.searchBodies({
51
+ query: currentBodySearch.query,
52
+ target: currentBodySearch.target,
52
53
  limit: DEFAULT_QUERY_LIMIT,
53
54
  filter: currentFilter,
54
55
  });
55
56
  setRequests(newRequests);
56
- lastCountRef.current = count;
57
+ lastCountRef.current = newRequests.length;
58
+ }
59
+ else {
60
+ // First check the count to avoid unnecessary data transfer
61
+ const count = await client.countRequests({ filter: currentFilter });
62
+ // Only fetch list if count changed or we have no requests yet
63
+ if (count !== lastCountRef.current || requestsLengthRef.current === 0) {
64
+ const newRequests = await client.listRequestsSummary({
65
+ limit: DEFAULT_QUERY_LIMIT,
66
+ filter: currentFilter,
67
+ });
68
+ setRequests(newRequests);
69
+ lastCountRef.current = count;
70
+ }
57
71
  }
58
72
  setError(null);
59
73
  }
@@ -70,12 +84,13 @@ export function useRequests(options = {}) {
70
84
  setIsLoading(false);
71
85
  }
72
86
  }, []);
73
- // Keep filter ref in sync and fetch immediately when filter changes
87
+ // Keep refs in sync and fetch immediately when search/filter changes
74
88
  useEffect(() => {
75
89
  filterRef.current = filter;
90
+ bodySearchRef.current = bodySearch;
76
91
  lastCountRef.current = 0;
77
92
  void fetchRequests();
78
- }, [filter, fetchRequests]);
93
+ }, [filter, bodySearch, fetchRequests]);
79
94
  // Manual refresh function
80
95
  const refresh = useCallback(async () => {
81
96
  setIsLoading(true);
@@ -108,6 +123,17 @@ export function useRequests(options = {}) {
108
123
  return [];
109
124
  }
110
125
  }, []);
126
+ // Replay request and force refresh
127
+ const replayRequest = useCallback(async (id) => {
128
+ const client = clientRef.current;
129
+ if (!client) {
130
+ throw new Error("Not connected to daemon");
131
+ }
132
+ const replayed = await client.replayRequest({ id, initiator: "tui" });
133
+ lastCountRef.current = 0;
134
+ await fetchRequests();
135
+ return replayed.requestId;
136
+ }, [fetchRequests]);
111
137
  // Toggle saved/bookmark state and force refresh
112
138
  const toggleSaved = useCallback(async (id, currentlySaved) => {
113
139
  const client = clientRef.current;
@@ -160,6 +186,7 @@ export function useRequests(options = {}) {
160
186
  refresh,
161
187
  getFullRequest,
162
188
  getAllFullRequests,
189
+ replayRequest,
163
190
  toggleSaved,
164
191
  clearRequests,
165
192
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useRequests.js","sourceRoot":"","sources":["../../../../src/cli/tui/hooks/useRequests.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useRequests.js","sourceRoot":"","sources":["../../../../src/cli/tui/hooks/useRequests.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,10 @@
6
6
  */
7
7
  /**
8
8
  * Returns [columns, rows] of the terminal, updating when the terminal is resized.
9
+ *
10
+ * Reads stdout.columns/rows synchronously on every render so the value is
11
+ * always current — a resize-event counter forces React to re-render, but
12
+ * the actual dimensions are never cached in state.
9
13
  */
10
14
  export declare function useStdoutDimensions(): [number, number];
11
15
  //# sourceMappingURL=useStdoutDimensions.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"useStdoutDimensions.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/hooks/useStdoutDimensions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH;;;;;;GAMG;AACH,wBAAgB,mBAAmB,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAyBtD"}
@@ -6,24 +6,34 @@
6
6
  */
7
7
  import { useState, useEffect } from "react";
8
8
  import { useStdout } from "ink";
9
+ const DEFAULT_COLUMNS = 80;
10
+ const DEFAULT_ROWS = 24;
11
+ const STARTUP_RECHECK_MS = 50;
9
12
  /**
10
13
  * Returns [columns, rows] of the terminal, updating when the terminal is resized.
14
+ *
15
+ * Reads stdout.columns/rows synchronously on every render so the value is
16
+ * always current — a resize-event counter forces React to re-render, but
17
+ * the actual dimensions are never cached in state.
11
18
  */
12
19
  export function useStdoutDimensions() {
13
20
  const { stdout } = useStdout();
14
- const [dimensions, setDimensions] = useState([
15
- stdout.columns || 80,
16
- stdout.rows || 24,
17
- ]);
21
+ // Counter whose sole purpose is to trigger a re-render on resize
22
+ const [, setResizeCount] = useState(0);
18
23
  useEffect(() => {
19
- const handler = () => {
20
- setDimensions([stdout.columns || 80, stdout.rows || 24]);
21
- };
22
- stdout.on("resize", handler);
24
+ const triggerRerender = () => setResizeCount((n) => n + 1);
25
+ stdout.on("resize", triggerRerender);
26
+ // Force a post-mount sync and one short delayed recheck.
27
+ // Some terminals populate columns/rows shortly after the first paint
28
+ // without emitting an initial "resize" event.
29
+ triggerRerender();
30
+ const startupRecheckTimer = setTimeout(triggerRerender, STARTUP_RECHECK_MS);
23
31
  return () => {
24
- stdout.off("resize", handler);
32
+ clearTimeout(startupRecheckTimer);
33
+ stdout.off("resize", triggerRerender);
25
34
  };
26
35
  }, [stdout]);
27
- return dimensions;
36
+ // Always read current dimensions — never rely on stale state
37
+ return [stdout.columns || DEFAULT_COLUMNS, stdout.rows || DEFAULT_ROWS];
28
38
  }
29
39
  //# sourceMappingURL=useStdoutDimensions.js.map
@@ -1 +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"}
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,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAE/B,iEAAiE;IACjE,MAAM,CAAC,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEvC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3D,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QAErC,yDAAyD;QACzD,qEAAqE;QACrE,8CAA8C;QAC9C,eAAe,EAAE,CAAC;QAClB,MAAM,mBAAmB,GAAG,UAAU,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;QAE5E,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,mBAAmB,CAAC,CAAC;YAClC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QACxC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,6DAA6D;IAC7D,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,eAAe,EAAE,MAAM,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC;AAC1E,CAAC"}
@@ -1 +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;AA6BhE;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CA0B7D"}
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;AAkBhE;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CA+B7D"}
@@ -1,17 +1,7 @@
1
1
  /**
2
2
  * Generate curl commands from captured requests.
3
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
- ]);
4
+ import { EXCLUDED_HEADERS } from "./export-shared.js";
15
5
  /**
16
6
  * Escape a string for use in a shell single-quoted context.
17
7
  *
@@ -44,8 +34,11 @@ export function generateCurl(request) {
44
34
  }
45
35
  parts.push(`-H '${shellEscape(name)}: ${shellEscape(value)}'`);
46
36
  }
47
- // Add body if present
48
- if (request.requestBody && request.requestBody.length > 0) {
37
+ // Add body if present and method supports it
38
+ if (request.requestBody &&
39
+ request.requestBody.length > 0 &&
40
+ request.method !== "GET" &&
41
+ request.method !== "HEAD") {
49
42
  const bodyStr = request.requestBody.toString("utf-8");
50
43
  parts.push(`-d '${shellEscape(bodyStr)}'`);
51
44
  }
@@ -1 +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;;;;;;;;;;GAUG;AACH,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACzD,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"}
1
+ {"version":3,"file":"curl.js","sourceRoot":"","sources":["../../../../src/cli/tui/utils/curl.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;;;;;;;;GAUG;AACH,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACzD,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,6CAA6C;IAC7C,IACE,OAAO,CAAC,WAAW;QACnB,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;QAC9B,OAAO,CAAC,MAAM,KAAK,KAAK;QACxB,OAAO,CAAC,MAAM,KAAK,MAAM,EACzB,CAAC;QACD,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,9 @@
1
+ /**
2
+ * Shared constants for export format generators.
3
+ */
4
+ /**
5
+ * Headers that should be excluded from export output.
6
+ * These are typically set automatically by the HTTP client or are connection-specific.
7
+ */
8
+ export declare const EXCLUDED_HEADERS: Set<string>;
9
+ //# sourceMappingURL=export-shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-shared.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/utils/export-shared.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,eAAO,MAAM,gBAAgB,aAM3B,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Shared constants for export format generators.
3
+ */
4
+ /**
5
+ * Headers that should be excluded from export output.
6
+ * These are typically set automatically by the HTTP client or are connection-specific.
7
+ */
8
+ export const EXCLUDED_HEADERS = new Set([
9
+ "host",
10
+ "content-length",
11
+ "connection",
12
+ "accept-encoding",
13
+ "transfer-encoding",
14
+ ]);
15
+ //# sourceMappingURL=export-shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-shared.js","sourceRoot":"","sources":["../../../../src/cli/tui/utils/export-shared.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IACtC,MAAM;IACN,gBAAgB;IAChB,YAAY;IACZ,iBAAiB;IACjB,mBAAmB;CACpB,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Generate JavaScript fetch() calls from captured requests.
3
+ */
4
+ import type { CapturedRequest } from "../../../shared/types.js";
5
+ /**
6
+ * Generate a JavaScript fetch() call from a captured request.
7
+ */
8
+ export declare function generateFetch(request: CapturedRequest): string;
9
+ //# sourceMappingURL=fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/utils/fetch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AA6BhE;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAoD9D"}
@@ -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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/utils/filters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAY7D"}
1
+ {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/utils/filters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAa7D"}
@@ -5,6 +5,7 @@ export function isFilterActive(filter) {
5
5
  return ((filter.methods !== undefined && filter.methods.length > 0) ||
6
6
  filter.statusRange !== undefined ||
7
7
  (filter.search !== undefined && filter.search.length > 0) ||
8
+ (filter.regex !== undefined && filter.regex.length > 0) ||
8
9
  filter.host !== undefined ||
9
10
  filter.pathPrefix !== undefined ||
10
11
  filter.since !== undefined ||
@@ -1 +1 @@
1
- {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../../../src/cli/tui/utils/filters.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAqB;IAClD,OAAO,CACL,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3D,MAAM,CAAC,WAAW,KAAK,SAAS;QAChC,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,KAAK,SAAS;QACzB,MAAM,CAAC,UAAU,KAAK,SAAS;QAC/B,MAAM,CAAC,KAAK,KAAK,SAAS;QAC1B,MAAM,CAAC,MAAM,KAAK,SAAS;QAC3B,MAAM,CAAC,KAAK,KAAK,SAAS;QAC1B,MAAM,CAAC,MAAM,KAAK,SAAS,CAC5B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../../../src/cli/tui/utils/filters.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAqB;IAClD,OAAO,CACL,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3D,MAAM,CAAC,WAAW,KAAK,SAAS;QAChC,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACzD,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,KAAK,SAAS;QACzB,MAAM,CAAC,UAAU,KAAK,SAAS;QAC/B,MAAM,CAAC,KAAK,KAAK,SAAS;QAC1B,MAAM,CAAC,MAAM,KAAK,SAAS;QAC3B,MAAM,CAAC,KAAK,KAAK,SAAS;QAC1B,MAAM,CAAC,MAAM,KAAK,SAAS,CAC5B,CAAC;AACJ,CAAC"}
@@ -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"}