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,339 @@
1
+ /**
2
+ * Pure functions for building and navigating a collapsible JSON tree.
3
+ * Used by JsonExplorerModal to render an interactive tree view.
4
+ */
5
+ const ROOT_PATH = "root";
6
+ /**
7
+ * Format a primitive value for display.
8
+ */
9
+ function formatPrimitive(value) {
10
+ if (value === null)
11
+ return "null";
12
+ if (value === undefined)
13
+ return "undefined";
14
+ if (typeof value === "string")
15
+ return `"${value}"`;
16
+ if (typeof value === "boolean")
17
+ return String(value);
18
+ if (typeof value === "number")
19
+ return String(value);
20
+ return String(value);
21
+ }
22
+ /**
23
+ * Determine the type classification of a value.
24
+ */
25
+ function classifyValue(value) {
26
+ if (Array.isArray(value))
27
+ return "array";
28
+ if (value !== null && typeof value === "object")
29
+ return "object";
30
+ return "primitive";
31
+ }
32
+ /**
33
+ * Build a container summary string, e.g. "{3 keys}" or "[5 items]".
34
+ */
35
+ function containerSummary(value) {
36
+ if (Array.isArray(value)) {
37
+ const len = value.length;
38
+ return `[${len} ${len === 1 ? "item" : "items"}]`;
39
+ }
40
+ if (value !== null && typeof value === "object") {
41
+ const len = Object.keys(value).length;
42
+ return `{${len} ${len === 1 ? "key" : "keys"}}`;
43
+ }
44
+ return "";
45
+ }
46
+ /**
47
+ * Build a child path from a parent path and a key.
48
+ */
49
+ function childPath(parentPath, key, isArrayIndex) {
50
+ if (isArrayIndex)
51
+ return `${parentPath}[${key}]`;
52
+ // Dotted keys or keys with special chars get bracket notation
53
+ if (/[.[\]\s]/.test(key) || key === "") {
54
+ return `${parentPath}["${key}"]`;
55
+ }
56
+ return `${parentPath}.${key}`;
57
+ }
58
+ /**
59
+ * Build a flat array of visible tree nodes by recursively walking the JSON data.
60
+ * Children of collapsed nodes are skipped.
61
+ */
62
+ export function buildVisibleNodes(data, expandedPaths) {
63
+ const nodes = [];
64
+ function walk(value, path, key, depth) {
65
+ const type = classifyValue(value);
66
+ const expandable = type !== "primitive";
67
+ const displayValue = expandable ? containerSummary(value) : formatPrimitive(value);
68
+ nodes.push({ path, key, depth, type, value: displayValue, expandable });
69
+ if (!expandable || !expandedPaths.has(path))
70
+ return;
71
+ if (Array.isArray(value)) {
72
+ for (let i = 0; i < value.length; i++) {
73
+ const cp = childPath(path, String(i), true);
74
+ walk(value[i], cp, `[${i}]`, depth + 1);
75
+ }
76
+ }
77
+ else if (value !== null && typeof value === "object") {
78
+ const entries = Object.entries(value);
79
+ for (const [k, v] of entries) {
80
+ const cp = childPath(path, k, false);
81
+ walk(v, cp, k, depth + 1);
82
+ }
83
+ }
84
+ }
85
+ walk(data, ROOT_PATH, "(root)", 0);
86
+ return nodes;
87
+ }
88
+ /**
89
+ * Toggle a node's expansion state. Returns a new Set.
90
+ */
91
+ export function toggleNode(expandedPaths, path) {
92
+ const next = new Set(expandedPaths);
93
+ if (next.has(path)) {
94
+ next.delete(path);
95
+ }
96
+ else {
97
+ next.add(path);
98
+ }
99
+ return next;
100
+ }
101
+ /**
102
+ * Compute default expansion: root + all depth-1 nodes.
103
+ */
104
+ export function defaultExpansion(data) {
105
+ const paths = new Set();
106
+ const type = classifyValue(data);
107
+ if (type === "primitive")
108
+ return paths;
109
+ paths.add(ROOT_PATH);
110
+ if (Array.isArray(data)) {
111
+ for (let i = 0; i < data.length; i++) {
112
+ const cp = childPath(ROOT_PATH, String(i), true);
113
+ if (classifyValue(data[i]) !== "primitive") {
114
+ paths.add(cp);
115
+ }
116
+ }
117
+ }
118
+ else if (data !== null && typeof data === "object") {
119
+ for (const [k, v] of Object.entries(data)) {
120
+ const cp = childPath(ROOT_PATH, k, false);
121
+ if (classifyValue(v) !== "primitive") {
122
+ paths.add(cp);
123
+ }
124
+ }
125
+ }
126
+ return paths;
127
+ }
128
+ /**
129
+ * Expand all container nodes in the data.
130
+ */
131
+ export function expandAll(data) {
132
+ const paths = new Set();
133
+ function walk(value, path) {
134
+ const type = classifyValue(value);
135
+ if (type === "primitive")
136
+ return;
137
+ paths.add(path);
138
+ if (Array.isArray(value)) {
139
+ for (let i = 0; i < value.length; i++) {
140
+ walk(value[i], childPath(path, String(i), true));
141
+ }
142
+ }
143
+ else if (value !== null && typeof value === "object") {
144
+ for (const [k, v] of Object.entries(value)) {
145
+ walk(v, childPath(path, k, false));
146
+ }
147
+ }
148
+ }
149
+ walk(data, ROOT_PATH);
150
+ return paths;
151
+ }
152
+ /**
153
+ * Collapse everything.
154
+ */
155
+ export function collapseAll() {
156
+ return new Set();
157
+ }
158
+ /**
159
+ * Find the parent path of a given path.
160
+ * Returns null for the root path.
161
+ */
162
+ export function parentPath(path) {
163
+ if (path === ROOT_PATH)
164
+ return null;
165
+ // Handle bracket notation: root.foo[0] → root.foo
166
+ // Handle dot notation: root.foo.bar → root.foo
167
+ const bracketMatch = path.match(/^(.+)\[\d+\]$/);
168
+ if (bracketMatch?.[1])
169
+ return bracketMatch[1];
170
+ const quotedBracketMatch = path.match(/^(.+)\["[^"]*"\]$/);
171
+ if (quotedBracketMatch?.[1])
172
+ return quotedBracketMatch[1];
173
+ const lastDot = path.lastIndexOf(".");
174
+ if (lastDot === -1)
175
+ return null;
176
+ return path.substring(0, lastDot);
177
+ }
178
+ /**
179
+ * Filter nodes by dotted path prefix.
180
+ * Returns matching paths and the set of paths that should be expanded to reveal them.
181
+ * Returns null if filter text is empty.
182
+ *
183
+ * Supports:
184
+ * - Dotted paths: "data.users"
185
+ * - Array indices: "data.users[0]"
186
+ * - Case-insensitive matching
187
+ */
188
+ export function filterByPath(data, filterText) {
189
+ const trimmed = filterText.trim();
190
+ if (trimmed === "")
191
+ return null;
192
+ const matchingPaths = new Set();
193
+ const expandedPaths = new Set();
194
+ // Normalise the filter to match against path segments
195
+ const filterLower = trimmed.toLowerCase();
196
+ function walk(value, path) {
197
+ // Build a "display path" without the root prefix for user-facing matching
198
+ const displayPath = path === ROOT_PATH ? "" : path.replace(/^root\.?/, "");
199
+ const displayPathLower = displayPath.toLowerCase();
200
+ // Match if the display path starts with the filter, or the filter starts with the display path
201
+ // (the latter allows partial input to highlight ancestors)
202
+ const isMatch = displayPathLower.startsWith(filterLower) || filterLower.startsWith(displayPathLower);
203
+ if (isMatch && displayPath !== "") {
204
+ matchingPaths.add(path);
205
+ // Auto-expand all ancestors to reveal the match
206
+ let ancestor = parentPath(path);
207
+ while (ancestor !== null) {
208
+ expandedPaths.add(ancestor);
209
+ ancestor = parentPath(ancestor);
210
+ }
211
+ // If the filter is an exact prefix of this path, expand this node too
212
+ if (filterLower.startsWith(displayPathLower)) {
213
+ expandedPaths.add(path);
214
+ }
215
+ }
216
+ // Continue walking children
217
+ const type = classifyValue(value);
218
+ if (type === "primitive")
219
+ return;
220
+ if (Array.isArray(value)) {
221
+ for (let i = 0; i < value.length; i++) {
222
+ walk(value[i], childPath(path, String(i), true));
223
+ }
224
+ }
225
+ else if (value !== null && typeof value === "object") {
226
+ for (const [k, v] of Object.entries(value)) {
227
+ walk(v, childPath(path, k, false));
228
+ }
229
+ }
230
+ }
231
+ walk(data, ROOT_PATH);
232
+ return { matchingPaths, expandedPaths };
233
+ }
234
+ /**
235
+ * Resolve a tree node path to the actual value in the data.
236
+ */
237
+ export function getValueAtPath(data, path) {
238
+ if (path === ROOT_PATH)
239
+ return data;
240
+ // Parse the path segments after "root."
241
+ const withoutRoot = path.replace(/^root\.?/, "");
242
+ if (withoutRoot === "")
243
+ return data;
244
+ // Tokenise: handles both dot notation and bracket notation
245
+ const segments = [];
246
+ let i = 0;
247
+ while (i < withoutRoot.length) {
248
+ if (withoutRoot[i] === "[") {
249
+ // Bracket notation
250
+ const closeIdx = withoutRoot.indexOf("]", i);
251
+ if (closeIdx === -1)
252
+ break;
253
+ let segment = withoutRoot.substring(i + 1, closeIdx);
254
+ // Remove quotes from ["key"] notation
255
+ if (segment.startsWith('"') && segment.endsWith('"')) {
256
+ segment = segment.substring(1, segment.length - 1);
257
+ }
258
+ segments.push(segment);
259
+ i = closeIdx + 1;
260
+ // Skip trailing dot
261
+ if (i < withoutRoot.length && withoutRoot[i] === ".")
262
+ i++;
263
+ }
264
+ else {
265
+ // Dot notation
266
+ let dotIdx = withoutRoot.indexOf(".", i);
267
+ const bracketIdx = withoutRoot.indexOf("[", i);
268
+ if (dotIdx === -1)
269
+ dotIdx = withoutRoot.length;
270
+ if (bracketIdx !== -1 && bracketIdx < dotIdx) {
271
+ segments.push(withoutRoot.substring(i, bracketIdx));
272
+ i = bracketIdx;
273
+ }
274
+ else {
275
+ segments.push(withoutRoot.substring(i, dotIdx));
276
+ i = dotIdx + 1;
277
+ }
278
+ }
279
+ }
280
+ let current = data;
281
+ for (const segment of segments) {
282
+ if (current === null || current === undefined)
283
+ return undefined;
284
+ if (Array.isArray(current)) {
285
+ const idx = parseInt(segment, 10);
286
+ if (isNaN(idx))
287
+ return undefined;
288
+ current = current[idx];
289
+ }
290
+ else if (typeof current === "object") {
291
+ current = current[segment];
292
+ }
293
+ else {
294
+ return undefined;
295
+ }
296
+ }
297
+ return current;
298
+ }
299
+ /**
300
+ * Build a breadcrumb trail from a node path.
301
+ * e.g. "root.data.users[0].name" → ["(root)", "data", "users", "[0]", "name"]
302
+ */
303
+ export function buildBreadcrumb(path) {
304
+ if (path === ROOT_PATH)
305
+ return ["(root)"];
306
+ const parts = ["(root)"];
307
+ const withoutRoot = path.replace(/^root\.?/, "");
308
+ if (withoutRoot === "")
309
+ return parts;
310
+ let i = 0;
311
+ while (i < withoutRoot.length) {
312
+ if (withoutRoot[i] === "[") {
313
+ const closeIdx = withoutRoot.indexOf("]", i);
314
+ if (closeIdx === -1)
315
+ break;
316
+ const segment = withoutRoot.substring(i, closeIdx + 1);
317
+ parts.push(segment);
318
+ i = closeIdx + 1;
319
+ if (i < withoutRoot.length && withoutRoot[i] === ".")
320
+ i++;
321
+ }
322
+ else {
323
+ let dotIdx = withoutRoot.indexOf(".", i);
324
+ const bracketIdx = withoutRoot.indexOf("[", i);
325
+ if (dotIdx === -1)
326
+ dotIdx = withoutRoot.length;
327
+ if (bracketIdx !== -1 && bracketIdx < dotIdx) {
328
+ parts.push(withoutRoot.substring(i, bracketIdx));
329
+ i = bracketIdx;
330
+ }
331
+ else {
332
+ parts.push(withoutRoot.substring(i, dotIdx));
333
+ i = dotIdx + 1;
334
+ }
335
+ }
336
+ }
337
+ return parts;
338
+ }
339
+ //# sourceMappingURL=json-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-tree.js","sourceRoot":"","sources":["../../../../src/cli/tui/utils/json-tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Open files in the platform's default external application.
3
+ *
4
+ * Writes body to a temp file then opens it with the OS default handler.
5
+ */
6
+ interface OpenResult {
7
+ success: boolean;
8
+ message: string;
9
+ filePath?: string;
10
+ }
11
+ /**
12
+ * Write body to a temp file and open it with the platform's default application.
13
+ * The spawned process is detached so it doesn't block the TUI.
14
+ */
15
+ export declare function openInExternalApp(body: Buffer, filename: string): Promise<OpenResult>;
16
+ export {};
17
+ //# sourceMappingURL=open-external.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-external.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/utils/open-external.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,UAAU,UAAU;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAiBD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA8B3F"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Open files in the platform's default external application.
3
+ *
4
+ * Writes body to a temp file then opens it with the OS default handler.
5
+ */
6
+ import * as fs from "node:fs";
7
+ import * as path from "node:path";
8
+ import * as os from "node:os";
9
+ import { spawn } from "node:child_process";
10
+ const TEMP_DIR_NAME = "procsi-exports";
11
+ /**
12
+ * Get the platform-specific command for opening files with the default app.
13
+ */
14
+ function getOpenCommand() {
15
+ const platform = process.platform;
16
+ if (platform === "darwin") {
17
+ return { command: "open", args: [] };
18
+ }
19
+ else if (platform === "win32") {
20
+ return { command: "cmd", args: ["/c", "start", ""] };
21
+ }
22
+ else {
23
+ return { command: "xdg-open", args: [] };
24
+ }
25
+ }
26
+ /**
27
+ * Write body to a temp file and open it with the platform's default application.
28
+ * The spawned process is detached so it doesn't block the TUI.
29
+ */
30
+ export async function openInExternalApp(body, filename) {
31
+ try {
32
+ const tempDir = path.join(os.tmpdir(), TEMP_DIR_NAME);
33
+ if (!fs.existsSync(tempDir)) {
34
+ fs.mkdirSync(tempDir, { recursive: true });
35
+ }
36
+ const filePath = path.join(tempDir, filename);
37
+ fs.writeFileSync(filePath, body);
38
+ const { command, args } = getOpenCommand();
39
+ const child = spawn(command, [...args, filePath], {
40
+ detached: true,
41
+ stdio: "ignore",
42
+ });
43
+ child.unref();
44
+ return {
45
+ success: true,
46
+ message: `Opened in external app: ${filename}`,
47
+ filePath,
48
+ };
49
+ }
50
+ catch (err) {
51
+ return {
52
+ success: false,
53
+ message: err instanceof Error ? err.message : "Failed to open externally",
54
+ };
55
+ }
56
+ }
57
+ //# sourceMappingURL=open-external.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-external.js","sourceRoot":"","sources":["../../../../src/cli/tui/utils/open-external.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,aAAa,GAAG,gBAAgB,CAAC;AAQvC;;GAEG;AACH,SAAS,cAAc;IACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAElC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IACvC,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAC3C,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY,EAAE,QAAgB;IACpE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC;QAEtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC9C,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEjC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAC;QAE3C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,EAAE;YAChD,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,EAAE,CAAC;QAEd,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,2BAA2B,QAAQ,EAAE;YAC9C,QAAQ;SACT,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,2BAA2B;SAC1E,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Syntax highlighting for HTTP body content using cli-highlight.
3
+ *
4
+ * Maps content-type shorthands (as produced by shortContentType) to
5
+ * highlight.js language identifiers, then applies terminal ANSI colouring.
6
+ */
7
+ /**
8
+ * Apply syntax highlighting to a code string based on its content type.
9
+ *
10
+ * Returns the original string unchanged when:
11
+ * - The content type cannot be mapped to a supported language
12
+ * - The input is empty
13
+ * - highlight.js throws (e.g. on malformed input)
14
+ */
15
+ export declare function highlightCode(code: string, contentType: string | undefined): string;
16
+ //# sourceMappingURL=syntax-highlight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syntax-highlight.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/utils/syntax-highlight.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyCH;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAYnF"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Syntax highlighting for HTTP body content using cli-highlight.
3
+ *
4
+ * Maps content-type shorthands (as produced by shortContentType) to
5
+ * highlight.js language identifiers, then applies terminal ANSI colouring.
6
+ */
7
+ import { highlight, supportsLanguage } from "cli-highlight";
8
+ import { shortContentType } from "./formatters.js";
9
+ /**
10
+ * Mapping from shortContentType output to highlight.js language names.
11
+ * Only content types that have a meaningful syntax to highlight are included.
12
+ */
13
+ const CONTENT_TYPE_TO_LANGUAGE = {
14
+ json: "json",
15
+ xml: "xml",
16
+ html: "html",
17
+ javascript: "javascript",
18
+ css: "css",
19
+ // Less common but still useful mappings
20
+ "xhtml+xml": "xml",
21
+ "svg+xml": "xml",
22
+ "rss+xml": "xml",
23
+ "atom+xml": "xml",
24
+ "mathml+xml": "xml",
25
+ "x-javascript": "javascript",
26
+ ecmascript: "javascript",
27
+ };
28
+ /**
29
+ * Resolve a raw content-type header value to a highlight.js language name.
30
+ * Returns undefined when no suitable language mapping exists.
31
+ */
32
+ function resolveLanguage(contentType) {
33
+ const short = shortContentType(contentType);
34
+ if (!short)
35
+ return undefined;
36
+ const language = CONTENT_TYPE_TO_LANGUAGE[short];
37
+ if (language && supportsLanguage(language)) {
38
+ return language;
39
+ }
40
+ return undefined;
41
+ }
42
+ /**
43
+ * Apply syntax highlighting to a code string based on its content type.
44
+ *
45
+ * Returns the original string unchanged when:
46
+ * - The content type cannot be mapped to a supported language
47
+ * - The input is empty
48
+ * - highlight.js throws (e.g. on malformed input)
49
+ */
50
+ export function highlightCode(code, contentType) {
51
+ if (!code)
52
+ return code;
53
+ const language = resolveLanguage(contentType);
54
+ if (!language)
55
+ return code;
56
+ try {
57
+ return highlight(code, { language, ignoreIllegals: true });
58
+ }
59
+ catch {
60
+ // highlight.js can throw on particularly malformed input
61
+ return code;
62
+ }
63
+ }
64
+ //# sourceMappingURL=syntax-highlight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syntax-highlight.js","sourceRoot":"","sources":["../../../../src/cli/tui/utils/syntax-highlight.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD;;;GAGG;AACH,MAAM,wBAAwB,GAA2B;IACvD,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,YAAY;IACxB,GAAG,EAAE,KAAK;IACV,wCAAwC;IACxC,WAAW,EAAE,KAAK;IAClB,SAAS,EAAE,KAAK;IAChB,SAAS,EAAE,KAAK;IAChB,UAAU,EAAE,KAAK;IACjB,YAAY,EAAE,KAAK;IACnB,cAAc,EAAE,YAAY;IAC5B,UAAU,EAAE,YAAY;CACzB,CAAC;AAEF;;;GAGG;AACH,SAAS,eAAe,CAAC,WAA+B;IACtD,MAAM,KAAK,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAE7B,MAAM,QAAQ,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,QAAQ,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,WAA+B;IACzE,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAC9C,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,yDAAyD;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { RequestRepository } from "./storage.js";
2
+ import type { InterceptorLoader } from "./interceptor-loader.js";
3
+ import { type LogLevel } from "../shared/logger.js";
4
+ export { ControlClient } from "../shared/control-client.js";
5
+ export interface ControlServerOptions {
6
+ socketPath: string;
7
+ storage: RequestRepository;
8
+ proxyPort: number;
9
+ version: string;
10
+ projectRoot?: string;
11
+ logLevel?: LogLevel;
12
+ interceptorLoader?: InterceptorLoader;
13
+ }
14
+ export interface ControlServer {
15
+ close: () => Promise<void>;
16
+ }
17
+ /**
18
+ * Create a Unix socket control server for daemon communication.
19
+ */
20
+ export declare function createControlServer(options: ControlServerOptions): ControlServer;
21
+ //# sourceMappingURL=control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../src/daemon/control.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAejE,OAAO,EAAgB,KAAK,QAAQ,EAAe,MAAM,qBAAqB,CAAC;AAE/E,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAwHD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAkOhF"}