scoutline 0.14.11 → 0.15.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 +20 -5
- package/dist/capabilities/diagnostics.d.ts +7 -0
- package/dist/capabilities/diagnostics.d.ts.map +1 -1
- package/dist/capabilities/diagnostics.js.map +1 -1
- package/dist/commands/config.d.ts +53 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +161 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/doctor.d.ts +6 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +9 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +87 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +89 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/config-store.d.ts +78 -3
- package/dist/lib/config-store.d.ts.map +1 -1
- package/dist/lib/config-store.js +341 -2
- package/dist/lib/config-store.js.map +1 -1
- package/dist/lib/config.js +1 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/providers/selection.d.ts +19 -0
- package/dist/providers/selection.d.ts.map +1 -1
- package/dist/providers/selection.js +24 -0
- package/dist/providers/selection.js.map +1 -1
- package/dist/providers/types.d.ts +7 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js +24 -0
- package/dist/providers/types.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -15,13 +15,13 @@
|
|
|
15
15
|
|
|
16
16
|
## Features
|
|
17
17
|
|
|
18
|
-
- **Vision** - Analyze images, screenshots, diagrams, charts, videos using GLM-
|
|
18
|
+
- **Vision** - Analyze images, screenshots, diagrams, charts, videos using GLM-5V-Turbo
|
|
19
19
|
- **Search** - Real-time web search with domain and recency filtering
|
|
20
20
|
- **Reader** - Fetch and parse web pages to markdown
|
|
21
21
|
- **Repo** - Search and read GitHub repository code via ZRead
|
|
22
22
|
- **Tools** - MCP tool discovery, schemas, and raw calls
|
|
23
23
|
- **Code Mode** - TypeScript tool chaining for agent automation
|
|
24
|
-
- **Provider selection** - Run shared capabilities through Z.AI, MiniMax, Tavily, Exa, Brave, or
|
|
24
|
+
- **Provider selection** - Run shared capabilities through Z.AI, MiniMax, Tavily, Exa, Brave, Firecrawl, Parallel AI, Perplexity, or Jina AI
|
|
25
25
|
|
|
26
26
|
## Quick Start
|
|
27
27
|
|
|
@@ -113,7 +113,17 @@ Shared commands (`search`, `vision`, `quota`, `doctor`, `repo`) accept a global
|
|
|
113
113
|
|
|
114
114
|
1. Explicit `--provider <zai|minimax|tavily|exa|brave|firecrawl|parallel|perplexity|jina>` on the command line
|
|
115
115
|
2. `SCOUTLINE_PROVIDER` environment variable
|
|
116
|
-
3.
|
|
116
|
+
3. Per-capability **routing table** (`config.json` `routing` key; the first
|
|
117
|
+
configured, capable provider in the list wins — over quota ranking)
|
|
118
|
+
4. Quota-ranked pick among configured, capable providers (registry-order tiebreak)
|
|
119
|
+
|
|
120
|
+
Set a standing preference once and skip per-command flags:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
scoutline config set routing.search tavily,brave # search prefers Tavily, then Brave
|
|
124
|
+
scoutline config set routing.crawl firecrawl
|
|
125
|
+
scoutline config get routing # view the effective table
|
|
126
|
+
```
|
|
117
127
|
|
|
118
128
|
Examples:
|
|
119
129
|
|
|
@@ -125,7 +135,7 @@ scoutline --provider minimax search "React 19 features"
|
|
|
125
135
|
export SCOUTLINE_PROVIDER=minimax
|
|
126
136
|
scoutline quota
|
|
127
137
|
|
|
128
|
-
# 3.
|
|
138
|
+
# 3/4. Routing table, then quota-ranked pick, when nothing is supplied
|
|
129
139
|
scoutline search "TypeScript best practices"
|
|
130
140
|
```
|
|
131
141
|
|
|
@@ -173,7 +183,7 @@ Provider selection, and `doctor`.
|
|
|
173
183
|
| `vision.chart` | Yes | Pending | No | No | No | No | No | No | No | Implemented, pending live conformance |
|
|
174
184
|
| `vision.diff` (image diff) | Yes | No | No | No | No | No | No | No | No | Z.AI-only (never MiniMax-claimable) |
|
|
175
185
|
| `vision.video` | Yes | No | No | No | No | No | No | No | No | Z.AI-only (never MiniMax-claimable) |
|
|
176
|
-
| `quota` | Yes | Yes | Yes | No | Yes | Yes (credits) | No | No |
|
|
186
|
+
| `quota` | Yes | Yes | Yes | No | Yes | Yes (credits) | No | No | Yes (rate-limit telemetry, not spend) | Normalized `QuotaDashboard` (ADR-0001) |
|
|
177
187
|
| `diagnostics` (`doctor`) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Lists every Provider; probes configured |
|
|
178
188
|
| `read` (Reader) | Yes | **No** | Yes | Yes | No | Yes | Yes | No | Yes | Parallel (Extract API) & Jina add Reader support |
|
|
179
189
|
| `crawl` | **No** | **No** | Yes | No | No | Yes (async) | No | No | No | Tavily sync; Firecrawl async (resumable after Ctrl-C) |
|
|
@@ -310,6 +320,11 @@ scoutline doctor --provider minimax # MiniMax connectivity
|
|
|
310
320
|
# Cache - inspect or clear the local cache
|
|
311
321
|
scoutline cache stats # show inventory of both subdirectories
|
|
312
322
|
scoutline cache clear # delete every file under cache/ and tools/
|
|
323
|
+
|
|
324
|
+
# Config - inspect and change settings (scriptable, always redacted)
|
|
325
|
+
scoutline config get # full config dump (credentials masked)
|
|
326
|
+
scoutline config set routing.search tavily,brave
|
|
327
|
+
scoutline config unset routing.search
|
|
313
328
|
```
|
|
314
329
|
|
|
315
330
|
## Output Format
|
|
@@ -142,6 +142,13 @@ export interface DiagnosticsReport {
|
|
|
142
142
|
readonly schemaVersion: 2;
|
|
143
143
|
readonly effectiveProvider: ProviderId;
|
|
144
144
|
readonly capabilityMatrix: readonly CapabilityProviderEntry[];
|
|
145
|
+
/**
|
|
146
|
+
* Effective per-capability routing table (routing-table plan):
|
|
147
|
+
* the post-validation, post-drop table from config.json, embedded
|
|
148
|
+
* additively (absent when no routing is configured — older readers
|
|
149
|
+
* never see the key). Provider-neutral: ids only, no credentials.
|
|
150
|
+
*/
|
|
151
|
+
readonly routing?: Readonly<Record<string, readonly ProviderId[]>>;
|
|
145
152
|
readonly node: {
|
|
146
153
|
readonly version: string;
|
|
147
154
|
readonly visionMcpCompatible: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/capabilities/diagnostics.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/capabilities/diagnostics.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/capabilities/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAGH,OAAO,EAAE,cAAc,EAA2B,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/capabilities/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAGH,OAAO,EAAE,cAAc,EAA2B,MAAM,kBAAkB,CAAC;AAoJ3E,8EAA8E;AAC9E,wCAAwC;AACxC,EAAE;AACF,6DAA6D;AAC7D,qEAAqE;AACrE,iEAAiE;AACjE,gEAAgE;AAChE,sBAAsB;AACtB,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,sBAAsB,CACpC,WAA0C;IAE1C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAEvD,qEAAqE;IACrE,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;IAEhE,+DAA+D;IAC/D,qEAAqE;IACrE,uBAAuB;IACvB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC3C,MAAM,OAAO,GAAyB,EAAE,CAAC;IACzC,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAED,gEAAgE;IAChE,oBAAoB;IACpB,MAAM,GAAG,GAA8B,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACzD,MAAM,SAAS,GAAiB,EAAE,CAAC;QACnC,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACpC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjB,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;gBACtC,IAAI,UAAU,EAAE,CAAC;oBACf,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;gBAChC,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,KAAK,CACb,uDAAuD,KAAK,6DAA6D,GAAG,GAAG,CAChI,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAA0B,EAAE,CAAC;IAC3F,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAc;IAKrD,MAAM,IAAI,GACR,KAAK,YAAY,cAAc,CAAC,CAAC,CAAE,KAAK,CAAC,IAA2B,CAAC,CAAC,CAAC,eAAe,CAAC;IACzF,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,MAAM,GAAiE;QAC3E,IAAI;QACJ,OAAO;KACR,CAAC;IACF,IAAI,KAAK,YAAY,cAAc,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IAC3B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config command — scriptable settings surface (routing-table plan,
|
|
3
|
+
* Ticket 4).
|
|
4
|
+
*
|
|
5
|
+
* Presentation-only over the typed key registry in `src/lib/config-store.ts`
|
|
6
|
+
* (Ticket 3): `resolveConfigKey` / `setConfigValue` / `unsetConfigValue`
|
|
7
|
+
* own validation and atomic persistence. The dispatcher wires production
|
|
8
|
+
* helpers; tests inject doubles.
|
|
9
|
+
*
|
|
10
|
+
* `get` output is ALWAYS redacted: values pass through `redactSecrets`
|
|
11
|
+
* against the merged env's credential values, and credential-bearing
|
|
12
|
+
* field names (e.g. `apiKey`) mask regardless — so a file-stored key is
|
|
13
|
+
* never printable. `set` refuses credential paths outright at the
|
|
14
|
+
* registry layer (API keys never ride argv, AGENTS.md).
|
|
15
|
+
*/
|
|
16
|
+
import type { CommandResult } from "../command-invocation.js";
|
|
17
|
+
import { type ScoutlineConfig } from "../lib/config-store.js";
|
|
18
|
+
export interface ConfigGetDependencies {
|
|
19
|
+
/** Read the current config (production: `readConfig`). */
|
|
20
|
+
readonly read: () => Promise<ScoutlineConfig>;
|
|
21
|
+
/** Credential values to redact against (production: `configuredSecrets(mergedEnv)`). */
|
|
22
|
+
readonly secrets: () => string[];
|
|
23
|
+
}
|
|
24
|
+
export interface ConfigSetDependencies {
|
|
25
|
+
/** Strict set (production: `setConfigValue`). */
|
|
26
|
+
readonly set: (path: string, value: string) => Promise<ScoutlineConfig>;
|
|
27
|
+
}
|
|
28
|
+
export interface ConfigUnsetDependencies {
|
|
29
|
+
/** Unset (production: `unsetConfigValue`). */
|
|
30
|
+
readonly unset: (path: string) => Promise<ScoutlineConfig>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* `config get [path]`. No path → the full redacted config. With a path
|
|
34
|
+
* → the redacted value at that path. Unknown paths fail with the valid
|
|
35
|
+
* roots listed.
|
|
36
|
+
*/
|
|
37
|
+
export declare function configGetCommand(path: string | undefined, deps: ConfigGetDependencies): Promise<CommandResult<unknown>>;
|
|
38
|
+
/**
|
|
39
|
+
* `config set <path> <value>`. Strict validation and credential
|
|
40
|
+
* refusal live in `setConfigValue`; this layer formats the result.
|
|
41
|
+
*/
|
|
42
|
+
export declare function configSetCommand(path: string, value: string, deps: ConfigSetDependencies): Promise<CommandResult<{
|
|
43
|
+
path: string;
|
|
44
|
+
value: unknown;
|
|
45
|
+
}>>;
|
|
46
|
+
/**
|
|
47
|
+
* `config unset <path>`. Removal semantics live in `unsetConfigValue`.
|
|
48
|
+
*/
|
|
49
|
+
export declare function configUnsetCommand(path: string, deps: ConfigUnsetDependencies): Promise<CommandResult<{
|
|
50
|
+
path: string;
|
|
51
|
+
}>>;
|
|
52
|
+
export declare const CONFIG_HELP: string;
|
|
53
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,wBAAwB,CAAC;AAQhC,MAAM,WAAW,qBAAqB;IACpC,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9C,wFAAwF;IACxF,QAAQ,CAAC,OAAO,EAAE,MAAM,MAAM,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IACpC,iDAAiD;IACjD,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;CACzE;AAED,MAAM,WAAW,uBAAuB;IACtC,8CAA8C;IAC9C,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;CAC5D;AA+CD;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAyBjC;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC,CAQ1D;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAO1C;AAED,eAAO,MAAM,WAAW,QA6ChB,CAAC"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config command — scriptable settings surface (routing-table plan,
|
|
3
|
+
* Ticket 4).
|
|
4
|
+
*
|
|
5
|
+
* Presentation-only over the typed key registry in `src/lib/config-store.ts`
|
|
6
|
+
* (Ticket 3): `resolveConfigKey` / `setConfigValue` / `unsetConfigValue`
|
|
7
|
+
* own validation and atomic persistence. The dispatcher wires production
|
|
8
|
+
* helpers; tests inject doubles.
|
|
9
|
+
*
|
|
10
|
+
* `get` output is ALWAYS redacted: values pass through `redactSecrets`
|
|
11
|
+
* against the merged env's credential values, and credential-bearing
|
|
12
|
+
* field names (e.g. `apiKey`) mask regardless — so a file-stored key is
|
|
13
|
+
* never printable. `set` refuses credential paths outright at the
|
|
14
|
+
* registry layer (API keys never ride argv, AGENTS.md).
|
|
15
|
+
*/
|
|
16
|
+
import { resolveConfigKey, unknownConfigKeyError, } from "../lib/config-store.js";
|
|
17
|
+
import { ValidationError } from "../lib/errors.js";
|
|
18
|
+
import { redactSecrets } from "../lib/redact.js";
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Presentation helpers (pure)
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
/** Render a routing table as human lines: `search → tavily, brave`. */
|
|
23
|
+
function formatRoutingLines(routing) {
|
|
24
|
+
const capabilities = Object.keys(routing).sort();
|
|
25
|
+
if (capabilities.length === 0)
|
|
26
|
+
return "(routing table is empty)";
|
|
27
|
+
return capabilities
|
|
28
|
+
.map((cap) => `${cap} → ${(routing[cap] ?? []).join(", ")}`)
|
|
29
|
+
.join("\n");
|
|
30
|
+
}
|
|
31
|
+
/** Render one non-routing value: `key → value`. */
|
|
32
|
+
function formatScalar(path, value) {
|
|
33
|
+
if (value === undefined || value === null)
|
|
34
|
+
return `${path} → (not set)`;
|
|
35
|
+
return `${path} → ${typeof value === "string" ? value : JSON.stringify(value)}`;
|
|
36
|
+
}
|
|
37
|
+
function textPresentations(text) {
|
|
38
|
+
return { compact: text, markdown: text, refs: text, tty: text };
|
|
39
|
+
}
|
|
40
|
+
/** Extract the raw (pre-redaction) value a resolved path points at. */
|
|
41
|
+
function valueAtPath(config, path) {
|
|
42
|
+
const trimmed = path.trim();
|
|
43
|
+
if (trimmed === "routing")
|
|
44
|
+
return config.routing;
|
|
45
|
+
if (trimmed.startsWith("routing."))
|
|
46
|
+
return config.routing?.[trimmed.slice("routing.".length)];
|
|
47
|
+
if (trimmed === "fallbackEnabled")
|
|
48
|
+
return config.fallbackEnabled;
|
|
49
|
+
const providerMatch = /^providers\.([a-z0-9-]+)(?:\.[A-Za-z0-9-]+)*$/.exec(trimmed);
|
|
50
|
+
if (providerMatch?.[1])
|
|
51
|
+
return config.providers[providerMatch[1]];
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
function presentationsFor(path, value) {
|
|
55
|
+
if (path.trim() === "routing" && typeof value === "object" && value !== null) {
|
|
56
|
+
return textPresentations(formatRoutingLines(value));
|
|
57
|
+
}
|
|
58
|
+
return textPresentations(formatScalar(path, value));
|
|
59
|
+
}
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
// Commands
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
/**
|
|
64
|
+
* `config get [path]`. No path → the full redacted config. With a path
|
|
65
|
+
* → the redacted value at that path. Unknown paths fail with the valid
|
|
66
|
+
* roots listed.
|
|
67
|
+
*/
|
|
68
|
+
export async function configGetCommand(path, deps) {
|
|
69
|
+
const config = await deps.read();
|
|
70
|
+
const secrets = deps.secrets();
|
|
71
|
+
if (path === undefined || path.trim().length === 0) {
|
|
72
|
+
const redacted = redactSecrets(config, secrets);
|
|
73
|
+
return { kind: "data", data: redacted };
|
|
74
|
+
}
|
|
75
|
+
const key = resolveConfigKey(path);
|
|
76
|
+
if (key === null || !key.gettable) {
|
|
77
|
+
// A typo'd routing capability is an unknown key here too — never a
|
|
78
|
+
// silent "(not set)"; other unknown paths list the valid roots.
|
|
79
|
+
throw path.trim().startsWith("routing.")
|
|
80
|
+
? unknownConfigKeyError(path)
|
|
81
|
+
: new ValidationError(`Unknown config key "${path}".`, 'Valid keys: routing, routing.<capability>, fallbackEnabled, providers.<id>. Run "scoutline config --help".');
|
|
82
|
+
}
|
|
83
|
+
const raw = valueAtPath(config, path);
|
|
84
|
+
const redacted = redactSecrets(raw ?? null, secrets);
|
|
85
|
+
return {
|
|
86
|
+
kind: "data",
|
|
87
|
+
data: redacted,
|
|
88
|
+
presentations: presentationsFor(path, redacted),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* `config set <path> <value>`. Strict validation and credential
|
|
93
|
+
* refusal live in `setConfigValue`; this layer formats the result.
|
|
94
|
+
*/
|
|
95
|
+
export async function configSetCommand(path, value, deps) {
|
|
96
|
+
const updated = await deps.set(path, value);
|
|
97
|
+
const raw = valueAtPath(updated, path);
|
|
98
|
+
return {
|
|
99
|
+
kind: "data",
|
|
100
|
+
data: { path: path.trim(), value: raw },
|
|
101
|
+
presentations: presentationsFor(path, raw),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* `config unset <path>`. Removal semantics live in `unsetConfigValue`.
|
|
106
|
+
*/
|
|
107
|
+
export async function configUnsetCommand(path, deps) {
|
|
108
|
+
await deps.unset(path);
|
|
109
|
+
return {
|
|
110
|
+
kind: "data",
|
|
111
|
+
data: { path: path.trim() },
|
|
112
|
+
presentations: textPresentations(`${path.trim()} → (not set)`),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
export const CONFIG_HELP = `
|
|
116
|
+
Config - Inspect and change scoutline settings
|
|
117
|
+
|
|
118
|
+
Usage:
|
|
119
|
+
scoutline config get [key] # view settings (always redacted)
|
|
120
|
+
scoutline config set <key> <value> # change a setting (strict validation)
|
|
121
|
+
scoutline config unset <key> # remove a setting
|
|
122
|
+
|
|
123
|
+
Keys:
|
|
124
|
+
routing The per-capability provider preference table
|
|
125
|
+
(view). Example: search → tavily, brave
|
|
126
|
+
routing.<capability> Ordered provider list for one capability.
|
|
127
|
+
Example: scoutline config set routing.search tavily,brave
|
|
128
|
+
fallbackEnabled true|false — the always-on provider fallback switch.
|
|
129
|
+
providers.<id> Provider configuration (view only; credential
|
|
130
|
+
values are always masked).
|
|
131
|
+
|
|
132
|
+
Behaviour:
|
|
133
|
+
get Prints the whole (redacted) config when no key is given.
|
|
134
|
+
Credential values never appear in any output mode.
|
|
135
|
+
set Validates strictly: a typo'd provider or capability fails with the
|
|
136
|
+
accepted list instead of storing something different. Credential-
|
|
137
|
+
bearing keys cannot be set here — use "scoutline init" or the
|
|
138
|
+
provider's environment variable (API keys never belong in command
|
|
139
|
+
arguments).
|
|
140
|
+
unset Removes a routing capability (and the table when the last entry
|
|
141
|
+
goes), the whole routing table, or the fallbackEnabled switch.
|
|
142
|
+
|
|
143
|
+
Routing semantics: when no --provider / SCOUTLINE_PROVIDER pin exists,
|
|
144
|
+
the routed list orders provider selection for that capability — the
|
|
145
|
+
first configured, capable provider in the list wins, even over quota
|
|
146
|
+
ranking. Explicit pins always override routing.
|
|
147
|
+
|
|
148
|
+
Exit codes:
|
|
149
|
+
0 Success.
|
|
150
|
+
1 Unknown key, invalid value, or credential-path refusal (JSON error
|
|
151
|
+
envelope on stderr).
|
|
152
|
+
|
|
153
|
+
Examples:
|
|
154
|
+
scoutline config get
|
|
155
|
+
scoutline config get routing
|
|
156
|
+
scoutline config set routing.search tavily,brave
|
|
157
|
+
scoutline config set fallbackEnabled false
|
|
158
|
+
scoutline config unset routing.search
|
|
159
|
+
scoutline config --help
|
|
160
|
+
`.trim();
|
|
161
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,12 @@ export interface DoctorDiagnosticsDependencies {
|
|
|
27
27
|
readonly effectiveProvider: ProviderId;
|
|
28
28
|
readonly descriptors: readonly ProviderDescriptor[];
|
|
29
29
|
readonly env: NodeJS.ProcessEnv;
|
|
30
|
+
/**
|
|
31
|
+
* Effective (post-validation) per-capability routing table from
|
|
32
|
+
* config.json; absent when unconfigured. Embedded additively into
|
|
33
|
+
* the report.
|
|
34
|
+
*/
|
|
35
|
+
readonly routing?: Readonly<Record<string, readonly ProviderId[]>>;
|
|
30
36
|
readonly sleep: (ms: number) => Promise<void>;
|
|
31
37
|
readonly random: () => number;
|
|
32
38
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAEV,iBAAiB,EAGjB,2BAA2B,EAC5B,MAAM,gCAAgC,CAAC;AAKxC,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAsB,MAAM,uBAAuB,CAAC;AAChG,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,uBAAuB,CAAC;AAM/B,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,UAAU,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACpD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC;IAC9B;;;;;;;OAOG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,0BAA0B,CAAC;IAC3D;;;;OAIG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B;;;;;;;OAOG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7E;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC;IACpC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,2BAA2B,CAAC,CAAC,CAAC;IACxF;;;;;;OAMG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AA6CD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,6BAA6B,GAClC,OAAO,CAAC,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAEV,iBAAiB,EAGjB,2BAA2B,EAC5B,MAAM,gCAAgC,CAAC;AAKxC,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAsB,MAAM,uBAAuB,CAAC;AAChG,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,uBAAuB,CAAC;AAM/B,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,UAAU,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACpD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC,CAAC,CAAC;IACnE,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC;IAC9B;;;;;;;OAOG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,0BAA0B,CAAC;IAC3D;;;;OAIG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B;;;;;;;OAOG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7E;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC;IACpC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,2BAA2B,CAAC,CAAC,CAAC;IACxF;;;;;;OAMG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AA6CD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,6BAA6B,GAClC,OAAO,CAAC,iBAAiB,CAAC,CAoF5B;AAmED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAKhE;AAMD,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACxD;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAC1B,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAO3C;AAED,eAAO,MAAM,WAAW,QAwEhB,CAAC"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -131,6 +131,9 @@ export async function buildDiagnosticsReport(deps) {
|
|
|
131
131
|
schemaVersion: 2,
|
|
132
132
|
effectiveProvider: deps.effectiveProvider,
|
|
133
133
|
capabilityMatrix: deriveCapabilityMatrix(deps.descriptors),
|
|
134
|
+
...(deps.routing !== undefined && Object.keys(deps.routing).length > 0
|
|
135
|
+
? { routing: deps.routing }
|
|
136
|
+
: {}),
|
|
134
137
|
node: {
|
|
135
138
|
version: process.version,
|
|
136
139
|
visionMcpCompatible: nodeMajor() >= 22,
|
|
@@ -225,8 +228,12 @@ Usage: scoutline doctor [options]
|
|
|
225
228
|
Reports a schema-version-2 diagnostics report listing every built-in
|
|
226
229
|
Provider (zai, minimax, tavily, exa, brave, firecrawl, parallel, perplexity, jina) with its configured state, declared
|
|
227
230
|
Capabilities, and connectivity status. The effective Provider (resolved
|
|
228
|
-
from --provider, SCOUTLINE_PROVIDER, or
|
|
229
|
-
|
|
231
|
+
from --provider, SCOUTLINE_PROVIDER, or a per-capability routing table
|
|
232
|
+
in config.json, or the quota-ranked default) is the
|
|
233
|
+
Provider that serves a requested capability. The routing field embeds
|
|
234
|
+
the effective routing table when one is configured (view/edit it with
|
|
235
|
+
"scoutline config get routing" / "config set routing.<capability>").
|
|
236
|
+
The capabilityMatrix field
|
|
230
237
|
lists, for each advertised capability, which providers supply it —
|
|
231
238
|
derived from descriptor metadata, so it always reflects the descriptors
|
|
232
239
|
passed to this command.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAUH,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAClG,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGpE,OAAO,EACL,gCAAgC,EAChC,oBAAoB,GAErB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAGhB,eAAe,EACf,kBAAkB,EACnB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,KAAK,EAAE,kBAAkB,EAAc,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
* `fallbackEnabled` flag and per-Provider records.
|
|
51
51
|
*/
|
|
52
52
|
import { inspectConfig, writeConfig } from "../lib/config-store.js";
|
|
53
|
+
import { PROVIDER_CAPABILITIES, PROVIDER_IDS } from "../providers/types.js";
|
|
53
54
|
import { AuthError, ApiError, NetworkError } from "../lib/errors.js";
|
|
54
55
|
// ---------------------------------------------------------------------------
|
|
55
56
|
// Public constants
|
|
@@ -71,7 +72,8 @@ The wizard walks you through recording API keys in
|
|
|
71
72
|
- ABSENT (no config yet): the fresh-onboarding flow runs.
|
|
72
73
|
- VALID + ALREADY-ONBOARDED: a re-config menu runs (edit a key,
|
|
73
74
|
add a Provider, remove a Provider, change the fallback
|
|
74
|
-
preference, re-run the full wizard, or
|
|
75
|
+
preference, edit the routing table, re-run the full wizard, or
|
|
76
|
+
cancel). Editing a key
|
|
75
77
|
resets that Provider's verification to "unverified".
|
|
76
78
|
- VALID + EMPTY: the fresh-onboarding flow runs.
|
|
77
79
|
- CORRUPT: the wizard offers to back up the live file and rewrite
|
|
@@ -629,6 +631,11 @@ async function promptReconfigAction(deps, configuredIds) {
|
|
|
629
631
|
name: "Change fallback preference",
|
|
630
632
|
description: "Toggle the Provider-fallback flag (currently consulted at runtime)",
|
|
631
633
|
});
|
|
634
|
+
choices.push({
|
|
635
|
+
value: "edit-routing",
|
|
636
|
+
name: "Edit routing table",
|
|
637
|
+
description: "Set per-capability provider preferences (search: tavily,brave)",
|
|
638
|
+
});
|
|
632
639
|
choices.push({
|
|
633
640
|
value: "rerun-full",
|
|
634
641
|
name: "Re-run full onboarding",
|
|
@@ -656,6 +663,9 @@ async function applyReconfigAction(deps, action, config, configuredIds) {
|
|
|
656
663
|
if (action === "change-fallback") {
|
|
657
664
|
return changeFallback(deps, config);
|
|
658
665
|
}
|
|
666
|
+
if (action === "edit-routing") {
|
|
667
|
+
return editRouting(deps, config);
|
|
668
|
+
}
|
|
659
669
|
if (action === "add-provider") {
|
|
660
670
|
return addProvider(deps, config, configuredIds);
|
|
661
671
|
}
|
|
@@ -687,6 +697,82 @@ async function changeFallback(deps, config) {
|
|
|
687
697
|
return "loop";
|
|
688
698
|
}
|
|
689
699
|
}
|
|
700
|
+
/**
|
|
701
|
+
* Edit the per-capability routing table (routing-table plan). Shows the
|
|
702
|
+
* current table, then reads `capability: provider1,provider2` lines
|
|
703
|
+
* until a blank line. Lenient like the config loader: unknown
|
|
704
|
+
* capabilities/providers warn and drop (valid lines still apply);
|
|
705
|
+
* `capability:` with an empty value removes that entry; removing the
|
|
706
|
+
* last entry drops the whole key. Cancel (Ctrl+C/EOF) on any input
|
|
707
|
+
* loops back to the menu without writing.
|
|
708
|
+
*/
|
|
709
|
+
async function editRouting(deps, config) {
|
|
710
|
+
const current = Object.entries(config.routing ?? {}).sort(([a], [b]) => a.localeCompare(b));
|
|
711
|
+
deps.writeStderr(current.length === 0
|
|
712
|
+
? "\nCurrent routing table: (empty)\n"
|
|
713
|
+
: `\nCurrent routing table:\n${current.map(([cap, ids]) => ` ${cap} → ${(ids ?? []).join(", ")}`).join("\n")}\n`);
|
|
714
|
+
deps.writeStderr('Enter routing lines as "capability: provider1,provider2" (e.g. search: tavily,brave).\n' +
|
|
715
|
+
"An empty value after the colon removes the capability. Blank line to finish.\n\n");
|
|
716
|
+
const capabilitySet = new Set(PROVIDER_CAPABILITIES);
|
|
717
|
+
const routing = {};
|
|
718
|
+
for (const [cap, ids] of Object.entries(config.routing ?? {})) {
|
|
719
|
+
routing[cap] = [...(ids ?? [])];
|
|
720
|
+
}
|
|
721
|
+
try {
|
|
722
|
+
for (;;) {
|
|
723
|
+
const line = (await deps.prompts.input("routing> ")).trim();
|
|
724
|
+
if (line.length === 0)
|
|
725
|
+
break;
|
|
726
|
+
const sep = line.indexOf(":");
|
|
727
|
+
if (sep <= 0) {
|
|
728
|
+
deps.writeStderr(` \u26a0\ufe0f skipped "${line}" \u2014 expected "capability: provider1,provider2"\n`);
|
|
729
|
+
continue;
|
|
730
|
+
}
|
|
731
|
+
// Capability keys are canonical lowercase ids; accept mixed-case
|
|
732
|
+
// input the same way provider ids below accept "TAVILY".
|
|
733
|
+
const capability = line.slice(0, sep).trim().toLowerCase();
|
|
734
|
+
const value = line.slice(sep + 1).trim();
|
|
735
|
+
if (!capabilitySet.has(capability)) {
|
|
736
|
+
deps.writeStderr(` \u26a0\ufe0f unknown capability "${capability}" \u2014 skipped\n`);
|
|
737
|
+
continue;
|
|
738
|
+
}
|
|
739
|
+
if (value.length === 0) {
|
|
740
|
+
delete routing[capability];
|
|
741
|
+
deps.writeStderr(` \u2212 removed routing for ${capability}\n`);
|
|
742
|
+
continue;
|
|
743
|
+
}
|
|
744
|
+
const ids = [];
|
|
745
|
+
const seen = new Set();
|
|
746
|
+
for (const raw of value.split(",")) {
|
|
747
|
+
const id = raw.trim().toLowerCase();
|
|
748
|
+
if (id.length === 0)
|
|
749
|
+
continue;
|
|
750
|
+
if (!PROVIDER_IDS.includes(id)) {
|
|
751
|
+
deps.writeStderr(` \u26a0\ufe0f unknown provider "${id}" \u2014 dropped\n`);
|
|
752
|
+
continue;
|
|
753
|
+
}
|
|
754
|
+
if (!seen.has(id)) {
|
|
755
|
+
seen.add(id);
|
|
756
|
+
ids.push(id);
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
if (ids.length === 0) {
|
|
760
|
+
deps.writeStderr(` \u26a0\ufe0f no valid providers on this line \u2014 ignored\n`);
|
|
761
|
+
continue;
|
|
762
|
+
}
|
|
763
|
+
routing[capability] = ids;
|
|
764
|
+
deps.writeStderr(` \u2713 ${capability} \u2192 ${ids.join(", ")}\n`);
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
catch {
|
|
768
|
+
// Cancel on any input prompt: no mutation, back to the menu.
|
|
769
|
+
return "loop";
|
|
770
|
+
}
|
|
771
|
+
const { routing: _oldRouting, ...rest } = config;
|
|
772
|
+
void _oldRouting;
|
|
773
|
+
const updated = Object.keys(routing).length > 0 ? { ...rest, routing } : rest;
|
|
774
|
+
return persistConfig(deps, updated);
|
|
775
|
+
}
|
|
690
776
|
/**
|
|
691
777
|
* Add a provider not yet configured. Reuses the T3a per-provider flow
|
|
692
778
|
* (ask-key → input → validate). The new record joins the existing
|