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,249 @@
1
+ import * as fs from "node:fs";
2
+ import * as fsp from "node:fs/promises";
3
+ import * as path from "node:path";
4
+ import { createJiti } from "jiti";
5
+ import { createLogger } from "../shared/logger.js";
6
+ /** Debounce delay for file-watcher reload triggers */
7
+ const WATCH_DEBOUNCE_MS = 300;
8
+ /**
9
+ * Runtime type guard for interceptor exports.
10
+ * Validates that the value is an object with a `handler` function,
11
+ * and that optional fields have the correct types if present.
12
+ */
13
+ export function isValidInterceptor(value) {
14
+ if (typeof value !== "object" || value === null) {
15
+ return false;
16
+ }
17
+ const obj = value;
18
+ if (typeof obj["handler"] !== "function") {
19
+ return false;
20
+ }
21
+ if ("name" in obj && typeof obj["name"] !== "string") {
22
+ return false;
23
+ }
24
+ if ("match" in obj && typeof obj["match"] !== "function") {
25
+ return false;
26
+ }
27
+ return true;
28
+ }
29
+ /**
30
+ * Scan the interceptors directory for `.ts` files, sorted alphabetically.
31
+ * Returns an empty array if the directory does not exist.
32
+ */
33
+ async function listInterceptorFiles(dir) {
34
+ try {
35
+ const entries = await fsp.readdir(dir, { withFileTypes: true });
36
+ return entries
37
+ .filter((entry) => entry.isFile() && entry.name.endsWith(".ts"))
38
+ .map((entry) => entry.name)
39
+ .sort()
40
+ .map((name) => path.join(dir, name));
41
+ }
42
+ catch {
43
+ return [];
44
+ }
45
+ }
46
+ /**
47
+ * Extract loaded interceptors from a module's default export.
48
+ * Handles both single interceptor objects and arrays of interceptors.
49
+ */
50
+ function extractInterceptors(mod, filePath, logger) {
51
+ const interceptors = [];
52
+ const errors = [];
53
+ // Unwrap `default` export if present
54
+ const exported = typeof mod === "object" && mod !== null && "default" in mod
55
+ ? mod["default"]
56
+ : mod;
57
+ const candidates = Array.isArray(exported) ? exported : [exported];
58
+ for (const candidate of candidates) {
59
+ if (isValidInterceptor(candidate)) {
60
+ interceptors.push({ ...candidate, sourceFile: filePath });
61
+ }
62
+ else {
63
+ const desc = typeof candidate === "object" && candidate !== null
64
+ ? "object missing valid handler"
65
+ : `unexpected export type: ${typeof candidate}`;
66
+ const msg = `Invalid interceptor export in ${path.basename(filePath)}: ${desc}`;
67
+ errors.push(msg);
68
+ logger.warn(msg);
69
+ }
70
+ }
71
+ return { interceptors, errors };
72
+ }
73
+ /**
74
+ * Warn about duplicate interceptor names across all loaded interceptors.
75
+ */
76
+ function warnDuplicateNames(interceptors, logger) {
77
+ const seen = new Map();
78
+ for (const interceptor of interceptors) {
79
+ if (interceptor.name === undefined)
80
+ continue;
81
+ const previousFile = seen.get(interceptor.name);
82
+ if (previousFile !== undefined) {
83
+ logger.warn(`Duplicate interceptor name "${interceptor.name}" in ${path.basename(interceptor.sourceFile)} ` +
84
+ `(already defined in ${path.basename(previousFile)})`);
85
+ }
86
+ else {
87
+ seen.set(interceptor.name, interceptor.sourceFile);
88
+ }
89
+ }
90
+ }
91
+ /**
92
+ * Create an interceptor loader that loads TypeScript interceptor files
93
+ * from the given directory using jiti, validates them, and watches
94
+ * for changes to trigger hot reloads.
95
+ */
96
+ export async function createInterceptorLoader(options) {
97
+ const { interceptorsDir, projectRoot, logLevel, onReload } = options;
98
+ const logger = createLogger("interceptor", projectRoot, logLevel);
99
+ let interceptors = [];
100
+ let infoEntries = [];
101
+ let watcher = null;
102
+ let debounceTimer = null;
103
+ let closed = false;
104
+ /**
105
+ * Load all interceptor files from the directory and replace the
106
+ * current interceptor set atomically.
107
+ */
108
+ async function loadAll() {
109
+ const files = await listInterceptorFiles(interceptorsDir);
110
+ if (files.length === 0) {
111
+ interceptors = [];
112
+ infoEntries = [];
113
+ return;
114
+ }
115
+ logger.info(`Loading ${files.length} interceptor file(s) from ${interceptorsDir}`);
116
+ // Fresh jiti instance each load to avoid serving stale cached modules on reload
117
+ const jiti = createJiti(import.meta.url, { interopDefault: true });
118
+ const nextInterceptors = [];
119
+ const nextInfo = [];
120
+ for (const filePath of files) {
121
+ const fileName = path.basename(filePath);
122
+ try {
123
+ const mod = await jiti.import(filePath);
124
+ const { interceptors: extracted, errors } = extractInterceptors(mod, filePath, logger);
125
+ if (extracted.length === 0) {
126
+ // File loaded but produced no valid interceptors
127
+ const errorMsg = errors.length > 0 ? errors.join("; ") : "No valid interceptor exports found";
128
+ nextInfo.push({
129
+ name: fileName,
130
+ hasMatch: false,
131
+ sourceFile: filePath,
132
+ error: errorMsg,
133
+ });
134
+ continue;
135
+ }
136
+ for (const interceptor of extracted) {
137
+ const name = interceptor.name ?? fileName;
138
+ nextInterceptors.push(interceptor);
139
+ nextInfo.push({
140
+ name,
141
+ hasMatch: interceptor.match !== undefined,
142
+ sourceFile: filePath,
143
+ });
144
+ logger.info(`Loaded interceptor "${name}" from ${fileName}`);
145
+ }
146
+ }
147
+ catch (err) {
148
+ const errorMsg = err instanceof Error ? err.message : String(err);
149
+ logger.warn(`Failed to load interceptor file ${fileName}: ${errorMsg}`);
150
+ nextInfo.push({
151
+ name: fileName,
152
+ hasMatch: false,
153
+ sourceFile: filePath,
154
+ error: errorMsg,
155
+ });
156
+ }
157
+ }
158
+ warnDuplicateNames(nextInterceptors, logger);
159
+ // Atomic replacement
160
+ interceptors = nextInterceptors;
161
+ infoEntries = nextInfo;
162
+ }
163
+ /**
164
+ * Start watching the interceptors directory for changes.
165
+ */
166
+ async function startWatching() {
167
+ try {
168
+ await fsp.access(interceptorsDir);
169
+ }
170
+ catch {
171
+ return;
172
+ }
173
+ try {
174
+ watcher = fs.watch(interceptorsDir, (_eventType, filename) => {
175
+ // Only react to TypeScript file changes
176
+ if (typeof filename !== "string" || !filename.endsWith(".ts")) {
177
+ return;
178
+ }
179
+ // Debounce rapid successive changes (e.g. atomic save-rename patterns)
180
+ if (debounceTimer !== null) {
181
+ clearTimeout(debounceTimer);
182
+ }
183
+ debounceTimer = setTimeout(() => {
184
+ debounceTimer = null;
185
+ if (closed)
186
+ return;
187
+ logger.info("Interceptor file change detected, reloading");
188
+ loadAll()
189
+ .then(() => {
190
+ logger.info(`Hot-reload complete, ${interceptors.length} interceptor(s) active`);
191
+ onReload?.();
192
+ })
193
+ .catch((err) => {
194
+ logger.warn(`Hot-reload failed: ${err instanceof Error ? err.message : String(err)}`);
195
+ });
196
+ }, WATCH_DEBOUNCE_MS);
197
+ });
198
+ watcher.on("error", (err) => {
199
+ logger.warn(`Interceptor directory watcher error: ${err.message}`);
200
+ interceptors = [];
201
+ infoEntries = [];
202
+ stopWatching();
203
+ });
204
+ }
205
+ catch (err) {
206
+ logger.warn(`Failed to watch interceptors directory: ${err instanceof Error ? err.message : String(err)}`);
207
+ }
208
+ }
209
+ function stopWatching() {
210
+ if (debounceTimer !== null) {
211
+ clearTimeout(debounceTimer);
212
+ debounceTimer = null;
213
+ }
214
+ if (watcher !== null) {
215
+ watcher.close();
216
+ watcher = null;
217
+ }
218
+ }
219
+ // Perform initial load
220
+ try {
221
+ await fsp.access(interceptorsDir);
222
+ logger.info(`Interceptors directory found: ${interceptorsDir}`);
223
+ await loadAll();
224
+ }
225
+ catch {
226
+ // Directory does not exist — interceptors are opt-in
227
+ }
228
+ await startWatching();
229
+ return {
230
+ getInterceptors() {
231
+ return interceptors;
232
+ },
233
+ getInterceptorInfo() {
234
+ return infoEntries;
235
+ },
236
+ async reload() {
237
+ logger.info("Manual reload triggered");
238
+ await loadAll();
239
+ logger.info(`Reload complete, ${interceptors.length} interceptor(s) active`);
240
+ onReload?.();
241
+ },
242
+ close() {
243
+ closed = true;
244
+ stopWatching();
245
+ logger.close();
246
+ },
247
+ };
248
+ }
249
+ //# sourceMappingURL=interceptor-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interceptor-loader.js","sourceRoot":"","sources":["../../src/daemon/interceptor-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { type LogLevel } from "../shared/logger.js";
2
+ import type { InterceptorRequest, InterceptorResponse, InterceptionType, ProcsiClient } from "../shared/types.js";
3
+ import type { InterceptorLoader } from "./interceptor-loader.js";
4
+ export declare const HANDLER_TIMEOUT_MS = 30000;
5
+ export declare const MATCH_TIMEOUT_MS = 5000;
6
+ export declare const STALE_CLEANUP_INTERVAL_MS = 60000;
7
+ export interface HandleRequestResult {
8
+ mockResponse?: InterceptorResponse;
9
+ interception?: {
10
+ name: string;
11
+ type: InterceptionType;
12
+ };
13
+ }
14
+ export interface HandleResponseResult {
15
+ responseOverride?: InterceptorResponse;
16
+ interception?: {
17
+ name: string;
18
+ type: InterceptionType;
19
+ };
20
+ }
21
+ export interface InterceptorRunner {
22
+ handleRequest(requestId: string, request: InterceptorRequest): Promise<HandleRequestResult | undefined>;
23
+ handleResponse(requestId: string, upstreamResponse: InterceptorResponse): Promise<HandleResponseResult | undefined>;
24
+ cleanup(requestId: string): void;
25
+ }
26
+ interface InterceptorRunnerOptions {
27
+ loader: InterceptorLoader;
28
+ procsiClient: ProcsiClient;
29
+ projectRoot: string;
30
+ logLevel?: LogLevel;
31
+ /** Override handler timeout for testing */
32
+ handlerTimeoutMs?: number;
33
+ /** Override match timeout for testing */
34
+ matchTimeoutMs?: number;
35
+ }
36
+ export declare function isValidInterceptorResponse(value: unknown): value is InterceptorResponse;
37
+ export declare function createInterceptorRunner(options: InterceptorRunnerOptions): InterceptorRunner;
38
+ export {};
39
+ //# sourceMappingURL=interceptor-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interceptor-runner.d.ts","sourceRoot":"","sources":["../../src/daemon/interceptor-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EAEnB,gBAAgB,EAChB,YAAY,EACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,iBAAiB,EAAqB,MAAM,yBAAyB,CAAC;AAIpF,eAAO,MAAM,kBAAkB,QAAS,CAAC;AACzC,eAAO,MAAM,gBAAgB,OAAQ,CAAC;AACtC,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAMhD,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,YAAY,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,gBAAgB,CAAA;KAAE,CAAC;CACzD;AAED,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;IACvC,YAAY,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,gBAAgB,CAAA;KAAE,CAAC;CACzD;AAID,MAAM,WAAW,iBAAiB;IAChC,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAAC;IAC5C,cAAc,CACZ,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,mBAAmB,GACpC,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAAC;IAC7C,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AA+BD,UAAU,wBAAwB;IAChC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAOD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CA2BvF;AAiCD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,GAAG,iBAAiB,CAqT5F"}
@@ -0,0 +1,312 @@
1
+ import { createLogger } from "../shared/logger.js";
2
+ // --- Constants (exported for testing) ---
3
+ export const HANDLER_TIMEOUT_MS = 30_000;
4
+ export const MATCH_TIMEOUT_MS = 5_000;
5
+ export const STALE_CLEANUP_INTERVAL_MS = 60_000;
6
+ /** Warn if total match evaluation across all interceptors exceeds this threshold */
7
+ const SLOW_MATCH_TOTAL_MS = 1_000;
8
+ function createDeferred() {
9
+ let resolve;
10
+ let reject;
11
+ const promise = new Promise((res, rej) => {
12
+ resolve = res;
13
+ reject = rej;
14
+ });
15
+ return { promise, resolve, reject };
16
+ }
17
+ // --- Response validation ---
18
+ const MIN_HTTP_STATUS = 100;
19
+ const MAX_HTTP_STATUS = 599;
20
+ export function isValidInterceptorResponse(value) {
21
+ if (value === null || value === undefined || typeof value !== "object") {
22
+ return false;
23
+ }
24
+ const candidate = value;
25
+ if (typeof candidate["status"] !== "number") {
26
+ return false;
27
+ }
28
+ if (candidate["status"] < MIN_HTTP_STATUS || candidate["status"] > MAX_HTTP_STATUS) {
29
+ return false;
30
+ }
31
+ if (candidate["headers"] !== undefined) {
32
+ if (candidate["headers"] === null || typeof candidate["headers"] !== "object") {
33
+ return false;
34
+ }
35
+ }
36
+ if (candidate["body"] !== undefined) {
37
+ if (typeof candidate["body"] !== "string" && !Buffer.isBuffer(candidate["body"])) {
38
+ return false;
39
+ }
40
+ }
41
+ return true;
42
+ }
43
+ // --- Timeout helper ---
44
+ /**
45
+ * Race a promise against a timeout. Resolves to `{ result }` on success
46
+ * or `{ timedOut: true }` if the deadline is exceeded.
47
+ */
48
+ function withTimeout(promise, ms) {
49
+ return new Promise((resolve) => {
50
+ const timer = setTimeout(() => {
51
+ resolve({ timedOut: true });
52
+ }, ms);
53
+ promise.then((result) => {
54
+ clearTimeout(timer);
55
+ resolve({ result });
56
+ }, () => {
57
+ clearTimeout(timer);
58
+ // The caller handles errors separately; treat rejection as a timeout-like bail-out
59
+ resolve({ timedOut: true });
60
+ });
61
+ });
62
+ }
63
+ // --- Factory ---
64
+ export function createInterceptorRunner(options) {
65
+ const { loader, procsiClient, projectRoot, logLevel } = options;
66
+ const handlerTimeoutMs = options.handlerTimeoutMs ?? HANDLER_TIMEOUT_MS;
67
+ const matchTimeoutMs = options.matchTimeoutMs ?? MATCH_TIMEOUT_MS;
68
+ const logger = createLogger("interceptor", projectRoot, logLevel);
69
+ // Tracks requests where forward() was called and we are waiting for the upstream response
70
+ const pending = new Map();
71
+ // Periodic cleanup of stale entries where completion never fired
72
+ const staleThreshold = handlerTimeoutMs * 2;
73
+ const cleanupInterval = setInterval(() => {
74
+ const now = Date.now();
75
+ for (const [requestId, entry] of pending) {
76
+ if (now - entry.createdAt > staleThreshold) {
77
+ logger.trace("Cleaning up stale pending entry", {
78
+ requestId,
79
+ interceptor: entry.interceptorName,
80
+ });
81
+ pending.delete(requestId);
82
+ entry.rejectUpstream(new Error("Stale pending entry cleaned up"));
83
+ }
84
+ }
85
+ }, STALE_CLEANUP_INTERVAL_MS);
86
+ // Prevent the interval from keeping the process alive
87
+ cleanupInterval.unref();
88
+ /**
89
+ * Find the first interceptor whose match predicate returns true for the request.
90
+ * If an interceptor has no match function it matches everything.
91
+ */
92
+ async function findMatchingInterceptor(interceptors, request) {
93
+ const matchStart = Date.now();
94
+ for (const interceptor of interceptors) {
95
+ if (!interceptor.match) {
96
+ return interceptor;
97
+ }
98
+ try {
99
+ const outcome = await withTimeout(Promise.resolve(interceptor.match(request)), matchTimeoutMs);
100
+ if (outcome.timedOut) {
101
+ logger.warn("Match function timed out", {
102
+ interceptor: interceptor.name ?? interceptor.sourceFile,
103
+ });
104
+ continue;
105
+ }
106
+ if (outcome.result) {
107
+ return interceptor;
108
+ }
109
+ }
110
+ catch (err) {
111
+ logger.warn("Match function threw", {
112
+ interceptor: interceptor.name ?? interceptor.sourceFile,
113
+ error: err instanceof Error ? err.message : String(err),
114
+ });
115
+ continue;
116
+ }
117
+ }
118
+ const totalMs = Date.now() - matchStart;
119
+ if (totalMs > SLOW_MATCH_TOTAL_MS) {
120
+ logger.warn("Slow match evaluation — keep match functions synchronous and fast", {
121
+ totalMs,
122
+ interceptorCount: interceptors.length,
123
+ });
124
+ }
125
+ return undefined;
126
+ }
127
+ async function handleRequest(requestId, request) {
128
+ const interceptors = loader.getInterceptors();
129
+ if (interceptors.length === 0) {
130
+ return undefined;
131
+ }
132
+ const interceptor = await findMatchingInterceptor(interceptors, request);
133
+ if (!interceptor) {
134
+ return undefined;
135
+ }
136
+ const interceptorName = interceptor.name ?? interceptor.sourceFile;
137
+ logger.debug("Request matched interceptor", {
138
+ requestId,
139
+ interceptor: interceptorName,
140
+ method: request.method,
141
+ url: request.url,
142
+ });
143
+ // Defensive copy of body buffer so handlers cannot mutate the original
144
+ if (request.body) {
145
+ request = { ...request, body: Buffer.from(request.body) };
146
+ }
147
+ // Freeze the request so handlers cannot mutate it
148
+ Object.freeze(request.headers);
149
+ Object.freeze(request);
150
+ // Deferred for the upstream response that forward() will await
151
+ const upstreamDeferred = createDeferred();
152
+ // Signal deferred that resolves when forward() is called
153
+ const forwardCalledDeferred = createDeferred();
154
+ let forwardCalled = false;
155
+ let completed = false;
156
+ const forward = () => {
157
+ if (completed) {
158
+ const msg = "forward() called after handler completed";
159
+ logger.warn(msg, { requestId, interceptor: interceptorName });
160
+ return Promise.reject(new Error(msg));
161
+ }
162
+ if (forwardCalled) {
163
+ logger.debug("forward() called again (idempotent)", {
164
+ requestId,
165
+ interceptor: interceptorName,
166
+ });
167
+ return upstreamDeferred.promise;
168
+ }
169
+ forwardCalled = true;
170
+ forwardCalledDeferred.resolve(undefined);
171
+ return upstreamDeferred.promise;
172
+ };
173
+ const ctxLog = (message) => {
174
+ logger.info(`[${interceptorName}] ${message}`, { requestId });
175
+ };
176
+ const ctx = {
177
+ request,
178
+ forward,
179
+ procsi: procsiClient,
180
+ log: ctxLog,
181
+ };
182
+ // Start the handler
183
+ const handlerPromise = interceptor.handler(ctx);
184
+ // Race: handler completes first (mock) vs forward() called first (modify/observe)
185
+ try {
186
+ const raceOutcome = await withTimeout(Promise.race([
187
+ handlerPromise.then((result) => ({ kind: "handlerDone", result })),
188
+ forwardCalledDeferred.promise.then(() => ({
189
+ kind: "forwardCalled",
190
+ result: undefined,
191
+ })),
192
+ ]), handlerTimeoutMs);
193
+ if (raceOutcome.timedOut) {
194
+ logger.warn("Handler timed out during request phase", {
195
+ requestId,
196
+ interceptor: interceptorName,
197
+ });
198
+ completed = true;
199
+ return undefined;
200
+ }
201
+ const raceResult = raceOutcome.result;
202
+ if (raceResult.kind === "handlerDone") {
203
+ // Handler returned before calling forward() - this is a mock or pass-through
204
+ completed = true;
205
+ if (raceResult.result === undefined || raceResult.result === null) {
206
+ // Handler returned nothing - pass through
207
+ return undefined;
208
+ }
209
+ if (!isValidInterceptorResponse(raceResult.result)) {
210
+ logger.warn("Handler returned invalid response", {
211
+ requestId,
212
+ interceptor: interceptorName,
213
+ });
214
+ return undefined;
215
+ }
216
+ logger.debug("Mock response returned", {
217
+ requestId,
218
+ interceptor: interceptorName,
219
+ status: raceResult.result.status,
220
+ });
221
+ return {
222
+ mockResponse: raceResult.result,
223
+ interception: { name: interceptorName, type: "mocked" },
224
+ };
225
+ }
226
+ // forward() was called - store state and let the proxy forward the request
227
+ const interception = { name: interceptorName, type: "modified" };
228
+ pending.set(requestId, {
229
+ resolveUpstream: upstreamDeferred.resolve,
230
+ rejectUpstream: upstreamDeferred.reject,
231
+ handlerPromise,
232
+ interceptorName,
233
+ interception,
234
+ completed: false,
235
+ createdAt: Date.now(),
236
+ });
237
+ return { interception };
238
+ }
239
+ catch (err) {
240
+ logger.warn("Handler threw during request phase", {
241
+ requestId,
242
+ interceptor: interceptorName,
243
+ error: err instanceof Error ? err.message : String(err),
244
+ });
245
+ completed = true;
246
+ return undefined;
247
+ }
248
+ }
249
+ async function handleResponse(requestId, upstreamResponse) {
250
+ const entry = pending.get(requestId);
251
+ if (!entry) {
252
+ return undefined;
253
+ }
254
+ pending.delete(requestId);
255
+ // Resolve the upstream promise so the handler's forward() call returns
256
+ entry.resolveUpstream(upstreamResponse);
257
+ // Calculate remaining time budget from when the handler started
258
+ const elapsed = Date.now() - entry.createdAt;
259
+ const remaining = Math.max(0, handlerTimeoutMs - elapsed);
260
+ try {
261
+ const outcome = await withTimeout(entry.handlerPromise, remaining);
262
+ entry.completed = true;
263
+ if (outcome.timedOut) {
264
+ logger.warn("Handler timed out during response phase", {
265
+ requestId,
266
+ interceptor: entry.interceptorName,
267
+ });
268
+ return undefined;
269
+ }
270
+ const result = outcome.result;
271
+ if (result === undefined || result === null) {
272
+ // Handler did not return a response override (observe mode)
273
+ return { interception: entry.interception };
274
+ }
275
+ if (!isValidInterceptorResponse(result)) {
276
+ logger.warn("Handler returned invalid response after forward()", {
277
+ requestId,
278
+ interceptor: entry.interceptorName,
279
+ });
280
+ return { interception: entry.interception };
281
+ }
282
+ logger.debug("Response modified after forward()", {
283
+ requestId,
284
+ interceptor: entry.interceptorName,
285
+ status: result.status,
286
+ });
287
+ return {
288
+ responseOverride: result,
289
+ interception: entry.interception,
290
+ };
291
+ }
292
+ catch (err) {
293
+ entry.completed = true;
294
+ logger.warn("Handler threw during response phase", {
295
+ requestId,
296
+ interceptor: entry.interceptorName,
297
+ error: err instanceof Error ? err.message : String(err),
298
+ });
299
+ return undefined;
300
+ }
301
+ }
302
+ function cleanup(requestId) {
303
+ const entry = pending.get(requestId);
304
+ if (!entry) {
305
+ return;
306
+ }
307
+ pending.delete(requestId);
308
+ entry.rejectUpstream(new Error("Request aborted"));
309
+ }
310
+ return { handleRequest, handleResponse, cleanup };
311
+ }
312
+ //# sourceMappingURL=interceptor-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interceptor-runner.js","sourceRoot":"","sources":["../../src/daemon/interceptor-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { RequestRepository } from "./storage.js";
2
+ import type { ProcsiClient } from "../shared/types.js";
3
+ /**
4
+ * Create an in-process ProcsiClient that wraps RequestRepository directly.
5
+ * Used by interceptors running inside the daemon process.
6
+ */
7
+ export declare function createProcsiClient(storage: RequestRepository): ProcsiClient;
8
+ //# sourceMappingURL=procsi-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"procsi-client.d.ts","sourceRoot":"","sources":["../../src/daemon/procsi-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,YAAY,CAsB3E"}