web-access-cli 0.2.0 → 0.4.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/README.md +35 -16
- package/README_CN.md +35 -16
- package/THIRD_PARTY_NOTICES.md +11 -0
- package/dist/cli-output.js +34 -0
- package/dist/cli-output.js.map +1 -0
- package/dist/cli.js +40 -20
- package/dist/cli.js.map +1 -1
- package/dist/config/config.js +93 -8
- package/dist/config/config.js.map +1 -1
- package/dist/config/edit.js +88 -4
- package/dist/config/edit.js.map +1 -1
- package/dist/core/schema.js +15 -0
- package/dist/core/schema.js.map +1 -1
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -1
- package/dist/providers/anysearch.js +15 -26
- package/dist/providers/anysearch.js.map +1 -1
- package/dist/providers/bocha.js +177 -0
- package/dist/providers/bocha.js.map +1 -0
- package/dist/providers/registry.js +5 -0
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/xai.js +208 -0
- package/dist/providers/xai.js.map +1 -0
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/schemas/config.schema.json +77 -0
- package/schemas/output.schema.json +156 -0
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@ English | [简体中文](README_CN.md)
|
|
|
5
5
|
[](https://github.com/Juexe/web-access-cli/actions/workflows/ci.yml)
|
|
6
6
|
[](LICENSE)
|
|
7
7
|
|
|
8
|
-
An agent-neutral CLI for web capabilities. It defines search and web content extraction as stable capabilities while normalizing differences among Tavily, Exa, Brave, SearXNG, AnySearch, XCrawl, DeepSeek, Firecrawl, Jina, and other providers behind a unified internal schema.
|
|
8
|
+
An agent-neutral CLI for web capabilities. It defines search and web content extraction as stable capabilities while normalizing differences among Tavily, Exa, Bocha, Brave, SearXNG, AnySearch, XCrawl, DeepSeek, Firecrawl, Jina, and other providers behind a unified internal schema.
|
|
9
9
|
|
|
10
10
|
The CLI is the primary product interface. It is not tied to Pi, Claude Code, Codex, Cursor, OpenCode, or any other agent. Skills, MCP integrations, and agent plugins may only integrate as adapters on top of the CLI; they must not leak into the core capabilities or provider implementations.
|
|
11
11
|
|
|
@@ -13,7 +13,7 @@ The CLI is the primary product interface. It is not tied to Pi, Claude Code, Cod
|
|
|
13
13
|
|
|
14
14
|
| Capability | Provider types | Normalized output |
|
|
15
15
|
| --- | --- | --- |
|
|
16
|
-
| `search` | Tavily, Exa, Brave, SearXNG, AnySearch, XCrawl, DeepSeek | `rank`, `title`, `url`, `snippet` |
|
|
16
|
+
| `search` | Tavily, Exa, Bocha, Brave, SearXNG, AnySearch, XCrawl, DeepSeek, xAI x_search, xAI web_search | `rank`, `title`, `url`, `snippet` |
|
|
17
17
|
| `extract` | Firecrawl v2, Jina Reader, Exa Contents, AnySearch, XCrawl, HTTP | Markdown `Document` |
|
|
18
18
|
|
|
19
19
|
A provider type describes an implementation, while a provider instance is a configurable instance of that type. One type can have multiple instances, such as `exa_team` and `exa_personal`. A `providers` route is an ordered array of instance IDs that determines which instances are enabled and the initial `auto` order. The CLI stores the learned effective order in the sibling `_providers` field.
|
|
@@ -82,9 +82,10 @@ web-access search "browser automation" --include-domain example.com --exclude-do
|
|
|
82
82
|
|
|
83
83
|
web-access extract https://example.com/article
|
|
84
84
|
web-access extract https://example.com/article --provider http --timeout 30000
|
|
85
|
+
web-access extract https://example.com/article --json
|
|
85
86
|
|
|
86
|
-
web-access providers
|
|
87
|
-
web-access doctor
|
|
87
|
+
web-access providers
|
|
88
|
+
web-access doctor
|
|
88
89
|
|
|
89
90
|
web-access config edit
|
|
90
91
|
web-access --config "/path/to/config.json" config edit
|
|
@@ -95,10 +96,10 @@ The CLI provides the `search` and `extract` capability commands, the `providers`
|
|
|
95
96
|
### Global options
|
|
96
97
|
|
|
97
98
|
- `--config <path>`: Explicitly select a configuration file.
|
|
98
|
-
- `--
|
|
99
|
+
- `--json`: Output a compact schema v2 JSON envelope. Without it, successful commands write human-readable Markdown; all failures always write JSON.
|
|
99
100
|
- `--help`, `--version`: Print standard CLI help or version text.
|
|
100
101
|
|
|
101
|
-
|
|
102
|
+
Successful commands default to Markdown for human readers. `search` writes a YAML front matter block followed by a numbered result list; `extract` writes YAML front matter followed by the normalized Markdown body; `providers`, `doctor`, and `config edit` write a heading followed by pretty-printed JSON data. Add `--json` when a schema v2 envelope is required. Extract `partial` results and all failures, including invalid input and runtime errors, always remain JSON envelopes. Diagnostic messages are never mixed into stdout.
|
|
102
103
|
|
|
103
104
|
## Configuration
|
|
104
105
|
|
|
@@ -106,7 +107,7 @@ Configuration files use strict JSON; unknown fields are rejected. The CLI reads
|
|
|
106
107
|
|
|
107
108
|
The default path on every platform is `~/.config/web-access-cli/config.json`, where `~` is the current user's home directory. The `WEB_ACCESS_CONFIG` environment variable can select another path. The `--config` command-line option takes precedence.
|
|
108
109
|
|
|
109
|
-
`web-access config edit` creates parent directories and a complete default configuration when the file is missing, then opens it with the
|
|
110
|
+
`web-access config edit` creates parent directories and a complete default configuration when the file is missing, then opens it with the command in `VISUAL`, or `EDITOR` when `VISUAL` is empty. The value may contain a quoted executable path and arguments; it is parsed without shell evaluation and the configuration path is appended as a separate argument. An existing file is opened byte-for-byte as-is, even when it is temporarily invalid JSON; it is never overwritten or reformatted. The command waits only for the editor process to start, not for it to close. When neither variable is set, the command returns `open_failed`; a configuration file that was created successfully remains available for manual editing.
|
|
110
111
|
|
|
111
112
|
`config edit` itself never rewrites existing content. After an `auto` capability call succeeds or encounters fallback-eligible failures, the CLI atomically updates `search._providers` or `extract._providers`. If the default configuration does not exist, the first `auto` call that produces a learning result creates the complete default configuration. `_providers` is CLI-managed and cannot enable an instance outside `providers`. Missing, malformed, duplicate, unknown, or membership-mismatched internal entries reset the whole capability to the declared route. Delete `_providers` to restore the user-declared initial order manually.
|
|
112
113
|
|
|
@@ -114,7 +115,7 @@ The complete JSON Schema is available at [schemas/config.schema.json](schemas/co
|
|
|
114
115
|
|
|
115
116
|
```json
|
|
116
117
|
{
|
|
117
|
-
"$schema": "https://unpkg.com/web-access-cli@0.
|
|
118
|
+
"$schema": "https://unpkg.com/web-access-cli@0.4.0/schemas/config.schema.json",
|
|
118
119
|
"providers": [
|
|
119
120
|
{
|
|
120
121
|
"id": "exa_team",
|
|
@@ -138,8 +139,8 @@ The complete JSON Schema is available at [schemas/config.schema.json](schemas/co
|
|
|
138
139
|
"search": {
|
|
139
140
|
"providers": ["searx_local", "exa_team", "brave"],
|
|
140
141
|
"limit": 5,
|
|
141
|
-
"timeoutMs":
|
|
142
|
-
"attemptTimeoutMs":
|
|
142
|
+
"timeoutMs": 120000,
|
|
143
|
+
"attemptTimeoutMs": 60000,
|
|
143
144
|
"maxResponseBytes": 5242880
|
|
144
145
|
},
|
|
145
146
|
"extract": {
|
|
@@ -152,17 +153,19 @@ The complete JSON Schema is available at [schemas/config.schema.json](schemas/co
|
|
|
152
153
|
}
|
|
153
154
|
```
|
|
154
155
|
|
|
155
|
-
The built-in instances are `tavily`, `exa`, `brave`, `searxng`, `firecrawl`, `jina`, `http`, `anysearch`, `xcrawl`, and `
|
|
156
|
+
The built-in instances are `tavily`, `exa`, `bocha`, `brave`, `searxng`, `firecrawl`, `jina`, `http`, `anysearch`, `xcrawl`, `deepseek`, `xai_x_search`, and `xai_web_search`. A configuration entry with the same ID overrides fields on the built-in instance. A custom ID creates another instance of the selected type. An instance is enabled only when it appears in the corresponding `providers` route. Bocha defaults to `https://api.bocha.cn` and requires an API key; AnySearch defaults to `https://api.anysearch.com` and supports anonymous calls; XCrawl defaults to `https://run.xcrawl.com` and requires an API key; DeepSeek defaults to `https://api.deepseek.com/anthropic/v1` and requires an API key.
|
|
156
157
|
|
|
157
158
|
Default routes:
|
|
158
159
|
|
|
159
|
-
- Search: `tavily -> exa -> brave -> searxng -> anysearch -> xcrawl -> deepseek`
|
|
160
|
+
- Search: `tavily -> exa -> bocha -> brave -> searxng -> anysearch -> xcrawl -> deepseek -> xai_web_search`
|
|
160
161
|
- Extract: `firecrawl -> jina -> exa -> anysearch -> xcrawl -> http`
|
|
161
162
|
|
|
162
163
|
The default routes include every built-in instance that supports the corresponding capability. Custom instance IDs are merged into the instance list but must still be added to routes explicitly. An omitted route uses the defaults above, while an explicit empty array disables that capability. In `auto` mode, incompletely configured instances are skipped; AnySearch can be called anonymously with its default base URL, while XCrawl and DeepSeek are skipped until their API keys are configured. AnySearch and XCrawl accept `searchFilterMode`: `strict` (default; freshness skips the provider) or `best_effort` (rewrites freshness into a query fragment). Domain constraints are rewritten into the query and strictly re-applied locally. XCrawl Extract always uses synchronous Scrape with Markdown output; Map, Crawl, and asynchronous jobs are outside the current CLI capabilities.
|
|
163
164
|
|
|
164
165
|
DeepSeek Search performs a full Anthropic-compatible Messages model turn with the native `web_search_20250305` server tool, so it can have higher latency and cost than a dedicated search endpoint. It is last in the default route and is reached only after earlier providers are unavailable, return a final non-2xx HTTP response, or otherwise fail recoverably. The adapter accepts URLs only from structured `web_search_tool_result` blocks, joins citation excerpts by URL, and never extracts URLs from model prose. Domain constraints are rewritten into the query and strictly re-applied locally; `freshness` is unsupported and skips DeepSeek with a recoverable error. Redirects are rejected without contacting the `Location` target. Provider-private `encrypted_content` payloads are omitted from `raw` because they are opaque, cannot be displayed or decoded by the CLI, and add no diagnostic value.
|
|
165
166
|
|
|
167
|
+
XAI hosted Search reads an external OAuth JSON file from `XAI_AUTH_JSON` on every call and uses only its `access_token`; an external CLIProxyAPI process owns refresh and write-back. Instance fields `authJson`/`authJsonEnv` and `model`/`modelEnv` override the path and model. `xai_web_search` accepts at most five allow or exclude domains (mutually exclusive); `xai_x_search` rejects `freshness`. Model-backed search can take longer than ordinary API searches; Search defaults allow up to 60 seconds per attempt and 120 seconds total.
|
|
168
|
+
|
|
166
169
|
### Credentials and URLs
|
|
167
170
|
|
|
168
171
|
Environment variables take precedence over plaintext keys in JSON. Built-in instances support these standard variables:
|
|
@@ -171,6 +174,7 @@ Environment variables take precedence over plaintext keys in JSON. Built-in inst
|
|
|
171
174
|
| --- | --- | --- |
|
|
172
175
|
| Tavily | `TAVILY_API_KEY` | `TAVILY_BASE_URL` |
|
|
173
176
|
| Exa | `EXA_API_KEY` | `EXA_BASE_URL` |
|
|
177
|
+
| Bocha | `BOCHA_API_KEY` | `BOCHA_BASE_URL`, default `https://api.bocha.cn` |
|
|
174
178
|
| Brave | `BRAVE_API_KEY` | `BRAVE_BASE_URL` |
|
|
175
179
|
| SearXNG | None | `SEARXNG_BASE_URL`, required |
|
|
176
180
|
| Firecrawl | `FIRECRAWL_API_KEY` | `FIRECRAWL_BASE_URL` |
|
|
@@ -179,6 +183,7 @@ Environment variables take precedence over plaintext keys in JSON. Built-in inst
|
|
|
179
183
|
| AnySearch | `ANYSEARCH_API_KEY`, optional | `ANYSEARCH_BASE_URL`, default `https://api.anysearch.com` |
|
|
180
184
|
| XCrawl | `XCRAWL_API_KEY` | `XCRAWL_BASE_URL`, default `https://run.xcrawl.com` |
|
|
181
185
|
| DeepSeek | `DEEPSEEK_API_KEY` | No standard environment variable; default `https://api.deepseek.com/anthropic/v1` |
|
|
186
|
+
| xAI Search | `XAI_AUTH_JSON` | No standard API-key variable; default `https://cli-chat-proxy.grok.com/v1`, model `grok-4.6` |
|
|
182
187
|
|
|
183
188
|
Custom instances use `apiKeyEnv` and `baseUrlEnv` to name their environment variables. Every remote provider can define a `baseUrl` and additional `headers`. The public `api.firecrawl.dev` service requires a key; a self-hosted Firecrawl v2 instance can run without one.
|
|
184
189
|
|
|
@@ -198,7 +203,7 @@ An attempt keeps the provider's original error code, HTTP status, and `retryable
|
|
|
198
203
|
|
|
199
204
|
Selecting an instance explicitly executes it strictly without fallback. If the instance is not in the route, the command returns `provider_disabled`.
|
|
200
205
|
|
|
201
|
-
Default limits are a
|
|
206
|
+
Default limits are a 120-second total timeout and a 60-second per-attempt timeout for Search, and 120 seconds and 45 seconds respectively for Extract. Each response has a hard limit of 5 MiB. `--timeout` overrides only the total timeout for the current command.
|
|
202
207
|
|
|
203
208
|
## Output contract
|
|
204
209
|
|
|
@@ -222,15 +227,29 @@ Capability commands use output schema version 2. Their default envelope is inten
|
|
|
222
227
|
}
|
|
223
228
|
```
|
|
224
229
|
|
|
225
|
-
|
|
230
|
+
With `--json`, capability output contains only `schemaVersion`, `ok`, the final Instance ID and normalized `data`. Failures contain a compact `error` and, when providers were attempted, `attempts` entries with only Instance ID, error code and optional HTTP status. Extract quality failures may include a `partial` document without raw provider data. If the learned order cannot be written, either a success or failure envelope additionally contains `warnings: [{ "code": "provider_order_update_failed", "message": "..." }]` without replacing the primary result. Search and extract input errors use the same compact failure shape.
|
|
231
|
+
|
|
232
|
+
For human-readable output, extraction starts with YAML front matter and then the provider-normalized Markdown body. Search results use a numbered Markdown list; diagnostics and config edit use a heading plus pretty-printed JSON data. Metadata values use JSON double-quoted scalar encoding and the body is not modified. Existing scripts and other machine consumers should append `--json` explicitly.
|
|
233
|
+
|
|
234
|
+
Example default extract output:
|
|
235
|
+
|
|
236
|
+
```markdown
|
|
237
|
+
---
|
|
238
|
+
provider: "local_http"
|
|
239
|
+
url: "https://example.com/article"
|
|
240
|
+
title: "Example title"
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
# Article content
|
|
244
|
+
```
|
|
226
245
|
|
|
227
|
-
|
|
246
|
+
All success and failure envelopes use schema version 2. Stable schemas are available in [schemas](schemas).
|
|
228
247
|
|
|
229
248
|
Exit codes:
|
|
230
249
|
|
|
231
250
|
- `0`: Success
|
|
232
251
|
- `2`: Invalid input or configuration, or an unknown or disabled provider
|
|
233
|
-
- `1`: Runtime, provider, doctor, or
|
|
252
|
+
- `1`: Runtime, provider, doctor, or editor launch failure
|
|
234
253
|
- `130`: User cancellation
|
|
235
254
|
|
|
236
255
|
`providers` lists each instance's type, capabilities, route status, credential source, and base URL source. Its `searchRoute` and `extractRoute` fields show the effective order for the next `auto` call. `doctor` performs local configuration checks only and does not call remote APIs. If an enabled route contains an unconfigured instance, the command returns `doctor_failed` with exit code `1`.
|
package/README_CN.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
[](https://github.com/Juexe/web-access-cli/actions/workflows/ci.yml)
|
|
6
6
|
[](LICENSE)
|
|
7
7
|
|
|
8
|
-
一个 Agent-neutral 的网页能力 CLI。它把“搜索”和“网页正文提取”定义为稳定能力,把 Tavily、Exa、Brave、SearXNG、AnySearch、XCrawl、DeepSeek、Firecrawl、Jina 等差异收敛到内部统一 schema。
|
|
8
|
+
一个 Agent-neutral 的网页能力 CLI。它把“搜索”和“网页正文提取”定义为稳定能力,把 Tavily、Exa、Bocha、Brave、SearXNG、AnySearch、XCrawl、DeepSeek、Firecrawl、Jina 等差异收敛到内部统一 schema。
|
|
9
9
|
|
|
10
10
|
CLI 是主要产品形态,不绑定 Pi、Claude Code、Codex、Cursor、OpenCode 或其他 Agent。Skill、MCP 和 Agent 插件只能作为 CLI 上层 adapter 接入,不能污染核心能力和 Provider 实现。
|
|
11
11
|
|
|
@@ -13,7 +13,7 @@ CLI 是主要产品形态,不绑定 Pi、Claude Code、Codex、Cursor、OpenCo
|
|
|
13
13
|
|
|
14
14
|
| 能力 | Provider Type | 统一输出 |
|
|
15
15
|
| --- | --- | --- |
|
|
16
|
-
| `search` | Tavily、Exa、Brave、SearXNG、AnySearch、XCrawl、DeepSeek | `rank`、`title`、`url`、`snippet` |
|
|
16
|
+
| `search` | Tavily、Exa、Bocha、Brave、SearXNG、AnySearch、XCrawl、DeepSeek、xAI x_search、xAI web_search | `rank`、`title`、`url`、`snippet` |
|
|
17
17
|
| `extract` | Firecrawl v2、Jina Reader、Exa Contents、AnySearch、XCrawl、HTTP | Markdown `Document` |
|
|
18
18
|
|
|
19
19
|
Provider Type 描述实现类型;Provider Instance 是一份可配置实例。一个 Type 可以有多个 Instance,例如 `exa_team` 和 `exa_personal`。`providers` Route 是有序 Instance ID 数组,决定启用状态和 `auto` 的初始顺序;CLI 会把学习后的实际顺序保存在同级 `_providers`。
|
|
@@ -82,9 +82,10 @@ web-access search "browser automation" --include-domain example.com --exclude-do
|
|
|
82
82
|
|
|
83
83
|
web-access extract https://example.com/article
|
|
84
84
|
web-access extract https://example.com/article --provider http --timeout 30000
|
|
85
|
+
web-access extract https://example.com/article --json
|
|
85
86
|
|
|
86
|
-
web-access providers
|
|
87
|
-
web-access doctor
|
|
87
|
+
web-access providers
|
|
88
|
+
web-access doctor
|
|
88
89
|
|
|
89
90
|
web-access config edit
|
|
90
91
|
web-access --config "/path/to/config.json" config edit
|
|
@@ -95,10 +96,10 @@ CLI 提供 `search`、`extract` 两个能力命令,`providers`、`doctor` 两
|
|
|
95
96
|
### 通用选项
|
|
96
97
|
|
|
97
98
|
- `--config <path>`:显式指定配置文件。
|
|
98
|
-
- `--
|
|
99
|
+
- `--json`:输出紧凑 schema v2 JSON envelope;不指定时,成功命令输出面向人的 Markdown,失败始终输出 JSON。
|
|
99
100
|
- `--help`、`--version`:输出常规 CLI 帮助或版本文本。
|
|
100
101
|
|
|
101
|
-
|
|
102
|
+
成功命令默认输出面向人的 Markdown。`search` 输出 YAML front matter 和编号结果列表;`extract` 输出 YAML front matter 和规范化后的 Markdown 正文;`providers`、`doctor` 和 `config edit` 输出标题和格式化 JSON 数据。需要 schema v2 envelope 时显式追加 `--json`。提取失败(包括 `partial`)以及所有失败路径始终输出 JSON envelope。诊断信息不会混入 stdout。
|
|
102
103
|
|
|
103
104
|
## 配置
|
|
104
105
|
|
|
@@ -106,7 +107,7 @@ CLI 提供 `search`、`extract` 两个能力命令,`providers`、`doctor` 两
|
|
|
106
107
|
|
|
107
108
|
所有平台的默认路径均为 `~/.config/web-access-cli/config.json`,其中 `~` 表示当前用户的主目录。环境变量 `WEB_ACCESS_CONFIG` 可以指定其他路径;命令行 `--config` 优先级更高。
|
|
108
109
|
|
|
109
|
-
`web-access config edit`
|
|
110
|
+
`web-access config edit` 会在配置文件缺失时创建父目录和完整默认配置,再优先使用 `VISUAL`、其次使用 `EDITOR` 打开;变量值可以包含带引号的可执行文件路径和参数,解析时不会执行 shell,并将配置路径作为独立的最后一个参数传入。已有文件会原样打开,即使内容暂时不是有效 JSON 也不会被覆盖或格式化。命令只等待编辑器进程启动,不等待编辑器关闭。两个变量都未设置、格式无效或启动失败时返回 `open_failed`;如果配置刚刚创建成功,文件仍会保留以便手动编辑。
|
|
110
111
|
|
|
111
112
|
`config edit` 本身不会改写已有内容;能力命令使用 `auto` 成功或发生可回退失败后,会原子更新 `search._providers` 或 `extract._providers`。默认配置尚不存在时,首次产生学习结果的 `auto` 调用会创建完整默认配置。`_providers` 由 CLI 管理,不会启用 `providers` 之外的 Instance;其内容缺失、格式错误、重复、引用未知 ID 或与 `providers` 成员集合不一致时会整组重置。删除 `_providers` 可以手动恢复用户声明的初始顺序。
|
|
112
113
|
|
|
@@ -114,7 +115,7 @@ CLI 提供 `search`、`extract` 两个能力命令,`providers`、`doctor` 两
|
|
|
114
115
|
|
|
115
116
|
```json
|
|
116
117
|
{
|
|
117
|
-
"$schema": "https://unpkg.com/web-access-cli@0.
|
|
118
|
+
"$schema": "https://unpkg.com/web-access-cli@0.4.0/schemas/config.schema.json",
|
|
118
119
|
"providers": [
|
|
119
120
|
{
|
|
120
121
|
"id": "exa_team",
|
|
@@ -138,8 +139,8 @@ CLI 提供 `search`、`extract` 两个能力命令,`providers`、`doctor` 两
|
|
|
138
139
|
"search": {
|
|
139
140
|
"providers": ["searx_local", "exa_team", "brave"],
|
|
140
141
|
"limit": 5,
|
|
141
|
-
"timeoutMs":
|
|
142
|
-
"attemptTimeoutMs":
|
|
142
|
+
"timeoutMs": 120000,
|
|
143
|
+
"attemptTimeoutMs": 60000,
|
|
143
144
|
"maxResponseBytes": 5242880
|
|
144
145
|
},
|
|
145
146
|
"extract": {
|
|
@@ -152,17 +153,19 @@ CLI 提供 `search`、`extract` 两个能力命令,`providers`、`doctor` 两
|
|
|
152
153
|
}
|
|
153
154
|
```
|
|
154
155
|
|
|
155
|
-
内置 Instance 为 `tavily`、`exa`、`brave`、`searxng`、`firecrawl`、`jina`、`http`、`anysearch`、`xcrawl`、`deepseek`。配置同 ID 时会覆盖内置实例的字段;自定义 ID 可以创建同 Type 的额外实例。只有出现在对应 `providers` Route 中的实例才启用。AnySearch 默认 base URL 为 `https://api.anysearch.com`,支持匿名调用;XCrawl 默认 base URL 为 `https://run.xcrawl.com`,必须配置 API key;DeepSeek 默认 base URL 为 `https://api.deepseek.com/anthropic/v1`,必须配置 API key。
|
|
156
|
+
内置 Instance 为 `tavily`、`exa`、`bocha`、`brave`、`searxng`、`firecrawl`、`jina`、`http`、`anysearch`、`xcrawl`、`deepseek`、`xai_x_search`、`xai_web_search`。配置同 ID 时会覆盖内置实例的字段;自定义 ID 可以创建同 Type 的额外实例。只有出现在对应 `providers` Route 中的实例才启用。Bocha 默认 base URL 为 `https://api.bocha.cn`,必须配置 API key;AnySearch 默认 base URL 为 `https://api.anysearch.com`,支持匿名调用;XCrawl 默认 base URL 为 `https://run.xcrawl.com`,必须配置 API key;DeepSeek 默认 base URL 为 `https://api.deepseek.com/anthropic/v1`,必须配置 API key。
|
|
156
157
|
|
|
157
158
|
默认 Route:
|
|
158
159
|
|
|
159
|
-
- Search:`tavily -> exa -> brave -> searxng -> anysearch -> xcrawl -> deepseek`
|
|
160
|
+
- Search:`tavily -> exa -> bocha -> brave -> searxng -> anysearch -> xcrawl -> deepseek -> xai_web_search`
|
|
160
161
|
- Extract:`firecrawl -> jina -> exa -> anysearch -> xcrawl -> http`
|
|
161
162
|
|
|
162
163
|
默认 Route 包含支持对应 Capability 的全部内置 Instance。自定义 ID 会合并到 Instance 列表,但仍需显式加入 Route;省略 Route 时使用上述默认值,显式空数组则禁用对应能力。`auto` 会跳过未完成配置的 Instance;AnySearch 使用默认 base URL 时可匿名调用,XCrawl 和 DeepSeek 则在配置 API key 前被跳过。AnySearch 与 XCrawl 可设置 `searchFilterMode`:`strict`(默认,遇到 freshness 时跳过)或 `best_effort`(将日期改写为查询片段)。域名条件会改写查询并在本地再次严格过滤。XCrawl Extract 固定使用同步 Scrape 的 Markdown 输出;Map、Crawl 和异步任务不属于当前 CLI 能力。
|
|
163
164
|
|
|
164
165
|
DeepSeek Search 通过 Anthropic-compatible Messages API 调用原生 `web_search_20250305` server tool,一次搜索是完整模型轮次,因此延迟和成本可能高于专用搜索 endpoint。它位于默认 Route 末尾,仅在前序 Provider 未配置、返回最终非 2xx HTTP 响应或发生其他可恢复失败后触发。Adapter 只接受 `web_search_tool_result` 中的结构化 URL,按 URL 合并 citation 摘要,绝不从模型 prose 中猜测 URL。域名条件会改写查询并在本地再次严格过滤;DeepSeek 不支持 `freshness`,遇到该参数时以可恢复错误跳过;重定向会被严格拒绝,且不会访问 `Location` 目标。Provider 私有的 `encrypted_content` 是 CLI 无法展示或解码的 opaque payload,不具备诊断价值,因此会从 `raw` 中移除。
|
|
165
166
|
|
|
167
|
+
XAI hosted Search 使用 `XAI_AUTH_JSON` 指向外部 OAuth JSON 文件,每次调用只读取 `access_token`,由外部 CLIProxyAPI 负责刷新和回写。可用 `authJson`/`authJsonEnv` 与 `model`/`modelEnv` 为实例覆盖路径和模型。`xai_web_search` 支持最多 5 个 allow 或 exclude 域名(两者不能同时使用);`xai_x_search` 不接受 `freshness`。模型搜索可能需要更长时间;Search 默认单次超时 60 秒、总超时 120 秒。
|
|
168
|
+
|
|
166
169
|
### 凭据和 URL
|
|
167
170
|
|
|
168
171
|
环境变量优先于 JSON 中的明文 key。内置 Instance 支持这些标准变量:
|
|
@@ -171,6 +174,7 @@ DeepSeek Search 通过 Anthropic-compatible Messages API 调用原生 `web_searc
|
|
|
171
174
|
| --- | --- | --- |
|
|
172
175
|
| Tavily | `TAVILY_API_KEY` | `TAVILY_BASE_URL` |
|
|
173
176
|
| Exa | `EXA_API_KEY` | `EXA_BASE_URL` |
|
|
177
|
+
| Bocha | `BOCHA_API_KEY` | `BOCHA_BASE_URL`,默认 `https://api.bocha.cn` |
|
|
174
178
|
| Brave | `BRAVE_API_KEY` | `BRAVE_BASE_URL` |
|
|
175
179
|
| SearXNG | 无 | `SEARXNG_BASE_URL`,必需 |
|
|
176
180
|
| Firecrawl | `FIRECRAWL_API_KEY` | `FIRECRAWL_BASE_URL` |
|
|
@@ -179,6 +183,7 @@ DeepSeek Search 通过 Anthropic-compatible Messages API 调用原生 `web_searc
|
|
|
179
183
|
| AnySearch | `ANYSEARCH_API_KEY`,可选 | `ANYSEARCH_BASE_URL`,默认 `https://api.anysearch.com` |
|
|
180
184
|
| XCrawl | `XCRAWL_API_KEY` | `XCRAWL_BASE_URL`,默认 `https://run.xcrawl.com` |
|
|
181
185
|
| DeepSeek | `DEEPSEEK_API_KEY` | 无标准环境变量;默认 `https://api.deepseek.com/anthropic/v1` |
|
|
186
|
+
| xAI Search | `XAI_AUTH_JSON` | 无标准环境变量;默认 `https://cli-chat-proxy.grok.com/v1`,模型 `grok-4.6` |
|
|
182
187
|
|
|
183
188
|
自定义 Instance 使用 `apiKeyEnv` 和 `baseUrlEnv` 指定自己的环境变量。所有远端 Provider 都可以设置 `baseUrl` 和附加 `headers`。公共 `api.firecrawl.dev` 需要 key;自托管 Firecrawl v2 可以不设置 key。
|
|
184
189
|
|
|
@@ -198,7 +203,7 @@ Attempt 会保留 Provider 的原始错误码、HTTP status 和 `retryable` 值
|
|
|
198
203
|
|
|
199
204
|
显式指定 Instance 时严格执行,不触发 fallback。若实例不在 Route 中,返回 `provider_disabled`。
|
|
200
205
|
|
|
201
|
-
默认上限:Search 总超时/单次超时为 60s
|
|
206
|
+
默认上限:Search 总超时/单次超时为 120s/60s,Extract 为 120s/45s;单个响应硬上限为 5 MiB。`--timeout` 只覆盖本次命令的总超时。
|
|
202
207
|
|
|
203
208
|
## 输出契约
|
|
204
209
|
|
|
@@ -222,15 +227,29 @@ Attempt 会保留 Provider 的原始错误码、HTTP status 和 `retryable` 值
|
|
|
222
227
|
}
|
|
223
228
|
```
|
|
224
229
|
|
|
225
|
-
|
|
230
|
+
使用 `--json` 时,能力命令成功只包含 `schemaVersion`、`ok`、最终 Instance ID 和规范化 `data`。失败时包含精简 `error`;实际尝试过 Provider 时,`attempts` 只保留 Instance ID、错误码和可选 HTTP status。提取质量失败可包含不含 raw 的 `partial` 文档。排序无法写回时,成功或失败 envelope 会额外包含 `warnings: [{ "code": "provider_order_update_failed", "message": "..." }]`,但不会覆盖主要结果。搜索和提取输入错误也使用相同的精简失败结构。
|
|
231
|
+
|
|
232
|
+
面向人的输出中,提取以 YAML front matter 开头、随后是 Provider 规范化的 Markdown 正文;搜索使用编号 Markdown 列表;诊断和配置编辑使用标题加格式化 JSON 数据。元数据值统一使用 JSON 双引号标量编码,正文内容不改写。已有脚本和其他机器消费者应显式追加 `--json`。
|
|
233
|
+
|
|
234
|
+
默认提取输出示例:
|
|
235
|
+
|
|
236
|
+
```markdown
|
|
237
|
+
---
|
|
238
|
+
provider: "local_http"
|
|
239
|
+
url: "https://example.com/article"
|
|
240
|
+
title: "Example title"
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
# Article content
|
|
244
|
+
```
|
|
226
245
|
|
|
227
|
-
|
|
246
|
+
所有成功和失败 envelope 使用 schema version 2。稳定 schema 位于 [schemas](schemas)。
|
|
228
247
|
|
|
229
248
|
退出码:
|
|
230
249
|
|
|
231
250
|
- `0`:成功
|
|
232
251
|
- `2`:输入、配置、未知或未启用 provider
|
|
233
|
-
- `1`:运行时/provider/doctor
|
|
252
|
+
- `1`:运行时/provider/doctor/编辑器启动失败
|
|
234
253
|
- `130`:用户取消
|
|
235
254
|
|
|
236
255
|
`providers` 会列出每个 Instance 的 Type、能力、Route 启用状态、凭据来源和 base URL 来源;`searchRoute` 与 `extractRoute` 是下一次 `auto` 使用的有效顺序。`doctor` 只做本地配置检查,不主动调用远端 API;当已启用 Route 中存在未配置 Instance 时,命令返回 `doctor_failed` 和退出码 `1`。
|
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -46,6 +46,17 @@ DeepSeek Search Provider 的 Anthropic-compatible Messages wire shape、结构
|
|
|
46
46
|
|
|
47
47
|
动态 Settings、Credential Service、Session event、LLM seam 和 Agent 集成代码没有进入本项目。
|
|
48
48
|
|
|
49
|
+
## Grok Build xAI Search
|
|
50
|
+
|
|
51
|
+
The xAI hosted search request and response mapping is derived from the `grok-build` project:
|
|
52
|
+
|
|
53
|
+
- Repository: `https://github.com/xai-org/grok-build`
|
|
54
|
+
- Source revision: `a549186d9d39311f2d3ee4208db62af8c65aa476`
|
|
55
|
+
- Copyright 2023-2026 SpaceXAI
|
|
56
|
+
- License: Apache-2.0
|
|
57
|
+
|
|
58
|
+
The adapted code is limited to the Responses tool wire shape and citation mapping. The full Apache-2.0 license is retained in the upstream repository.
|
|
59
|
+
|
|
49
60
|
## npm 依赖
|
|
50
61
|
|
|
51
62
|
发行包直接使用以下开源组件:
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
function yamlScalar(value) {
|
|
2
|
+
return JSON.stringify(value);
|
|
3
|
+
}
|
|
4
|
+
export function formatExtractMarkdown(envelope) {
|
|
5
|
+
const { document } = envelope.data;
|
|
6
|
+
const lines = [
|
|
7
|
+
"---",
|
|
8
|
+
`provider: ${yamlScalar(envelope.provider)}`,
|
|
9
|
+
`url: ${yamlScalar(document.sourceUrl)}`,
|
|
10
|
+
];
|
|
11
|
+
const title = document.title.trim();
|
|
12
|
+
if (title)
|
|
13
|
+
lines.push(`title: ${yamlScalar(title)}`);
|
|
14
|
+
lines.push("---", "", "");
|
|
15
|
+
const content = document.content;
|
|
16
|
+
return `${lines.join("\n")}${content.endsWith("\n") ? content : `${content}\n`}`;
|
|
17
|
+
}
|
|
18
|
+
export function formatMarkdown(envelope) {
|
|
19
|
+
if ("provider" in envelope && "document" in envelope.data)
|
|
20
|
+
return formatExtractMarkdown(envelope);
|
|
21
|
+
if ("provider" in envelope && "results" in envelope.data) {
|
|
22
|
+
const e = envelope;
|
|
23
|
+
const body = e.data.results
|
|
24
|
+
.map((result, index) => `${index + 1}. [${result.title}](${result.url})${result.snippet ? `\n ${result.snippet}` : ""}`)
|
|
25
|
+
.join("\n");
|
|
26
|
+
return `---\nprovider: ${JSON.stringify(e.provider)}\n---\n\n${body || "无搜索结果"}\n`;
|
|
27
|
+
}
|
|
28
|
+
if ("command" in envelope && envelope.ok) {
|
|
29
|
+
const e = envelope;
|
|
30
|
+
return `# ${e.command}\n\n${JSON.stringify(e.data, null, 2)}\n`;
|
|
31
|
+
}
|
|
32
|
+
return "";
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=cli-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-output.js","sourceRoot":"","sources":["../src/cli-output.ts"],"names":[],"mappings":"AAUA,SAAS,UAAU,CAAC,KAAa;IAChC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,qBAAqB,CACpC,QAAgC;IAEhC,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC;IACnC,MAAM,KAAK,GAAG;QACb,KAAK;QACL,aAAa,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAC5C,QAAQ,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;KACxC,CAAC;IACF,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1B,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;IACjC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,EAAE,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAwB;IACtD,IAAI,UAAU,IAAI,QAAQ,IAAI,UAAU,IAAI,QAAQ,CAAC,IAAI;QACxD,OAAO,qBAAqB,CAAC,QAAkC,CAAC,CAAC;IAClE,IAAI,UAAU,IAAI,QAAQ,IAAI,SAAS,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC1D,MAAM,CAAC,GAAG,QAAiC,CAAC;QAC5C,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO;aACzB,GAAG,CACH,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACjB,GAAG,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAClG;aACA,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,OAAO,kBAAkB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,IAAI,IAAI,OAAO,IAAI,CAAC;IACpF,CAAC;IACD,IAAI,SAAS,IAAI,QAAQ,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,QAAiE,CAAC;QAC5E,OAAO,KAAK,CAAC,CAAC,OAAO,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IACjE,CAAC;IACD,OAAO,EAAE,CAAC;AACX,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { realpathSync } from "node:fs";
|
|
3
3
|
import { pathToFileURL } from "node:url";
|
|
4
4
|
import { Command, CommanderError, InvalidArgumentError, Option, } from "commander";
|
|
5
|
+
import { formatMarkdown } from "./cli-output.js";
|
|
5
6
|
import { loadConfig } from "./config/config.js";
|
|
6
7
|
import { executeConfigEdit } from "./config/edit.js";
|
|
7
8
|
import { createProviderOrderWriter } from "./config/provider-order.js";
|
|
@@ -46,8 +47,15 @@ function exitCode(envelope) {
|
|
|
46
47
|
return 2;
|
|
47
48
|
return 1;
|
|
48
49
|
}
|
|
49
|
-
function writeEnvelope(envelope
|
|
50
|
-
process.stdout.write(`${JSON.stringify(envelope
|
|
50
|
+
function writeEnvelope(envelope) {
|
|
51
|
+
process.stdout.write(`${JSON.stringify(envelope)}\n`);
|
|
52
|
+
}
|
|
53
|
+
function writeOutput(envelope, mode) {
|
|
54
|
+
if (mode === "markdown" && envelope.ok) {
|
|
55
|
+
process.stdout.write(formatMarkdown(envelope));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
writeEnvelope(envelope);
|
|
51
59
|
}
|
|
52
60
|
export function createProgram(run, dependencies = {}) {
|
|
53
61
|
const program = new Command();
|
|
@@ -57,7 +65,7 @@ export function createProgram(run, dependencies = {}) {
|
|
|
57
65
|
.description("Agent-neutral 的网页搜索与内容提取 CLI")
|
|
58
66
|
.version(VERSION)
|
|
59
67
|
.option("--config <path>", "指定 JSON 配置文件")
|
|
60
|
-
.option("--
|
|
68
|
+
.option("--json", "输出 JSON envelope", false)
|
|
61
69
|
.showSuggestionAfterError();
|
|
62
70
|
program.configureOutput({ writeErr: () => { }, outputError: () => { } });
|
|
63
71
|
program.exitOverride();
|
|
@@ -75,7 +83,7 @@ export function createProgram(run, dependencies = {}) {
|
|
|
75
83
|
.option("--include-domain <domain>", "仅包含域名,可重复", collect, [])
|
|
76
84
|
.option("--exclude-domain <domain>", "排除域名,可重复", collect, [])
|
|
77
85
|
.option("--timeout <milliseconds>", "总超时毫秒数", integer)
|
|
78
|
-
.option("--
|
|
86
|
+
.option("--json", "输出 JSON envelope", false)
|
|
79
87
|
.action((query, options) => {
|
|
80
88
|
run(async () => {
|
|
81
89
|
const globals = program.opts();
|
|
@@ -96,21 +104,23 @@ export function createProgram(run, dependencies = {}) {
|
|
|
96
104
|
return executeSearch(request, {
|
|
97
105
|
loaded,
|
|
98
106
|
signal: processSignal.signal,
|
|
99
|
-
debug: options.debug,
|
|
100
107
|
persistProviderOrder: createProviderOrderWriter(loaded),
|
|
101
108
|
});
|
|
102
|
-
})
|
|
109
|
+
}, options.json || program.opts().json
|
|
110
|
+
? "json"
|
|
111
|
+
: "markdown");
|
|
103
112
|
});
|
|
104
113
|
program
|
|
105
114
|
.command("extract")
|
|
106
|
-
.description("提取网页正文并转换为 Markdown")
|
|
115
|
+
.description("提取网页正文并转换为 Markdown(使用 --json 输出 JSON)")
|
|
107
116
|
.argument("<url>", "HTTP(S) URL")
|
|
108
117
|
.option("-p, --provider <id>", "provider instance id,或 auto", "auto")
|
|
109
118
|
.option("--timeout <milliseconds>", "总超时毫秒数", integer)
|
|
110
|
-
.option("--
|
|
119
|
+
.option("--json", "输出 JSON envelope", false)
|
|
111
120
|
.action((url, options) => {
|
|
121
|
+
const globals = program.opts();
|
|
122
|
+
const outputMode = options.json || globals.json ? "json" : "markdown";
|
|
112
123
|
run(async () => {
|
|
113
|
-
const globals = program.opts();
|
|
114
124
|
const loaded = loadConfig(globals.config);
|
|
115
125
|
const request = {
|
|
116
126
|
url: httpUrl(url),
|
|
@@ -120,26 +130,34 @@ export function createProgram(run, dependencies = {}) {
|
|
|
120
130
|
return executeExtract(request, {
|
|
121
131
|
loaded,
|
|
122
132
|
signal: processSignal.signal,
|
|
123
|
-
debug: options.debug,
|
|
124
133
|
persistProviderOrder: createProviderOrderWriter(loaded),
|
|
125
134
|
});
|
|
126
|
-
});
|
|
135
|
+
}, outputMode);
|
|
127
136
|
});
|
|
128
137
|
program
|
|
129
138
|
.command("providers")
|
|
130
139
|
.description("列出 provider instance、route 与配置状态")
|
|
131
|
-
.
|
|
140
|
+
.option("--json", "输出 JSON envelope", false)
|
|
141
|
+
.action((options) => run(() => executeProviders(loadConfig(program.opts().config)), options.json || program.opts().json
|
|
142
|
+
? "json"
|
|
143
|
+
: "markdown"));
|
|
132
144
|
program
|
|
133
145
|
.command("doctor")
|
|
134
146
|
.description("检查本地配置与已启用 provider 的可用性")
|
|
135
|
-
.
|
|
147
|
+
.option("--json", "输出 JSON envelope", false)
|
|
148
|
+
.action((options) => run(() => executeDoctor(loadConfig(program.opts().config)), options.json || program.opts().json
|
|
149
|
+
? "json"
|
|
150
|
+
: "markdown"));
|
|
136
151
|
const config = program.command("config").description("管理配置文件");
|
|
137
152
|
config
|
|
138
153
|
.command("edit")
|
|
139
|
-
.description("
|
|
140
|
-
.
|
|
154
|
+
.description("创建默认配置文件并用 VISUAL 或 EDITOR 打开")
|
|
155
|
+
.option("--json", "输出 JSON envelope", false)
|
|
156
|
+
.action((options) => run(() => runConfigEdit({
|
|
141
157
|
explicitPath: program.opts().config,
|
|
142
|
-
}))
|
|
158
|
+
}), options.json || program.opts().json
|
|
159
|
+
? "json"
|
|
160
|
+
: "markdown"));
|
|
143
161
|
return program;
|
|
144
162
|
}
|
|
145
163
|
function envelopeCommand(args) {
|
|
@@ -155,12 +173,14 @@ const processSignal = new AbortController();
|
|
|
155
173
|
process.once("SIGINT", () => processSignal.abort());
|
|
156
174
|
async function main() {
|
|
157
175
|
let pending;
|
|
158
|
-
|
|
176
|
+
let pendingOutputMode = "json";
|
|
177
|
+
const program = createProgram((task, mode = "json") => {
|
|
178
|
+
pendingOutputMode = mode;
|
|
159
179
|
pending = Promise.resolve().then(task);
|
|
160
180
|
});
|
|
161
181
|
if (process.argv.length <= 2) {
|
|
162
182
|
const envelope = errorEnvelope(new WebAccessError("invalid_input", "必须指定命令"));
|
|
163
|
-
writeEnvelope(envelope
|
|
183
|
+
writeEnvelope(envelope);
|
|
164
184
|
process.exitCode = 2;
|
|
165
185
|
return;
|
|
166
186
|
}
|
|
@@ -169,7 +189,7 @@ async function main() {
|
|
|
169
189
|
if (!pending)
|
|
170
190
|
throw new WebAccessError("invalid_input", "必须指定命令");
|
|
171
191
|
const envelope = await pending;
|
|
172
|
-
|
|
192
|
+
writeOutput(envelope, pendingOutputMode);
|
|
173
193
|
process.exitCode = exitCode(envelope);
|
|
174
194
|
}
|
|
175
195
|
catch (caught) {
|
|
@@ -184,7 +204,7 @@ async function main() {
|
|
|
184
204
|
: caught.message)
|
|
185
205
|
: asWebAccessError(caught);
|
|
186
206
|
const envelope = errorEnvelope(normalized, envelopeCommand(program.args));
|
|
187
|
-
writeEnvelope(envelope
|
|
207
|
+
writeEnvelope(envelope);
|
|
188
208
|
process.exitCode = exitCode(envelope);
|
|
189
209
|
}
|
|
190
210
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACN,OAAO,EACP,cAAc,EACd,oBAAoB,EACpB,MAAM,GACN,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQhF,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAWvC,SAAS,OAAO,CAAC,KAAa,EAAE,QAAkB;IACjD,OAAO,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;QAC9C,MAAM,IAAI,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC7B,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACJ,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,cAAc,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;QACxD,MAAM,IAAI,cAAc,CAAC,eAAe,EAAE,uBAAuB,CAAC,CAAC;IACpE,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACvB,CAAC;AAED,SAAS,QAAQ,CAAC,QAAwB;IACzC,IAAI,QAAQ,CAAC,EAAE;QAAE,OAAO,CAAC,CAAC;IAC1B,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IAClD,IACC;QACC,eAAe;QACf,cAAc;QACd,kBAAkB;QAClB,mBAAmB;KACnB,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;QAE/B,OAAO,CAAC,CAAC;IACV,OAAO,CAAC,CAAC;AACV,CAAC;AAED,SAAS,aAAa,CAAC,QAAwB
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|