procsi 0.2.6

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