@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.
- package/LICENSE +21 -0
- package/README.md +93 -0
- package/dist/_virtual/___vite-browser-external.js +7 -0
- package/dist/_virtual/___vite-browser-external.js.map +1 -0
- package/dist/_virtual/__vite-browser-external.js +5 -0
- package/dist/_virtual/__vite-browser-external.js.map +1 -0
- package/dist/_virtual/_commonjsHelpers.js +28 -0
- package/dist/_virtual/_commonjsHelpers.js.map +1 -0
- package/dist/_virtual/cli-progress.js +6 -0
- package/dist/_virtual/cli-progress.js.map +1 -0
- package/dist/_virtual/index.js +5 -0
- package/dist/_virtual/index.js.map +1 -0
- package/dist/_virtual/index2.js +5 -0
- package/dist/_virtual/index2.js.map +1 -0
- package/dist/cli/commands/config.d.ts +37 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +117 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/export.d.ts +26 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +86 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/init.d.ts +45 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +134 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/query/translate.d.ts +32 -0
- package/dist/cli/commands/query/translate.d.ts.map +1 -0
- package/dist/cli/commands/query/translate.js +76 -0
- package/dist/cli/commands/query/translate.js.map +1 -0
- package/dist/cli/commands/query/validate.d.ts +25 -0
- package/dist/cli/commands/query/validate.d.ts.map +1 -0
- package/dist/cli/commands/query/validate.js +68 -0
- package/dist/cli/commands/query/validate.js.map +1 -0
- package/dist/cli/commands/register.d.ts +39 -0
- package/dist/cli/commands/register.d.ts.map +1 -0
- package/dist/cli/commands/register.js +78 -0
- package/dist/cli/commands/register.js.map +1 -0
- package/dist/cli/commands/resume-executor.d.ts +19 -0
- package/dist/cli/commands/resume-executor.d.ts.map +1 -0
- package/dist/cli/commands/resume-executor.js +170 -0
- package/dist/cli/commands/resume-executor.js.map +1 -0
- package/dist/cli/commands/resume.d.ts +26 -0
- package/dist/cli/commands/resume.d.ts.map +1 -0
- package/dist/cli/commands/resume.js +51 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/search-executor.d.ts +26 -0
- package/dist/cli/commands/search-executor.d.ts.map +1 -0
- package/dist/cli/commands/search-executor.js +315 -0
- package/dist/cli/commands/search-executor.js.map +1 -0
- package/dist/cli/commands/search.d.ts +30 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +67 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/status.d.ts +41 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +123 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/e2e-helpers.d.ts +165 -0
- package/dist/cli/e2e-helpers.d.ts.map +1 -0
- package/dist/cli/exit-codes.d.ts +25 -0
- package/dist/cli/exit-codes.d.ts.map +1 -0
- package/dist/cli/exit-codes.js +18 -0
- package/dist/cli/exit-codes.js.map +1 -0
- package/dist/cli/index.d.ts +25 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +638 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/progress.d.ts +24 -0
- package/dist/cli/utils/progress.d.ts.map +1 -0
- package/dist/cli/utils/progress.js +128 -0
- package/dist/cli/utils/progress.js.map +1 -0
- package/dist/cli/utils/sessions-dir.d.ts +14 -0
- package/dist/cli/utils/sessions-dir.d.ts.map +1 -0
- package/dist/cli/utils/sessions-dir.js +21 -0
- package/dist/cli/utils/sessions-dir.js.map +1 -0
- package/dist/cli/utils/validation.d.ts +18 -0
- package/dist/cli/utils/validation.d.ts.map +1 -0
- package/dist/cli/utils/validation.js +24 -0
- package/dist/cli/utils/validation.js.map +1 -0
- package/dist/config/defaults.d.ts +12 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +10 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/env.d.ts +12 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +36 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/index.d.ts +9 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/loader.d.ts +49 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +72 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/paths.d.ts +23 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +22 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/schema.d.ts +109 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +74 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/integration/ref-cli.d.ts +41 -0
- package/dist/integration/ref-cli.d.ts.map +1 -0
- package/dist/integration/ref-cli.js +132 -0
- package/dist/integration/ref-cli.js.map +1 -0
- package/dist/integration/register.d.ts +27 -0
- package/dist/integration/register.d.ts.map +1 -0
- package/dist/integration/register.js +108 -0
- package/dist/integration/register.js.map +1 -0
- package/dist/integration/types.d.ts +61 -0
- package/dist/integration/types.d.ts.map +1 -0
- package/dist/integration/types.js +61 -0
- package/dist/integration/types.js.map +1 -0
- package/dist/node_modules/cli-progress/cli-progress.js +37 -0
- package/dist/node_modules/cli-progress/cli-progress.js.map +1 -0
- package/dist/node_modules/cli-progress/lib/eta.js +52 -0
- package/dist/node_modules/cli-progress/lib/eta.js.map +1 -0
- package/dist/node_modules/cli-progress/lib/format-bar.js +16 -0
- package/dist/node_modules/cli-progress/lib/format-bar.js.map +1 -0
- package/dist/node_modules/cli-progress/lib/format-time.js +32 -0
- package/dist/node_modules/cli-progress/lib/format-time.js.map +1 -0
- package/dist/node_modules/cli-progress/lib/format-value.js +25 -0
- package/dist/node_modules/cli-progress/lib/format-value.js.map +1 -0
- package/dist/node_modules/cli-progress/lib/formatter.js +57 -0
- package/dist/node_modules/cli-progress/lib/formatter.js.map +1 -0
- package/dist/node_modules/cli-progress/lib/generic-bar.js +137 -0
- package/dist/node_modules/cli-progress/lib/generic-bar.js.map +1 -0
- package/dist/node_modules/cli-progress/lib/multi-bar.js +147 -0
- package/dist/node_modules/cli-progress/lib/multi-bar.js.map +1 -0
- package/dist/node_modules/cli-progress/lib/options.js +59 -0
- package/dist/node_modules/cli-progress/lib/options.js.map +1 -0
- package/dist/node_modules/cli-progress/lib/single-bar.js +95 -0
- package/dist/node_modules/cli-progress/lib/single-bar.js.map +1 -0
- package/dist/node_modules/cli-progress/lib/terminal.js +125 -0
- package/dist/node_modules/cli-progress/lib/terminal.js.map +1 -0
- package/dist/node_modules/cli-progress/node_modules/ansi-regex/index.js +18 -0
- package/dist/node_modules/cli-progress/node_modules/ansi-regex/index.js.map +1 -0
- package/dist/node_modules/cli-progress/node_modules/emoji-regex/index.js +14 -0
- package/dist/node_modules/cli-progress/node_modules/emoji-regex/index.js.map +1 -0
- package/dist/node_modules/cli-progress/node_modules/string-width/index.js +44 -0
- package/dist/node_modules/cli-progress/node_modules/string-width/index.js.map +1 -0
- package/dist/node_modules/cli-progress/node_modules/strip-ansi/index.js +14 -0
- package/dist/node_modules/cli-progress/node_modules/strip-ansi/index.js.map +1 -0
- package/dist/node_modules/cli-progress/presets/index.js +25 -0
- package/dist/node_modules/cli-progress/presets/index.js.map +1 -0
- package/dist/node_modules/cli-progress/presets/legacy.js +16 -0
- package/dist/node_modules/cli-progress/presets/legacy.js.map +1 -0
- package/dist/node_modules/cli-progress/presets/rect.js +16 -0
- package/dist/node_modules/cli-progress/presets/rect.js.map +1 -0
- package/dist/node_modules/cli-progress/presets/shades-classic.js +16 -0
- package/dist/node_modules/cli-progress/presets/shades-classic.js.map +1 -0
- package/dist/node_modules/cli-progress/presets/shades-grey.js +16 -0
- package/dist/node_modules/cli-progress/presets/shades-grey.js.map +1 -0
- package/dist/node_modules/env-paths/index.js +58 -0
- package/dist/node_modules/env-paths/index.js.map +1 -0
- package/dist/node_modules/fast-xml-parser/src/ignoreAttributes.js +22 -0
- package/dist/node_modules/fast-xml-parser/src/ignoreAttributes.js.map +1 -0
- package/dist/node_modules/fast-xml-parser/src/util.js +33 -0
- package/dist/node_modules/fast-xml-parser/src/util.js.map +1 -0
- package/dist/node_modules/fast-xml-parser/src/validator.js +309 -0
- package/dist/node_modules/fast-xml-parser/src/validator.js.map +1 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/DocTypeReader.js +265 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/DocTypeReader.js.map +1 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/OptionsBuilder.js +53 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/OptionsBuilder.js.map +1 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/OrderedObjParser.js +515 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/OrderedObjParser.js.map +1 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/XMLParser.js +68 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/XMLParser.js.map +1 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/node2json.js +88 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/node2json.js.map +1 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/xmlNode.js +36 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/xmlNode.js.map +1 -0
- package/dist/node_modules/is-fullwidth-code-point/index.js +37 -0
- package/dist/node_modules/is-fullwidth-code-point/index.js.map +1 -0
- package/dist/node_modules/strnum/strnum.js +100 -0
- package/dist/node_modules/strnum/strnum.js.map +1 -0
- package/dist/providers/arxiv/client.d.ts +54 -0
- package/dist/providers/arxiv/client.d.ts.map +1 -0
- package/dist/providers/arxiv/client.js +105 -0
- package/dist/providers/arxiv/client.js.map +1 -0
- package/dist/providers/arxiv/index.d.ts +14 -0
- package/dist/providers/arxiv/index.d.ts.map +1 -0
- package/dist/providers/arxiv/parser.d.ts +16 -0
- package/dist/providers/arxiv/parser.d.ts.map +1 -0
- package/dist/providers/arxiv/parser.js +144 -0
- package/dist/providers/arxiv/parser.js.map +1 -0
- package/dist/providers/arxiv/provider.d.ts +39 -0
- package/dist/providers/arxiv/provider.d.ts.map +1 -0
- package/dist/providers/arxiv/provider.js +153 -0
- package/dist/providers/arxiv/provider.js.map +1 -0
- package/dist/providers/arxiv/translator.d.ts +17 -0
- package/dist/providers/arxiv/translator.d.ts.map +1 -0
- package/dist/providers/arxiv/translator.js +112 -0
- package/dist/providers/arxiv/translator.js.map +1 -0
- package/dist/providers/arxiv/types.d.ts +71 -0
- package/dist/providers/arxiv/types.d.ts.map +1 -0
- package/dist/providers/arxiv/types.js +17 -0
- package/dist/providers/arxiv/types.js.map +1 -0
- package/dist/providers/base/index.d.ts +16 -0
- package/dist/providers/base/index.d.ts.map +1 -0
- package/dist/providers/base/mock-provider.d.ts +76 -0
- package/dist/providers/base/mock-provider.d.ts.map +1 -0
- package/dist/providers/base/mock-provider.js +159 -0
- package/dist/providers/base/mock-provider.js.map +1 -0
- package/dist/providers/base/provider.d.ts +95 -0
- package/dist/providers/base/provider.d.ts.map +1 -0
- package/dist/providers/base/provider.js +117 -0
- package/dist/providers/base/provider.js.map +1 -0
- package/dist/providers/base/rate-limiter.d.ts +70 -0
- package/dist/providers/base/rate-limiter.d.ts.map +1 -0
- package/dist/providers/base/rate-limiter.js +111 -0
- package/dist/providers/base/rate-limiter.js.map +1 -0
- package/dist/providers/base/registry.d.ts +52 -0
- package/dist/providers/base/registry.d.ts.map +1 -0
- package/dist/providers/base/registry.js +55 -0
- package/dist/providers/base/registry.js.map +1 -0
- package/dist/providers/base/types.d.ts +163 -0
- package/dist/providers/base/types.d.ts.map +1 -0
- package/dist/providers/base/types.js +29 -0
- package/dist/providers/base/types.js.map +1 -0
- package/dist/providers/eric/client.d.ts +40 -0
- package/dist/providers/eric/client.d.ts.map +1 -0
- package/dist/providers/eric/client.js +93 -0
- package/dist/providers/eric/client.js.map +1 -0
- package/dist/providers/eric/index.d.ts +14 -0
- package/dist/providers/eric/index.d.ts.map +1 -0
- package/dist/providers/eric/parser.d.ts +21 -0
- package/dist/providers/eric/parser.d.ts.map +1 -0
- package/dist/providers/eric/parser.js +86 -0
- package/dist/providers/eric/parser.js.map +1 -0
- package/dist/providers/eric/provider.d.ts +59 -0
- package/dist/providers/eric/provider.d.ts.map +1 -0
- package/dist/providers/eric/provider.js +166 -0
- package/dist/providers/eric/provider.js.map +1 -0
- package/dist/providers/eric/translator.d.ts +12 -0
- package/dist/providers/eric/translator.d.ts.map +1 -0
- package/dist/providers/eric/translator.js +81 -0
- package/dist/providers/eric/translator.js.map +1 -0
- package/dist/providers/eric/types.d.ts +84 -0
- package/dist/providers/eric/types.d.ts.map +1 -0
- package/dist/providers/pubmed/client.d.ts +54 -0
- package/dist/providers/pubmed/client.d.ts.map +1 -0
- package/dist/providers/pubmed/client.js +141 -0
- package/dist/providers/pubmed/client.js.map +1 -0
- package/dist/providers/pubmed/index.d.ts +27 -0
- package/dist/providers/pubmed/index.d.ts.map +1 -0
- package/dist/providers/pubmed/parser.d.ts +22 -0
- package/dist/providers/pubmed/parser.d.ts.map +1 -0
- package/dist/providers/pubmed/parser.js +174 -0
- package/dist/providers/pubmed/parser.js.map +1 -0
- package/dist/providers/pubmed/provider.d.ts +44 -0
- package/dist/providers/pubmed/provider.d.ts.map +1 -0
- package/dist/providers/pubmed/provider.js +224 -0
- package/dist/providers/pubmed/provider.js.map +1 -0
- package/dist/providers/pubmed/translator.d.ts +7 -0
- package/dist/providers/pubmed/translator.d.ts.map +1 -0
- package/dist/providers/pubmed/translator.js +143 -0
- package/dist/providers/pubmed/translator.js.map +1 -0
- package/dist/providers/pubmed/types.d.ts +72 -0
- package/dist/providers/pubmed/types.d.ts.map +1 -0
- package/dist/providers/scopus/client.d.ts +64 -0
- package/dist/providers/scopus/client.d.ts.map +1 -0
- package/dist/providers/scopus/client.js +155 -0
- package/dist/providers/scopus/client.js.map +1 -0
- package/dist/providers/scopus/index.d.ts +21 -0
- package/dist/providers/scopus/index.d.ts.map +1 -0
- package/dist/providers/scopus/parser.d.ts +11 -0
- package/dist/providers/scopus/parser.d.ts.map +1 -0
- package/dist/providers/scopus/parser.js +128 -0
- package/dist/providers/scopus/parser.js.map +1 -0
- package/dist/providers/scopus/provider.d.ts +39 -0
- package/dist/providers/scopus/provider.d.ts.map +1 -0
- package/dist/providers/scopus/provider.js +175 -0
- package/dist/providers/scopus/provider.js.map +1 -0
- package/dist/providers/scopus/translator.d.ts +7 -0
- package/dist/providers/scopus/translator.d.ts.map +1 -0
- package/dist/providers/scopus/translator.js +83 -0
- package/dist/providers/scopus/translator.js.map +1 -0
- package/dist/providers/scopus/types.d.ts +86 -0
- package/dist/providers/scopus/types.d.ts.map +1 -0
- package/dist/query/index.d.ts +12 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/parser.d.ts +18 -0
- package/dist/query/parser.d.ts.map +1 -0
- package/dist/query/parser.js +16 -0
- package/dist/query/parser.js.map +1 -0
- package/dist/query/types.d.ts +85 -0
- package/dist/query/types.d.ts.map +1 -0
- package/dist/query/validator.d.ts +635 -0
- package/dist/query/validator.d.ts.map +1 -0
- package/dist/query/validator.js +117 -0
- package/dist/query/validator.js.map +1 -0
- package/dist/session/index.d.ts +14 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/logger.d.ts +15 -0
- package/dist/session/logger.d.ts.map +1 -0
- package/dist/session/logger.js +18 -0
- package/dist/session/logger.js.map +1 -0
- package/dist/session/manager.d.ts +63 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +193 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/session/types.d.ts +182 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/utils/deep-merge.d.ts +17 -0
- package/dist/utils/deep-merge.d.ts.map +1 -0
- package/dist/utils/deep-merge.js +23 -0
- package/dist/utils/deep-merge.js.map +1 -0
- package/dist/utils/path.d.ts +9 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +15 -0
- package/dist/utils/path.js.map +1 -0
- 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"}
|