@ncukondo/search-hub 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/dist/_virtual/___vite-browser-external.js +7 -0
  4. package/dist/_virtual/___vite-browser-external.js.map +1 -0
  5. package/dist/_virtual/__vite-browser-external.js +5 -0
  6. package/dist/_virtual/__vite-browser-external.js.map +1 -0
  7. package/dist/_virtual/_commonjsHelpers.js +28 -0
  8. package/dist/_virtual/_commonjsHelpers.js.map +1 -0
  9. package/dist/_virtual/cli-progress.js +6 -0
  10. package/dist/_virtual/cli-progress.js.map +1 -0
  11. package/dist/_virtual/index.js +5 -0
  12. package/dist/_virtual/index.js.map +1 -0
  13. package/dist/_virtual/index2.js +5 -0
  14. package/dist/_virtual/index2.js.map +1 -0
  15. package/dist/cli/commands/config.d.ts +37 -0
  16. package/dist/cli/commands/config.d.ts.map +1 -0
  17. package/dist/cli/commands/config.js +117 -0
  18. package/dist/cli/commands/config.js.map +1 -0
  19. package/dist/cli/commands/export.d.ts +26 -0
  20. package/dist/cli/commands/export.d.ts.map +1 -0
  21. package/dist/cli/commands/export.js +86 -0
  22. package/dist/cli/commands/export.js.map +1 -0
  23. package/dist/cli/commands/init.d.ts +45 -0
  24. package/dist/cli/commands/init.d.ts.map +1 -0
  25. package/dist/cli/commands/init.js +134 -0
  26. package/dist/cli/commands/init.js.map +1 -0
  27. package/dist/cli/commands/query/translate.d.ts +32 -0
  28. package/dist/cli/commands/query/translate.d.ts.map +1 -0
  29. package/dist/cli/commands/query/translate.js +76 -0
  30. package/dist/cli/commands/query/translate.js.map +1 -0
  31. package/dist/cli/commands/query/validate.d.ts +25 -0
  32. package/dist/cli/commands/query/validate.d.ts.map +1 -0
  33. package/dist/cli/commands/query/validate.js +68 -0
  34. package/dist/cli/commands/query/validate.js.map +1 -0
  35. package/dist/cli/commands/register.d.ts +39 -0
  36. package/dist/cli/commands/register.d.ts.map +1 -0
  37. package/dist/cli/commands/register.js +78 -0
  38. package/dist/cli/commands/register.js.map +1 -0
  39. package/dist/cli/commands/resume-executor.d.ts +19 -0
  40. package/dist/cli/commands/resume-executor.d.ts.map +1 -0
  41. package/dist/cli/commands/resume-executor.js +170 -0
  42. package/dist/cli/commands/resume-executor.js.map +1 -0
  43. package/dist/cli/commands/resume.d.ts +26 -0
  44. package/dist/cli/commands/resume.d.ts.map +1 -0
  45. package/dist/cli/commands/resume.js +51 -0
  46. package/dist/cli/commands/resume.js.map +1 -0
  47. package/dist/cli/commands/search-executor.d.ts +26 -0
  48. package/dist/cli/commands/search-executor.d.ts.map +1 -0
  49. package/dist/cli/commands/search-executor.js +315 -0
  50. package/dist/cli/commands/search-executor.js.map +1 -0
  51. package/dist/cli/commands/search.d.ts +30 -0
  52. package/dist/cli/commands/search.d.ts.map +1 -0
  53. package/dist/cli/commands/search.js +67 -0
  54. package/dist/cli/commands/search.js.map +1 -0
  55. package/dist/cli/commands/status.d.ts +41 -0
  56. package/dist/cli/commands/status.d.ts.map +1 -0
  57. package/dist/cli/commands/status.js +123 -0
  58. package/dist/cli/commands/status.js.map +1 -0
  59. package/dist/cli/e2e-helpers.d.ts +165 -0
  60. package/dist/cli/e2e-helpers.d.ts.map +1 -0
  61. package/dist/cli/exit-codes.d.ts +25 -0
  62. package/dist/cli/exit-codes.d.ts.map +1 -0
  63. package/dist/cli/exit-codes.js +18 -0
  64. package/dist/cli/exit-codes.js.map +1 -0
  65. package/dist/cli/index.d.ts +25 -0
  66. package/dist/cli/index.d.ts.map +1 -0
  67. package/dist/cli/index.js +638 -0
  68. package/dist/cli/index.js.map +1 -0
  69. package/dist/cli/utils/progress.d.ts +24 -0
  70. package/dist/cli/utils/progress.d.ts.map +1 -0
  71. package/dist/cli/utils/progress.js +128 -0
  72. package/dist/cli/utils/progress.js.map +1 -0
  73. package/dist/cli/utils/sessions-dir.d.ts +14 -0
  74. package/dist/cli/utils/sessions-dir.d.ts.map +1 -0
  75. package/dist/cli/utils/sessions-dir.js +21 -0
  76. package/dist/cli/utils/sessions-dir.js.map +1 -0
  77. package/dist/cli/utils/validation.d.ts +18 -0
  78. package/dist/cli/utils/validation.d.ts.map +1 -0
  79. package/dist/cli/utils/validation.js +24 -0
  80. package/dist/cli/utils/validation.js.map +1 -0
  81. package/dist/config/defaults.d.ts +12 -0
  82. package/dist/config/defaults.d.ts.map +1 -0
  83. package/dist/config/defaults.js +10 -0
  84. package/dist/config/defaults.js.map +1 -0
  85. package/dist/config/env.d.ts +12 -0
  86. package/dist/config/env.d.ts.map +1 -0
  87. package/dist/config/env.js +36 -0
  88. package/dist/config/env.js.map +1 -0
  89. package/dist/config/index.d.ts +9 -0
  90. package/dist/config/index.d.ts.map +1 -0
  91. package/dist/config/loader.d.ts +49 -0
  92. package/dist/config/loader.d.ts.map +1 -0
  93. package/dist/config/loader.js +72 -0
  94. package/dist/config/loader.js.map +1 -0
  95. package/dist/config/paths.d.ts +23 -0
  96. package/dist/config/paths.d.ts.map +1 -0
  97. package/dist/config/paths.js +22 -0
  98. package/dist/config/paths.js.map +1 -0
  99. package/dist/config/schema.d.ts +109 -0
  100. package/dist/config/schema.d.ts.map +1 -0
  101. package/dist/config/schema.js +74 -0
  102. package/dist/config/schema.js.map +1 -0
  103. package/dist/index.d.ts +11 -0
  104. package/dist/index.d.ts.map +1 -0
  105. package/dist/index.js +54 -0
  106. package/dist/index.js.map +1 -0
  107. package/dist/integration/ref-cli.d.ts +41 -0
  108. package/dist/integration/ref-cli.d.ts.map +1 -0
  109. package/dist/integration/ref-cli.js +132 -0
  110. package/dist/integration/ref-cli.js.map +1 -0
  111. package/dist/integration/register.d.ts +27 -0
  112. package/dist/integration/register.d.ts.map +1 -0
  113. package/dist/integration/register.js +108 -0
  114. package/dist/integration/register.js.map +1 -0
  115. package/dist/integration/types.d.ts +61 -0
  116. package/dist/integration/types.d.ts.map +1 -0
  117. package/dist/integration/types.js +61 -0
  118. package/dist/integration/types.js.map +1 -0
  119. package/dist/node_modules/cli-progress/cli-progress.js +37 -0
  120. package/dist/node_modules/cli-progress/cli-progress.js.map +1 -0
  121. package/dist/node_modules/cli-progress/lib/eta.js +52 -0
  122. package/dist/node_modules/cli-progress/lib/eta.js.map +1 -0
  123. package/dist/node_modules/cli-progress/lib/format-bar.js +16 -0
  124. package/dist/node_modules/cli-progress/lib/format-bar.js.map +1 -0
  125. package/dist/node_modules/cli-progress/lib/format-time.js +32 -0
  126. package/dist/node_modules/cli-progress/lib/format-time.js.map +1 -0
  127. package/dist/node_modules/cli-progress/lib/format-value.js +25 -0
  128. package/dist/node_modules/cli-progress/lib/format-value.js.map +1 -0
  129. package/dist/node_modules/cli-progress/lib/formatter.js +57 -0
  130. package/dist/node_modules/cli-progress/lib/formatter.js.map +1 -0
  131. package/dist/node_modules/cli-progress/lib/generic-bar.js +137 -0
  132. package/dist/node_modules/cli-progress/lib/generic-bar.js.map +1 -0
  133. package/dist/node_modules/cli-progress/lib/multi-bar.js +147 -0
  134. package/dist/node_modules/cli-progress/lib/multi-bar.js.map +1 -0
  135. package/dist/node_modules/cli-progress/lib/options.js +59 -0
  136. package/dist/node_modules/cli-progress/lib/options.js.map +1 -0
  137. package/dist/node_modules/cli-progress/lib/single-bar.js +95 -0
  138. package/dist/node_modules/cli-progress/lib/single-bar.js.map +1 -0
  139. package/dist/node_modules/cli-progress/lib/terminal.js +125 -0
  140. package/dist/node_modules/cli-progress/lib/terminal.js.map +1 -0
  141. package/dist/node_modules/cli-progress/node_modules/ansi-regex/index.js +18 -0
  142. package/dist/node_modules/cli-progress/node_modules/ansi-regex/index.js.map +1 -0
  143. package/dist/node_modules/cli-progress/node_modules/emoji-regex/index.js +14 -0
  144. package/dist/node_modules/cli-progress/node_modules/emoji-regex/index.js.map +1 -0
  145. package/dist/node_modules/cli-progress/node_modules/string-width/index.js +44 -0
  146. package/dist/node_modules/cli-progress/node_modules/string-width/index.js.map +1 -0
  147. package/dist/node_modules/cli-progress/node_modules/strip-ansi/index.js +14 -0
  148. package/dist/node_modules/cli-progress/node_modules/strip-ansi/index.js.map +1 -0
  149. package/dist/node_modules/cli-progress/presets/index.js +25 -0
  150. package/dist/node_modules/cli-progress/presets/index.js.map +1 -0
  151. package/dist/node_modules/cli-progress/presets/legacy.js +16 -0
  152. package/dist/node_modules/cli-progress/presets/legacy.js.map +1 -0
  153. package/dist/node_modules/cli-progress/presets/rect.js +16 -0
  154. package/dist/node_modules/cli-progress/presets/rect.js.map +1 -0
  155. package/dist/node_modules/cli-progress/presets/shades-classic.js +16 -0
  156. package/dist/node_modules/cli-progress/presets/shades-classic.js.map +1 -0
  157. package/dist/node_modules/cli-progress/presets/shades-grey.js +16 -0
  158. package/dist/node_modules/cli-progress/presets/shades-grey.js.map +1 -0
  159. package/dist/node_modules/env-paths/index.js +58 -0
  160. package/dist/node_modules/env-paths/index.js.map +1 -0
  161. package/dist/node_modules/fast-xml-parser/src/ignoreAttributes.js +22 -0
  162. package/dist/node_modules/fast-xml-parser/src/ignoreAttributes.js.map +1 -0
  163. package/dist/node_modules/fast-xml-parser/src/util.js +33 -0
  164. package/dist/node_modules/fast-xml-parser/src/util.js.map +1 -0
  165. package/dist/node_modules/fast-xml-parser/src/validator.js +309 -0
  166. package/dist/node_modules/fast-xml-parser/src/validator.js.map +1 -0
  167. package/dist/node_modules/fast-xml-parser/src/xmlparser/DocTypeReader.js +265 -0
  168. package/dist/node_modules/fast-xml-parser/src/xmlparser/DocTypeReader.js.map +1 -0
  169. package/dist/node_modules/fast-xml-parser/src/xmlparser/OptionsBuilder.js +53 -0
  170. package/dist/node_modules/fast-xml-parser/src/xmlparser/OptionsBuilder.js.map +1 -0
  171. package/dist/node_modules/fast-xml-parser/src/xmlparser/OrderedObjParser.js +515 -0
  172. package/dist/node_modules/fast-xml-parser/src/xmlparser/OrderedObjParser.js.map +1 -0
  173. package/dist/node_modules/fast-xml-parser/src/xmlparser/XMLParser.js +68 -0
  174. package/dist/node_modules/fast-xml-parser/src/xmlparser/XMLParser.js.map +1 -0
  175. package/dist/node_modules/fast-xml-parser/src/xmlparser/node2json.js +88 -0
  176. package/dist/node_modules/fast-xml-parser/src/xmlparser/node2json.js.map +1 -0
  177. package/dist/node_modules/fast-xml-parser/src/xmlparser/xmlNode.js +36 -0
  178. package/dist/node_modules/fast-xml-parser/src/xmlparser/xmlNode.js.map +1 -0
  179. package/dist/node_modules/is-fullwidth-code-point/index.js +37 -0
  180. package/dist/node_modules/is-fullwidth-code-point/index.js.map +1 -0
  181. package/dist/node_modules/strnum/strnum.js +100 -0
  182. package/dist/node_modules/strnum/strnum.js.map +1 -0
  183. package/dist/providers/arxiv/client.d.ts +54 -0
  184. package/dist/providers/arxiv/client.d.ts.map +1 -0
  185. package/dist/providers/arxiv/client.js +105 -0
  186. package/dist/providers/arxiv/client.js.map +1 -0
  187. package/dist/providers/arxiv/index.d.ts +14 -0
  188. package/dist/providers/arxiv/index.d.ts.map +1 -0
  189. package/dist/providers/arxiv/parser.d.ts +16 -0
  190. package/dist/providers/arxiv/parser.d.ts.map +1 -0
  191. package/dist/providers/arxiv/parser.js +144 -0
  192. package/dist/providers/arxiv/parser.js.map +1 -0
  193. package/dist/providers/arxiv/provider.d.ts +39 -0
  194. package/dist/providers/arxiv/provider.d.ts.map +1 -0
  195. package/dist/providers/arxiv/provider.js +153 -0
  196. package/dist/providers/arxiv/provider.js.map +1 -0
  197. package/dist/providers/arxiv/translator.d.ts +17 -0
  198. package/dist/providers/arxiv/translator.d.ts.map +1 -0
  199. package/dist/providers/arxiv/translator.js +112 -0
  200. package/dist/providers/arxiv/translator.js.map +1 -0
  201. package/dist/providers/arxiv/types.d.ts +71 -0
  202. package/dist/providers/arxiv/types.d.ts.map +1 -0
  203. package/dist/providers/arxiv/types.js +17 -0
  204. package/dist/providers/arxiv/types.js.map +1 -0
  205. package/dist/providers/base/index.d.ts +16 -0
  206. package/dist/providers/base/index.d.ts.map +1 -0
  207. package/dist/providers/base/mock-provider.d.ts +76 -0
  208. package/dist/providers/base/mock-provider.d.ts.map +1 -0
  209. package/dist/providers/base/mock-provider.js +159 -0
  210. package/dist/providers/base/mock-provider.js.map +1 -0
  211. package/dist/providers/base/provider.d.ts +95 -0
  212. package/dist/providers/base/provider.d.ts.map +1 -0
  213. package/dist/providers/base/provider.js +117 -0
  214. package/dist/providers/base/provider.js.map +1 -0
  215. package/dist/providers/base/rate-limiter.d.ts +70 -0
  216. package/dist/providers/base/rate-limiter.d.ts.map +1 -0
  217. package/dist/providers/base/rate-limiter.js +111 -0
  218. package/dist/providers/base/rate-limiter.js.map +1 -0
  219. package/dist/providers/base/registry.d.ts +52 -0
  220. package/dist/providers/base/registry.d.ts.map +1 -0
  221. package/dist/providers/base/registry.js +55 -0
  222. package/dist/providers/base/registry.js.map +1 -0
  223. package/dist/providers/base/types.d.ts +163 -0
  224. package/dist/providers/base/types.d.ts.map +1 -0
  225. package/dist/providers/base/types.js +29 -0
  226. package/dist/providers/base/types.js.map +1 -0
  227. package/dist/providers/eric/client.d.ts +40 -0
  228. package/dist/providers/eric/client.d.ts.map +1 -0
  229. package/dist/providers/eric/client.js +93 -0
  230. package/dist/providers/eric/client.js.map +1 -0
  231. package/dist/providers/eric/index.d.ts +14 -0
  232. package/dist/providers/eric/index.d.ts.map +1 -0
  233. package/dist/providers/eric/parser.d.ts +21 -0
  234. package/dist/providers/eric/parser.d.ts.map +1 -0
  235. package/dist/providers/eric/parser.js +86 -0
  236. package/dist/providers/eric/parser.js.map +1 -0
  237. package/dist/providers/eric/provider.d.ts +59 -0
  238. package/dist/providers/eric/provider.d.ts.map +1 -0
  239. package/dist/providers/eric/provider.js +166 -0
  240. package/dist/providers/eric/provider.js.map +1 -0
  241. package/dist/providers/eric/translator.d.ts +12 -0
  242. package/dist/providers/eric/translator.d.ts.map +1 -0
  243. package/dist/providers/eric/translator.js +81 -0
  244. package/dist/providers/eric/translator.js.map +1 -0
  245. package/dist/providers/eric/types.d.ts +84 -0
  246. package/dist/providers/eric/types.d.ts.map +1 -0
  247. package/dist/providers/pubmed/client.d.ts +54 -0
  248. package/dist/providers/pubmed/client.d.ts.map +1 -0
  249. package/dist/providers/pubmed/client.js +141 -0
  250. package/dist/providers/pubmed/client.js.map +1 -0
  251. package/dist/providers/pubmed/index.d.ts +27 -0
  252. package/dist/providers/pubmed/index.d.ts.map +1 -0
  253. package/dist/providers/pubmed/parser.d.ts +22 -0
  254. package/dist/providers/pubmed/parser.d.ts.map +1 -0
  255. package/dist/providers/pubmed/parser.js +174 -0
  256. package/dist/providers/pubmed/parser.js.map +1 -0
  257. package/dist/providers/pubmed/provider.d.ts +44 -0
  258. package/dist/providers/pubmed/provider.d.ts.map +1 -0
  259. package/dist/providers/pubmed/provider.js +224 -0
  260. package/dist/providers/pubmed/provider.js.map +1 -0
  261. package/dist/providers/pubmed/translator.d.ts +7 -0
  262. package/dist/providers/pubmed/translator.d.ts.map +1 -0
  263. package/dist/providers/pubmed/translator.js +143 -0
  264. package/dist/providers/pubmed/translator.js.map +1 -0
  265. package/dist/providers/pubmed/types.d.ts +72 -0
  266. package/dist/providers/pubmed/types.d.ts.map +1 -0
  267. package/dist/providers/scopus/client.d.ts +64 -0
  268. package/dist/providers/scopus/client.d.ts.map +1 -0
  269. package/dist/providers/scopus/client.js +155 -0
  270. package/dist/providers/scopus/client.js.map +1 -0
  271. package/dist/providers/scopus/index.d.ts +21 -0
  272. package/dist/providers/scopus/index.d.ts.map +1 -0
  273. package/dist/providers/scopus/parser.d.ts +11 -0
  274. package/dist/providers/scopus/parser.d.ts.map +1 -0
  275. package/dist/providers/scopus/parser.js +128 -0
  276. package/dist/providers/scopus/parser.js.map +1 -0
  277. package/dist/providers/scopus/provider.d.ts +39 -0
  278. package/dist/providers/scopus/provider.d.ts.map +1 -0
  279. package/dist/providers/scopus/provider.js +175 -0
  280. package/dist/providers/scopus/provider.js.map +1 -0
  281. package/dist/providers/scopus/translator.d.ts +7 -0
  282. package/dist/providers/scopus/translator.d.ts.map +1 -0
  283. package/dist/providers/scopus/translator.js +83 -0
  284. package/dist/providers/scopus/translator.js.map +1 -0
  285. package/dist/providers/scopus/types.d.ts +86 -0
  286. package/dist/providers/scopus/types.d.ts.map +1 -0
  287. package/dist/query/index.d.ts +12 -0
  288. package/dist/query/index.d.ts.map +1 -0
  289. package/dist/query/parser.d.ts +18 -0
  290. package/dist/query/parser.d.ts.map +1 -0
  291. package/dist/query/parser.js +16 -0
  292. package/dist/query/parser.js.map +1 -0
  293. package/dist/query/types.d.ts +85 -0
  294. package/dist/query/types.d.ts.map +1 -0
  295. package/dist/query/validator.d.ts +635 -0
  296. package/dist/query/validator.d.ts.map +1 -0
  297. package/dist/query/validator.js +117 -0
  298. package/dist/query/validator.js.map +1 -0
  299. package/dist/session/index.d.ts +14 -0
  300. package/dist/session/index.d.ts.map +1 -0
  301. package/dist/session/logger.d.ts +15 -0
  302. package/dist/session/logger.d.ts.map +1 -0
  303. package/dist/session/logger.js +18 -0
  304. package/dist/session/logger.js.map +1 -0
  305. package/dist/session/manager.d.ts +63 -0
  306. package/dist/session/manager.d.ts.map +1 -0
  307. package/dist/session/manager.js +193 -0
  308. package/dist/session/manager.js.map +1 -0
  309. package/dist/session/types.d.ts +182 -0
  310. package/dist/session/types.d.ts.map +1 -0
  311. package/dist/utils/deep-merge.d.ts +17 -0
  312. package/dist/utils/deep-merge.d.ts.map +1 -0
  313. package/dist/utils/deep-merge.js +23 -0
  314. package/dist/utils/deep-merge.js.map +1 -0
  315. package/dist/utils/path.d.ts +9 -0
  316. package/dist/utils/path.d.ts.map +1 -0
  317. package/dist/utils/path.js +15 -0
  318. package/dist/utils/path.js.map +1 -0
  319. package/package.json +82 -0
@@ -0,0 +1,134 @@
1
+ import { mkdir, writeFile, access, constants } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { stringify } from "@iarna/toml";
4
+ import "../../config/schema.js";
5
+ import { getDefaultConfig } from "../../config/defaults.js";
6
+ import { getConfigDir, getDataDir } from "../../config/paths.js";
7
+ import "node:os";
8
+ async function exists(path) {
9
+ try {
10
+ await access(path, constants.F_OK);
11
+ return true;
12
+ } catch {
13
+ return false;
14
+ }
15
+ }
16
+ function configToToml(config) {
17
+ return {
18
+ session: {
19
+ directory: config.session.directory
20
+ },
21
+ log: {
22
+ level: config.log.level
23
+ },
24
+ output: {
25
+ color: config.output.color,
26
+ progress_bar: config.output.progress_bar
27
+ },
28
+ providers: {
29
+ pubmed: {
30
+ enabled: config.providers.pubmed.enabled,
31
+ api_key: config.providers.pubmed.api_key ?? "",
32
+ email: config.providers.pubmed.email ?? "",
33
+ rate_limit: config.providers.pubmed.rate_limit,
34
+ timeout: config.providers.pubmed.timeout,
35
+ retries: config.providers.pubmed.retries,
36
+ max_results: config.providers.pubmed.max_results
37
+ },
38
+ eric: {
39
+ enabled: config.providers.eric.enabled,
40
+ rate_limit: config.providers.eric.rate_limit,
41
+ timeout: config.providers.eric.timeout,
42
+ retries: config.providers.eric.retries,
43
+ max_results: config.providers.eric.max_results
44
+ },
45
+ arxiv: {
46
+ enabled: config.providers.arxiv.enabled,
47
+ rate_limit: config.providers.arxiv.rate_limit,
48
+ timeout: config.providers.arxiv.timeout,
49
+ retries: config.providers.arxiv.retries,
50
+ max_results: config.providers.arxiv.max_results
51
+ },
52
+ scopus: {
53
+ enabled: config.providers.scopus.enabled,
54
+ api_key: config.providers.scopus.api_key ?? "",
55
+ inst_token: config.providers.scopus.inst_token ?? "",
56
+ rate_limit: config.providers.scopus.rate_limit,
57
+ timeout: config.providers.scopus.timeout,
58
+ retries: config.providers.scopus.retries,
59
+ max_results: config.providers.scopus.max_results
60
+ },
61
+ wos: {
62
+ enabled: config.providers.wos.enabled,
63
+ api_key: config.providers.wos.api_key ?? "",
64
+ rate_limit: config.providers.wos.rate_limit,
65
+ timeout: config.providers.wos.timeout,
66
+ retries: config.providers.wos.retries,
67
+ max_results: config.providers.wos.max_results
68
+ },
69
+ embase: {
70
+ enabled: config.providers.embase.enabled,
71
+ rate_limit: config.providers.embase.rate_limit,
72
+ timeout: config.providers.embase.timeout,
73
+ retries: config.providers.embase.retries,
74
+ max_results: config.providers.embase.max_results
75
+ }
76
+ },
77
+ integration: {
78
+ reference_manager: {
79
+ enabled: config.integration.reference_manager.enabled,
80
+ command: config.integration.reference_manager.command,
81
+ auto_register: config.integration.reference_manager.auto_register
82
+ }
83
+ }
84
+ };
85
+ }
86
+ function generateConfigContent(config) {
87
+ const tomlObj = configToToml(config);
88
+ const header = `# search-hub configuration file
89
+ # See: https://github.com/search-hub/search-hub for documentation
90
+
91
+ `;
92
+ return header + stringify(tomlObj);
93
+ }
94
+ async function init(options = {}) {
95
+ const {
96
+ configDir = getConfigDir(),
97
+ dataDir = getDataDir(),
98
+ force = false
99
+ } = options;
100
+ const configPath = join(configDir, "config.toml");
101
+ const sessionsDir = join(dataDir, "sessions");
102
+ const result = {
103
+ success: false,
104
+ configPath,
105
+ sessionsDir,
106
+ configDir,
107
+ dataDir
108
+ };
109
+ if (await exists(configDir)) {
110
+ if (!force) {
111
+ return {
112
+ ...result,
113
+ alreadyExists: true,
114
+ message: `Configuration directory already exists at ${configDir}. Use --force to overwrite.`
115
+ };
116
+ }
117
+ result.overwritten = true;
118
+ }
119
+ await mkdir(configDir, { recursive: true });
120
+ await mkdir(sessionsDir, { recursive: true });
121
+ const defaultConfig = getDefaultConfig();
122
+ defaultConfig.session.directory = sessionsDir;
123
+ const configContent = generateConfigContent(defaultConfig);
124
+ await writeFile(configPath, configContent, "utf-8");
125
+ return {
126
+ ...result,
127
+ success: true,
128
+ message: result.overwritten ? `Configuration overwritten at ${configDir}` : `Configuration created at ${configDir}`
129
+ };
130
+ }
131
+ export {
132
+ init
133
+ };
134
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sources":["../../../src/cli/commands/init.ts"],"sourcesContent":["import { mkdir, writeFile, access, constants } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { stringify as stringifyToml } from '@iarna/toml';\nimport { getDefaultConfig } from '../../config/index.js';\nimport { getConfigDir, getDataDir } from '../../config/paths.js';\nimport type { Config } from '../../config/index.js';\n\n/**\n * Options for the init command.\n */\nexport interface InitOptions {\n /** Config directory (defaults to platform-specific via getConfigDir()) */\n configDir?: string;\n /** Data directory (defaults to platform-specific via getDataDir()) */\n dataDir?: string;\n /** Force overwrite if directory already exists */\n force?: boolean;\n}\n\n/**\n * Result of the init command.\n */\nexport interface InitResult {\n /** Whether initialization was successful */\n success: boolean;\n /** Path to the created config file */\n configPath: string;\n /** Path to the sessions directory */\n sessionsDir: string;\n /** Path to the config directory */\n configDir: string;\n /** Path to the data directory */\n dataDir: string;\n /** Whether files already existed (only when success=false) */\n alreadyExists?: boolean;\n /** Whether existing files were overwritten (only when force=true) */\n overwritten?: boolean;\n /** Message describing the result */\n message?: string;\n}\n\n/**\n * Check if a file or directory exists.\n */\nasync function exists(path: string): Promise<boolean> {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Convert Config to TOML-compatible object.\n * Removes undefined values and converts to the expected format.\n */\nfunction configToToml(config: Config): Record<string, unknown> {\n return {\n session: {\n directory: config.session.directory,\n },\n log: {\n level: config.log.level,\n },\n output: {\n color: config.output.color,\n progress_bar: config.output.progress_bar,\n },\n providers: {\n pubmed: {\n enabled: config.providers.pubmed.enabled,\n api_key: config.providers.pubmed.api_key ?? '',\n email: config.providers.pubmed.email ?? '',\n rate_limit: config.providers.pubmed.rate_limit,\n timeout: config.providers.pubmed.timeout,\n retries: config.providers.pubmed.retries,\n max_results: config.providers.pubmed.max_results,\n },\n eric: {\n enabled: config.providers.eric.enabled,\n rate_limit: config.providers.eric.rate_limit,\n timeout: config.providers.eric.timeout,\n retries: config.providers.eric.retries,\n max_results: config.providers.eric.max_results,\n },\n arxiv: {\n enabled: config.providers.arxiv.enabled,\n rate_limit: config.providers.arxiv.rate_limit,\n timeout: config.providers.arxiv.timeout,\n retries: config.providers.arxiv.retries,\n max_results: config.providers.arxiv.max_results,\n },\n scopus: {\n enabled: config.providers.scopus.enabled,\n api_key: config.providers.scopus.api_key ?? '',\n inst_token: config.providers.scopus.inst_token ?? '',\n rate_limit: config.providers.scopus.rate_limit,\n timeout: config.providers.scopus.timeout,\n retries: config.providers.scopus.retries,\n max_results: config.providers.scopus.max_results,\n },\n wos: {\n enabled: config.providers.wos.enabled,\n api_key: config.providers.wos.api_key ?? '',\n rate_limit: config.providers.wos.rate_limit,\n timeout: config.providers.wos.timeout,\n retries: config.providers.wos.retries,\n max_results: config.providers.wos.max_results,\n },\n embase: {\n enabled: config.providers.embase.enabled,\n rate_limit: config.providers.embase.rate_limit,\n timeout: config.providers.embase.timeout,\n retries: config.providers.embase.retries,\n max_results: config.providers.embase.max_results,\n },\n },\n integration: {\n reference_manager: {\n enabled: config.integration.reference_manager.enabled,\n command: config.integration.reference_manager.command,\n auto_register: config.integration.reference_manager.auto_register,\n },\n },\n };\n}\n\n/**\n * Generate TOML config file content with comments.\n */\nfunction generateConfigContent(config: Config): string {\n const tomlObj = configToToml(config);\n const header = `# search-hub configuration file\n# See: https://github.com/search-hub/search-hub for documentation\n\n`;\n return header + stringifyToml(tomlObj as Parameters<typeof stringifyToml>[0]);\n}\n\n/**\n * Initialize the search-hub configuration directory.\n *\n * Creates:\n * - Config directory with config.toml\n * - Data directory with sessions/ subdirectory\n *\n * On Linux (XDG):\n * - ~/.config/search-hub/config.toml\n * - ~/.local/share/search-hub/sessions/\n */\nexport async function init(options: InitOptions = {}): Promise<InitResult> {\n const {\n configDir = getConfigDir(),\n dataDir = getDataDir(),\n force = false,\n } = options;\n\n const configPath = join(configDir, 'config.toml');\n const sessionsDir = join(dataDir, 'sessions');\n\n const result: InitResult = {\n success: false,\n configPath,\n sessionsDir,\n configDir,\n dataDir,\n };\n\n // Check if config directory already exists\n if (await exists(configDir)) {\n if (!force) {\n return {\n ...result,\n alreadyExists: true,\n message: `Configuration directory already exists at ${configDir}. Use --force to overwrite.`,\n };\n }\n result.overwritten = true;\n }\n\n // Create directories\n await mkdir(configDir, { recursive: true });\n await mkdir(sessionsDir, { recursive: true });\n\n // Generate and write config file\n // Use the default sessions directory for the saved config\n const defaultConfig = getDefaultConfig();\n // Set session.directory to the actual sessions path for the config file\n defaultConfig.session.directory = sessionsDir;\n const configContent = generateConfigContent(defaultConfig);\n await writeFile(configPath, configContent, 'utf-8');\n\n return {\n ...result,\n success: true,\n message: result.overwritten\n ? `Configuration overwritten at ${configDir}`\n : `Configuration created at ${configDir}`,\n };\n}\n"],"names":["stringifyToml"],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { TranslatedQuery, ProviderName } from '../../../providers/base/types.js';
2
+ /**
3
+ * Options for translate command.
4
+ */
5
+ export interface TranslateOptions {
6
+ /** Specific providers to translate for */
7
+ providers?: ProviderName[];
8
+ }
9
+ /**
10
+ * Result of query translation.
11
+ */
12
+ export interface TranslateResult {
13
+ /** Whether translation succeeded */
14
+ success: boolean;
15
+ /** Error message if failed */
16
+ error?: string;
17
+ /** Translations by provider name */
18
+ translations?: Record<string, TranslatedQuery>;
19
+ }
20
+ /**
21
+ * Translate a query YAML file to native syntax for each provider.
22
+ *
23
+ * @param filePath - Path to the query file
24
+ * @param options - Translation options
25
+ * @returns Translation result
26
+ */
27
+ export declare function translateQueryCommand(filePath: string, options?: TranslateOptions): Promise<TranslateResult>;
28
+ /**
29
+ * Format translation result for display.
30
+ */
31
+ export declare function formatTranslateResult(result: TranslateResult, filePath: string): string;
32
+ //# sourceMappingURL=translate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translate.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/query/translate.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAwBtF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0CAA0C;IAC1C,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAChD;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAuD1B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,MAAM,GACf,MAAM,CAgBR"}
@@ -0,0 +1,76 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { parseQueryString } from "../../../query/parser.js";
3
+ import "../../../query/validator.js";
4
+ import { translateQuery as translateQuery$3 } from "../../../providers/pubmed/translator.js";
5
+ import { translateQuery as translateQuery$2 } from "../../../providers/eric/translator.js";
6
+ import { translateQuery as translateQuery$1 } from "../../../providers/arxiv/translator.js";
7
+ import { translateQuery } from "../../../providers/scopus/translator.js";
8
+ const translators = {
9
+ pubmed: translateQuery$3,
10
+ eric: translateQuery$2,
11
+ arxiv: translateQuery$1,
12
+ scopus: translateQuery
13
+ };
14
+ const DEFAULT_PROVIDERS = ["pubmed", "eric", "arxiv", "scopus"];
15
+ async function translateQueryCommand(filePath, options = {}) {
16
+ let content;
17
+ try {
18
+ content = await readFile(filePath, "utf-8");
19
+ } catch (error) {
20
+ const message = error instanceof Error ? error.message : "Failed to read file";
21
+ return {
22
+ success: false,
23
+ error: message
24
+ };
25
+ }
26
+ let ast;
27
+ try {
28
+ ast = parseQueryString(content);
29
+ } catch (error) {
30
+ const message = error instanceof Error ? error.message : "Failed to parse query file";
31
+ return {
32
+ success: false,
33
+ error: message
34
+ };
35
+ }
36
+ const providers = options.providers ?? DEFAULT_PROVIDERS;
37
+ const translations = {};
38
+ for (const provider of providers) {
39
+ const translator = translators[provider];
40
+ if (translator) {
41
+ try {
42
+ translations[provider] = translator(ast);
43
+ } catch (error) {
44
+ const message = error instanceof Error ? error.message : `Failed to translate for ${provider}`;
45
+ return {
46
+ success: false,
47
+ error: `${provider}: ${message}`
48
+ };
49
+ }
50
+ }
51
+ }
52
+ return {
53
+ success: true,
54
+ translations
55
+ };
56
+ }
57
+ function formatTranslateResult(result, filePath) {
58
+ if (!result.success) {
59
+ return `✗ Failed to translate: ${filePath}
60
+ Error: ${result.error}`;
61
+ }
62
+ const lines = [`Translations for: ${filePath}`, ""];
63
+ if (result.translations) {
64
+ for (const [provider, translation] of Object.entries(result.translations)) {
65
+ lines.push(`[${provider.toUpperCase()}]`);
66
+ lines.push(translation.native);
67
+ lines.push("");
68
+ }
69
+ }
70
+ return lines.join("\n");
71
+ }
72
+ export {
73
+ formatTranslateResult,
74
+ translateQueryCommand
75
+ };
76
+ //# sourceMappingURL=translate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translate.js","sources":["../../../../src/cli/commands/query/translate.ts"],"sourcesContent":["/**\n * Query translate command implementation.\n *\n * Translates a YAML query file to native database query syntax for each provider.\n */\nimport { readFile } from 'node:fs/promises';\nimport { parseQueryString } from '../../../query/index.js';\nimport type { TranslatedQuery, ProviderName } from '../../../providers/base/types.js';\nimport { translateQuery as translatePubmed } from '../../../providers/pubmed/translator.js';\nimport { translateQuery as translateEric } from '../../../providers/eric/translator.js';\nimport { translateQuery as translateArxiv } from '../../../providers/arxiv/translator.js';\nimport { translateQuery as translateScopus } from '../../../providers/scopus/translator.js';\n\n/**\n * Available translators by provider name.\n */\nconst translators: Record<\n string,\n (ast: Parameters<typeof translatePubmed>[0]) => TranslatedQuery\n> = {\n pubmed: translatePubmed,\n eric: translateEric,\n arxiv: translateArxiv,\n scopus: translateScopus,\n};\n\n/**\n * Default providers to translate for.\n */\nconst DEFAULT_PROVIDERS: ProviderName[] = ['pubmed', 'eric', 'arxiv', 'scopus'];\n\n/**\n * Options for translate command.\n */\nexport interface TranslateOptions {\n /** Specific providers to translate for */\n providers?: ProviderName[];\n}\n\n/**\n * Result of query translation.\n */\nexport interface TranslateResult {\n /** Whether translation succeeded */\n success: boolean;\n /** Error message if failed */\n error?: string;\n /** Translations by provider name */\n translations?: Record<string, TranslatedQuery>;\n}\n\n/**\n * Translate a query YAML file to native syntax for each provider.\n *\n * @param filePath - Path to the query file\n * @param options - Translation options\n * @returns Translation result\n */\nexport async function translateQueryCommand(\n filePath: string,\n options: TranslateOptions = {}\n): Promise<TranslateResult> {\n // Read file\n let content: string;\n try {\n content = await readFile(filePath, 'utf-8');\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Failed to read file';\n return {\n success: false,\n error: message,\n };\n }\n\n // Parse and validate\n let ast;\n try {\n ast = parseQueryString(content);\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Failed to parse query file';\n return {\n success: false,\n error: message,\n };\n }\n\n // Determine which providers to translate for\n const providers = options.providers ?? DEFAULT_PROVIDERS;\n\n // Translate for each provider\n const translations: Record<string, TranslatedQuery> = {};\n\n for (const provider of providers) {\n const translator = translators[provider];\n if (translator) {\n try {\n translations[provider] = translator(ast);\n } catch (error) {\n const message =\n error instanceof Error\n ? error.message\n : `Failed to translate for ${provider}`;\n return {\n success: false,\n error: `${provider}: ${message}`,\n };\n }\n }\n }\n\n return {\n success: true,\n translations,\n };\n}\n\n/**\n * Format translation result for display.\n */\nexport function formatTranslateResult(\n result: TranslateResult,\n filePath: string\n): string {\n if (!result.success) {\n return `✗ Failed to translate: ${filePath}\\n Error: ${result.error}`;\n }\n\n const lines = [`Translations for: ${filePath}`, ''];\n\n if (result.translations) {\n for (const [provider, translation] of Object.entries(result.translations)) {\n lines.push(`[${provider.toUpperCase()}]`);\n lines.push(translation.native);\n lines.push('');\n }\n }\n\n return lines.join('\\n');\n}\n"],"names":["translatePubmed","translateEric","translateArxiv","translateScopus"],"mappings":";;;;;;;AAgBA,MAAM,cAGF;AAAA,EACF,QAAQA;AAAAA,EACR,MAAMC;AAAAA,EACN,OAAOC;AAAAA,EACP,QAAQC;AACV;AAKA,MAAM,oBAAoC,CAAC,UAAU,QAAQ,SAAS,QAAQ;AA6B9E,eAAsB,sBACpB,UACA,UAA4B,IACF;AAE1B,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,SAAS,UAAU,OAAO;AAAA,EAC5C,SAAS,OAAO;AACd,UAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,IAAA;AAAA,EAEX;AAGA,MAAI;AACJ,MAAI;AACF,UAAM,iBAAiB,OAAO;AAAA,EAChC,SAAS,OAAO;AACd,UAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,IAAA;AAAA,EAEX;AAGA,QAAM,YAAY,QAAQ,aAAa;AAGvC,QAAM,eAAgD,CAAA;AAEtD,aAAW,YAAY,WAAW;AAChC,UAAM,aAAa,YAAY,QAAQ;AACvC,QAAI,YAAY;AACd,UAAI;AACF,qBAAa,QAAQ,IAAI,WAAW,GAAG;AAAA,MACzC,SAAS,OAAO;AACd,cAAM,UACJ,iBAAiB,QACb,MAAM,UACN,2BAA2B,QAAQ;AACzC,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO,GAAG,QAAQ,KAAK,OAAO;AAAA,QAAA;AAAA,MAElC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,EAAA;AAEJ;AAKO,SAAS,sBACd,QACA,UACQ;AACR,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,0BAA0B,QAAQ;AAAA,WAAc,OAAO,KAAK;AAAA,EACrE;AAEA,QAAM,QAAQ,CAAC,qBAAqB,QAAQ,IAAI,EAAE;AAElD,MAAI,OAAO,cAAc;AACvB,eAAW,CAAC,UAAU,WAAW,KAAK,OAAO,QAAQ,OAAO,YAAY,GAAG;AACzE,YAAM,KAAK,IAAI,SAAS,YAAA,CAAa,GAAG;AACxC,YAAM,KAAK,YAAY,MAAM;AAC7B,YAAM,KAAK,EAAE;AAAA,IACf;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Result of query validation.
3
+ */
4
+ export interface ValidateResult {
5
+ /** Whether validation succeeded */
6
+ success: boolean;
7
+ /** Error messages if validation failed */
8
+ errors?: string[];
9
+ /** Query name (if valid) */
10
+ queryName?: string;
11
+ /** Number of query blocks (if valid) */
12
+ blockCount?: number;
13
+ }
14
+ /**
15
+ * Validate a query YAML file.
16
+ *
17
+ * @param filePath - Path to the query file
18
+ * @returns Validation result
19
+ */
20
+ export declare function validateQueryCommand(filePath: string): Promise<ValidateResult>;
21
+ /**
22
+ * Format validation result for display.
23
+ */
24
+ export declare function formatValidateResult(result: ValidateResult, filePath: string): string;
25
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/query/validate.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,CAAC,CAiDzB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,GACf,MAAM,CAiBR"}
@@ -0,0 +1,68 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { parseQueryString } from "../../../query/parser.js";
3
+ import { ValidationError } from "../../../query/validator.js";
4
+ import { ZodError } from "zod";
5
+ async function validateQueryCommand(filePath) {
6
+ let content;
7
+ try {
8
+ content = await readFile(filePath, "utf-8");
9
+ } catch (error) {
10
+ const message = error instanceof Error ? error.message : "Failed to read file";
11
+ return {
12
+ success: false,
13
+ errors: [message]
14
+ };
15
+ }
16
+ try {
17
+ const ast = parseQueryString(content);
18
+ return {
19
+ success: true,
20
+ queryName: ast.name,
21
+ blockCount: ast.blocks.length
22
+ };
23
+ } catch (error) {
24
+ if (error instanceof ZodError) {
25
+ const errors = error.issues.map((e) => {
26
+ const path = e.path.join(".");
27
+ return path ? `${path}: ${e.message}` : e.message;
28
+ });
29
+ return {
30
+ success: false,
31
+ errors
32
+ };
33
+ }
34
+ if (error instanceof ValidationError) {
35
+ return {
36
+ success: false,
37
+ errors: [error.message]
38
+ };
39
+ }
40
+ const message = error instanceof Error ? error.message : "Unknown validation error";
41
+ return {
42
+ success: false,
43
+ errors: [message]
44
+ };
45
+ }
46
+ }
47
+ function formatValidateResult(result, filePath) {
48
+ if (result.success) {
49
+ const lines2 = [
50
+ `✓ Valid query file: ${filePath}`,
51
+ ` Name: ${result.queryName}`,
52
+ ` Blocks: ${result.blockCount}`
53
+ ];
54
+ return lines2.join("\n");
55
+ }
56
+ const lines = [`✗ Invalid query file: ${filePath}`, "", "Errors:"];
57
+ if (result.errors) {
58
+ for (const error of result.errors) {
59
+ lines.push(` - ${error}`);
60
+ }
61
+ }
62
+ return lines.join("\n");
63
+ }
64
+ export {
65
+ formatValidateResult,
66
+ validateQueryCommand
67
+ };
68
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sources":["../../../../src/cli/commands/query/validate.ts"],"sourcesContent":["/**\n * Query validate command implementation.\n *\n * Validates a YAML query file and reports any errors.\n */\nimport { readFile } from 'node:fs/promises';\nimport { parseQueryString, ValidationError } from '../../../query/index.js';\nimport { ZodError } from 'zod';\n\n/**\n * Result of query validation.\n */\nexport interface ValidateResult {\n /** Whether validation succeeded */\n success: boolean;\n /** Error messages if validation failed */\n errors?: string[];\n /** Query name (if valid) */\n queryName?: string;\n /** Number of query blocks (if valid) */\n blockCount?: number;\n}\n\n/**\n * Validate a query YAML file.\n *\n * @param filePath - Path to the query file\n * @returns Validation result\n */\nexport async function validateQueryCommand(\n filePath: string\n): Promise<ValidateResult> {\n // Read file\n let content: string;\n try {\n content = await readFile(filePath, 'utf-8');\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Failed to read file';\n return {\n success: false,\n errors: [message],\n };\n }\n\n // Parse and validate using query module\n try {\n const ast = parseQueryString(content);\n return {\n success: true,\n queryName: ast.name,\n blockCount: ast.blocks.length,\n };\n } catch (error) {\n if (error instanceof ZodError) {\n const errors = error.issues.map((e) => {\n const path = e.path.join('.');\n return path ? `${path}: ${e.message}` : e.message;\n });\n return {\n success: false,\n errors,\n };\n }\n\n if (error instanceof ValidationError) {\n return {\n success: false,\n errors: [error.message],\n };\n }\n\n // YAML parse error or other error\n const message =\n error instanceof Error ? error.message : 'Unknown validation error';\n return {\n success: false,\n errors: [message],\n };\n }\n}\n\n/**\n * Format validation result for display.\n */\nexport function formatValidateResult(\n result: ValidateResult,\n filePath: string\n): string {\n if (result.success) {\n const lines = [\n `✓ Valid query file: ${filePath}`,\n ` Name: ${result.queryName}`,\n ` Blocks: ${result.blockCount}`,\n ];\n return lines.join('\\n');\n }\n\n const lines = [`✗ Invalid query file: ${filePath}`, '', 'Errors:'];\n if (result.errors) {\n for (const error of result.errors) {\n lines.push(` - ${error}`);\n }\n }\n return lines.join('\\n');\n}\n"],"names":["lines"],"mappings":";;;;AA6BA,eAAsB,qBACpB,UACyB;AAEzB,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,SAAS,UAAU,OAAO;AAAA,EAC5C,SAAS,OAAO;AACd,UAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ,CAAC,OAAO;AAAA,IAAA;AAAA,EAEpB;AAGA,MAAI;AACF,UAAM,MAAM,iBAAiB,OAAO;AACpC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,WAAW,IAAI;AAAA,MACf,YAAY,IAAI,OAAO;AAAA,IAAA;AAAA,EAE3B,SAAS,OAAO;AACd,QAAI,iBAAiB,UAAU;AAC7B,YAAM,SAAS,MAAM,OAAO,IAAI,CAAC,MAAM;AACrC,cAAM,OAAO,EAAE,KAAK,KAAK,GAAG;AAC5B,eAAO,OAAO,GAAG,IAAI,KAAK,EAAE,OAAO,KAAK,EAAE;AAAA,MAC5C,CAAC;AACD,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,MAAA;AAAA,IAEJ;AAEA,QAAI,iBAAiB,iBAAiB;AACpC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,CAAC,MAAM,OAAO;AAAA,MAAA;AAAA,IAE1B;AAGA,UAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ,CAAC,OAAO;AAAA,IAAA;AAAA,EAEpB;AACF;AAKO,SAAS,qBACd,QACA,UACQ;AACR,MAAI,OAAO,SAAS;AAClB,UAAMA,SAAQ;AAAA,MACZ,uBAAuB,QAAQ;AAAA,MAC/B,WAAW,OAAO,SAAS;AAAA,MAC3B,aAAa,OAAO,UAAU;AAAA,IAAA;AAEhC,WAAOA,OAAM,KAAK,IAAI;AAAA,EACxB;AAEA,QAAM,QAAQ,CAAC,yBAAyB,QAAQ,IAAI,IAAI,SAAS;AACjE,MAAI,OAAO,QAAQ;AACjB,eAAW,SAAS,OAAO,QAAQ;AACjC,YAAM,KAAK,OAAO,KAAK,EAAE;AAAA,IAC3B;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;"}
@@ -0,0 +1,39 @@
1
+ import { ProviderName, Article } from '../../providers/base/types.js';
2
+ export interface RegisterCommandOptions {
3
+ sessionId: string;
4
+ providers?: ProviderName[];
5
+ dryRun: boolean;
6
+ withAbstracts: boolean;
7
+ }
8
+ export interface CommandLineOptions {
9
+ db?: string | undefined;
10
+ dryRun?: boolean | undefined;
11
+ withAbstracts?: boolean | undefined;
12
+ }
13
+ export interface ValidationResult {
14
+ valid: boolean;
15
+ error?: string;
16
+ }
17
+ /**
18
+ * Parse command line options into RegisterCommandOptions.
19
+ */
20
+ export declare function parseRegisterOptions(sessionId: string, options: CommandLineOptions): RegisterCommandOptions;
21
+ /**
22
+ * Validate register command input.
23
+ */
24
+ export declare function validateRegisterInput(options: RegisterCommandOptions): ValidationResult;
25
+ /**
26
+ * Format registration summary for CLI output.
27
+ */
28
+ export declare function formatRegistrationSummary(summary: {
29
+ total: number;
30
+ added: number;
31
+ skipped: number;
32
+ failed: number;
33
+ noId: number;
34
+ }): string;
35
+ /**
36
+ * Format dry run output showing what would be registered.
37
+ */
38
+ export declare function formatDryRunOutput(articles: Article[]): string;
39
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/register.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAG7D,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,kBAAkB,GAC1B,sBAAsB,CAYxB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,gBAAgB,CASvF;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,MAAM,CAsBT;AAgBD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAqC9D"}
@@ -0,0 +1,78 @@
1
+ import { parseProviderNames } from "../utils/validation.js";
2
+ function parseRegisterOptions(sessionId, options) {
3
+ const result = {
4
+ sessionId,
5
+ dryRun: options.dryRun ?? false,
6
+ withAbstracts: options.withAbstracts ?? false
7
+ };
8
+ if (options.db) {
9
+ result.providers = parseProviderNames(options.db);
10
+ }
11
+ return result;
12
+ }
13
+ function validateRegisterInput(options) {
14
+ if (!options.sessionId || options.sessionId.trim() === "") {
15
+ return {
16
+ valid: false,
17
+ error: "A session ID is required"
18
+ };
19
+ }
20
+ return { valid: true };
21
+ }
22
+ function formatRegistrationSummary(summary) {
23
+ const lines = ["Registration complete:"];
24
+ lines.push(` ✓ ${summary.added} added`);
25
+ if (summary.skipped > 0) {
26
+ lines.push(` ⚠ ${summary.skipped} duplicates (already in library)`);
27
+ }
28
+ if (summary.failed > 0) {
29
+ lines.push(` ✗ ${summary.failed} failed`);
30
+ }
31
+ if (summary.noId > 0) {
32
+ lines.push(` - ${summary.noId} skipped (no identifier)`);
33
+ }
34
+ return lines.join("\n");
35
+ }
36
+ function getRegistrationId(article) {
37
+ if (article.pmid) {
38
+ return `pmid:${article.pmid}`;
39
+ }
40
+ if (article.doi) {
41
+ return article.doi;
42
+ }
43
+ return null;
44
+ }
45
+ function formatDryRunOutput(articles) {
46
+ const withId = [];
47
+ const withoutId = [];
48
+ for (const article of articles) {
49
+ const id = getRegistrationId(article);
50
+ if (id) {
51
+ withId.push({ article, id });
52
+ } else {
53
+ withoutId.push(article);
54
+ }
55
+ }
56
+ const lines = [];
57
+ lines.push(
58
+ `Would register ${withId.length} reference${withId.length !== 1 ? "s" : ""}:`
59
+ );
60
+ for (const { id, article } of withId) {
61
+ const title = article.title.length > 60 ? article.title.substring(0, 57) + "..." : article.title;
62
+ lines.push(` - ${id}: ${title}`);
63
+ }
64
+ if (withoutId.length > 0) {
65
+ lines.push("");
66
+ lines.push(
67
+ `${withoutId.length} article${withoutId.length !== 1 ? "s" : ""} will be skipped (no identifier)`
68
+ );
69
+ }
70
+ return lines.join("\n");
71
+ }
72
+ export {
73
+ formatDryRunOutput,
74
+ formatRegistrationSummary,
75
+ parseRegisterOptions,
76
+ validateRegisterInput
77
+ };
78
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sources":["../../../src/cli/commands/register.ts"],"sourcesContent":["/**\n * Register command for reference-manager integration.\n * Registers search results with reference-manager CLI.\n */\n\nimport type { ProviderName } from '../../providers/base/types.js';\nimport type { Article } from '../../providers/base/types.js';\nimport { parseProviderNames } from '../utils/validation.js';\n\nexport interface RegisterCommandOptions {\n sessionId: string;\n providers?: ProviderName[];\n dryRun: boolean;\n withAbstracts: boolean;\n}\n\nexport interface CommandLineOptions {\n db?: string | undefined;\n dryRun?: boolean | undefined;\n withAbstracts?: boolean | undefined;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n error?: string;\n}\n\n/**\n * Parse command line options into RegisterCommandOptions.\n */\nexport function parseRegisterOptions(\n sessionId: string,\n options: CommandLineOptions\n): RegisterCommandOptions {\n const result: RegisterCommandOptions = {\n sessionId,\n dryRun: options.dryRun ?? false,\n withAbstracts: options.withAbstracts ?? false,\n };\n\n if (options.db) {\n result.providers = parseProviderNames(options.db);\n }\n\n return result;\n}\n\n/**\n * Validate register command input.\n */\nexport function validateRegisterInput(options: RegisterCommandOptions): ValidationResult {\n if (!options.sessionId || options.sessionId.trim() === '') {\n return {\n valid: false,\n error: 'A session ID is required',\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Format registration summary for CLI output.\n */\nexport function formatRegistrationSummary(summary: {\n total: number;\n added: number;\n skipped: number;\n failed: number;\n noId: number;\n}): string {\n const lines: string[] = ['Registration complete:'];\n\n // Added\n lines.push(` ✓ ${summary.added} added`);\n\n // Duplicates (skipped)\n if (summary.skipped > 0) {\n lines.push(` ⚠ ${summary.skipped} duplicates (already in library)`);\n }\n\n // Failed\n if (summary.failed > 0) {\n lines.push(` ✗ ${summary.failed} failed`);\n }\n\n // No ID (skipped)\n if (summary.noId > 0) {\n lines.push(` - ${summary.noId} skipped (no identifier)`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Get registration identifier for an article.\n * PMID is preferred over DOI for better metadata quality.\n */\nfunction getRegistrationId(article: Article): string | null {\n if (article.pmid) {\n return `pmid:${article.pmid}`;\n }\n if (article.doi) {\n return article.doi;\n }\n return null;\n}\n\n/**\n * Format dry run output showing what would be registered.\n */\nexport function formatDryRunOutput(articles: Article[]): string {\n const withId: Array<{ article: Article; id: string }> = [];\n const withoutId: Article[] = [];\n\n for (const article of articles) {\n const id = getRegistrationId(article);\n if (id) {\n withId.push({ article, id });\n } else {\n withoutId.push(article);\n }\n }\n\n const lines: string[] = [];\n\n // Summary\n lines.push(\n `Would register ${withId.length} reference${withId.length !== 1 ? 's' : ''}:`\n );\n\n // List articles with IDs\n for (const { id, article } of withId) {\n const title = article.title.length > 60\n ? article.title.substring(0, 57) + '...'\n : article.title;\n lines.push(` - ${id}: ${title}`);\n }\n\n // Note about articles without IDs\n if (withoutId.length > 0) {\n lines.push('');\n lines.push(\n `${withoutId.length} article${withoutId.length !== 1 ? 's' : ''} will be skipped (no identifier)`\n );\n }\n\n return lines.join('\\n');\n}\n"],"names":[],"mappings":";AA8BO,SAAS,qBACd,WACA,SACwB;AACxB,QAAM,SAAiC;AAAA,IACrC;AAAA,IACA,QAAQ,QAAQ,UAAU;AAAA,IAC1B,eAAe,QAAQ,iBAAiB;AAAA,EAAA;AAG1C,MAAI,QAAQ,IAAI;AACd,WAAO,YAAY,mBAAmB,QAAQ,EAAE;AAAA,EAClD;AAEA,SAAO;AACT;AAKO,SAAS,sBAAsB,SAAmD;AACvF,MAAI,CAAC,QAAQ,aAAa,QAAQ,UAAU,KAAA,MAAW,IAAI;AACzD,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IAAA;AAAA,EAEX;AAEA,SAAO,EAAE,OAAO,KAAA;AAClB;AAKO,SAAS,0BAA0B,SAM/B;AACT,QAAM,QAAkB,CAAC,wBAAwB;AAGjD,QAAM,KAAK,OAAO,QAAQ,KAAK,QAAQ;AAGvC,MAAI,QAAQ,UAAU,GAAG;AACvB,UAAM,KAAK,OAAO,QAAQ,OAAO,kCAAkC;AAAA,EACrE;AAGA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,KAAK,OAAO,QAAQ,MAAM,SAAS;AAAA,EAC3C;AAGA,MAAI,QAAQ,OAAO,GAAG;AACpB,UAAM,KAAK,OAAO,QAAQ,IAAI,0BAA0B;AAAA,EAC1D;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAMA,SAAS,kBAAkB,SAAiC;AAC1D,MAAI,QAAQ,MAAM;AAChB,WAAO,QAAQ,QAAQ,IAAI;AAAA,EAC7B;AACA,MAAI,QAAQ,KAAK;AACf,WAAO,QAAQ;AAAA,EACjB;AACA,SAAO;AACT;AAKO,SAAS,mBAAmB,UAA6B;AAC9D,QAAM,SAAkD,CAAA;AACxD,QAAM,YAAuB,CAAA;AAE7B,aAAW,WAAW,UAAU;AAC9B,UAAM,KAAK,kBAAkB,OAAO;AACpC,QAAI,IAAI;AACN,aAAO,KAAK,EAAE,SAAS,GAAA,CAAI;AAAA,IAC7B,OAAO;AACL,gBAAU,KAAK,OAAO;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,QAAkB,CAAA;AAGxB,QAAM;AAAA,IACJ,kBAAkB,OAAO,MAAM,aAAa,OAAO,WAAW,IAAI,MAAM,EAAE;AAAA,EAAA;AAI5E,aAAW,EAAE,IAAI,QAAA,KAAa,QAAQ;AACpC,UAAM,QAAQ,QAAQ,MAAM,SAAS,KACjC,QAAQ,MAAM,UAAU,GAAG,EAAE,IAAI,QACjC,QAAQ;AACZ,UAAM,KAAK,OAAO,EAAE,KAAK,KAAK,EAAE;AAAA,EAClC;AAGA,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,KAAK,EAAE;AACb,UAAM;AAAA,MACJ,GAAG,UAAU,MAAM,WAAW,UAAU,WAAW,IAAI,MAAM,EAAE;AAAA,IAAA;AAAA,EAEnE;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;"}
@@ -0,0 +1,19 @@
1
+ import { ResumeCommandOptions } from './resume.js';
2
+ import { Config } from '../../config/index.js';
3
+ /**
4
+ * Result of a resume execution.
5
+ */
6
+ export interface ResumeExecutionResult {
7
+ success: boolean;
8
+ resumed: number;
9
+ results?: Record<string, {
10
+ hits: number;
11
+ retrieved: number;
12
+ }>;
13
+ error?: string;
14
+ }
15
+ /**
16
+ * Execute resume for interrupted sessions.
17
+ */
18
+ export declare function executeResume(options: ResumeCommandOptions, sessionsDir: string, config: Config, showProgress?: boolean): Promise<ResumeExecutionResult>;
19
+ //# sourceMappingURL=resume-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume-executor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/resume-executor.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAepD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAgBD;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,oBAAoB,EAC7B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,YAAY,UAAO,GAClB,OAAO,CAAC,qBAAqB,CAAC,CAyNhC"}