scoutline 0.19.7 → 0.20.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/dist/command-invocation.d.ts.map +1 -1
- package/dist/command-invocation.js +5 -0
- package/dist/command-invocation.js.map +1 -1
- package/dist/commands/archive.d.ts +111 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +426 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/doctor.d.ts +8 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +39 -4
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/fetch.d.ts +75 -0
- package/dist/commands/fetch.d.ts.map +1 -0
- package/dist/commands/fetch.js +592 -0
- package/dist/commands/fetch.js.map +1 -0
- package/dist/commands/read.d.ts.map +1 -1
- package/dist/commands/read.js +14 -0
- package/dist/commands/read.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +92 -7
- package/dist/index.js.map +1 -1
- package/dist/lib/artifacts.d.ts +5 -1
- package/dist/lib/artifacts.d.ts.map +1 -1
- package/dist/lib/artifacts.js +7 -2
- package/dist/lib/artifacts.js.map +1 -1
- package/dist/lib/async-file-lock.d.ts +2 -2
- package/dist/lib/async-file-lock.d.ts.map +1 -1
- package/dist/lib/async-file-lock.js +7 -4
- package/dist/lib/async-file-lock.js.map +1 -1
- package/dist/lib/pdf.d.ts +22 -0
- package/dist/lib/pdf.d.ts.map +1 -0
- package/dist/lib/pdf.js +1213 -0
- package/dist/lib/pdf.js.map +1 -0
- package/dist/lib/tty.d.ts.map +1 -1
- package/dist/lib/tty.js +10 -1
- package/dist/lib/tty.js.map +1 -1
- package/package.json +1 -1
package/dist/commands/read.js
CHANGED
|
@@ -172,6 +172,15 @@ export async function read(url, options = {}, deps, _context) {
|
|
|
172
172
|
// 1. Parse-level validation BEFORE Provider/Adapter work.
|
|
173
173
|
validateUrl(url);
|
|
174
174
|
validateExtractMode(options.extract);
|
|
175
|
+
// Byte-exact modes are fetch-only (ADR-0006 §8): the Reader path
|
|
176
|
+
// returns provider-normalized content and cannot be byte-faithful.
|
|
177
|
+
// Reject removed flags loudly instead of accepting and dropping them.
|
|
178
|
+
const removedByteModes = options;
|
|
179
|
+
if (removedByteModes.raw === true ||
|
|
180
|
+
removedByteModes.pdf !== undefined ||
|
|
181
|
+
removedByteModes.pdfRepair === true) {
|
|
182
|
+
throw new ValidationError("read no longer supports --raw/--pdf/--pdf-repair: Reader content is provider-normalized. For byte-exact retrieval use `scoutline fetch <url> --raw` (verbatim body) or `scoutline fetch <url> --pdf text` / `--pdf raw` (add `--pdf-repair` for damaged PDFs); see `scoutline fetch --help`.");
|
|
183
|
+
}
|
|
175
184
|
// 2. Build the Provider-neutral request. Only fields that affect
|
|
176
185
|
// the Provider request or the cache identity appear here;
|
|
177
186
|
// --max-chars, --extract, --full-envelope, --no-cache, and
|
|
@@ -187,6 +196,10 @@ export async function read(url, options = {}, deps, _context) {
|
|
|
187
196
|
// not prose.
|
|
188
197
|
return { kind: "data", data: envelope };
|
|
189
198
|
}
|
|
199
|
+
// The envelope reports exactly what the Reader provider returned
|
|
200
|
+
// (`contentFormat: markdown|text`). Client-side relabeling or
|
|
201
|
+
// reconstruction of provider-normalized content is intentionally
|
|
202
|
+
// absent — byte-exact retrieval is `fetch`'s contract.
|
|
190
203
|
const { text, originalLen, truncated } = truncateContent(result.content, options.maxChars);
|
|
191
204
|
const envelope = buildContentEnvelope(result, text, originalLen, truncated);
|
|
192
205
|
// 4. Presentations: text-oriented modes emit `content` directly for
|
|
@@ -266,6 +279,7 @@ Options:
|
|
|
266
279
|
--keep-img-data-url Keep image data URLs in output
|
|
267
280
|
--timeout <s> Request timeout in seconds (default: 20)
|
|
268
281
|
--max-chars <n> Truncate content to <n> chars (content reads only)
|
|
282
|
+
(byte-exact PDF/raw retrieval: see "scoutline fetch --help")
|
|
269
283
|
--full-envelope Silently accepted and ignored. The envelope is always
|
|
270
284
|
returned at schema-version-1 (deprecation: D3).
|
|
271
285
|
--extract <m> Pull a specific slice out as a typed envelope with
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/commands/read.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/commands/read.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -279,6 +279,8 @@ export declare function handleUsage(args: string[], outputMode: OutputMode, deps
|
|
|
279
279
|
* master) ride the seam's existing error boundary.
|
|
280
280
|
*/
|
|
281
281
|
export declare function handleHistory(args: string[], outputMode: OutputMode, deps: HandlerDependencies): Promise<number>;
|
|
282
|
+
export { handleFetch, fetchCommand, executeFetch, FETCH_HELP } from "./commands/fetch.js";
|
|
283
|
+
export { handleArchive, archiveCdxCommand, archiveGetCommand, ARCHIVE_HELP } from "./commands/archive.js";
|
|
282
284
|
/** Observation cell: the provider whose invoke() actually resolved. */
|
|
283
285
|
interface ServingCapture {
|
|
284
286
|
servedProvider?: ProviderId;
|
|
@@ -520,5 +522,4 @@ export interface MainDependencies {
|
|
|
520
522
|
readonly pruneCaches?: (selectors: PruneSelectors) => Promise<PruneCachesResult>;
|
|
521
523
|
}
|
|
522
524
|
export declare function main(args: readonly string[], dependencies: MainDependencies): Promise<number>;
|
|
523
|
-
export {};
|
|
524
525
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -15,6 +15,8 @@ import { cacheStatsCommand, cacheClearCommand, cachePruneCommand, formatDoctorCa
|
|
|
15
15
|
import { CONFIG_HELP, configGetCommand, configSetCommand, configUnsetCommand, } from "./commands/config.js";
|
|
16
16
|
import { usageCommand, USAGE_HELP, DEFAULT_USAGE_WINDOW_DAYS, MAX_USAGE_WINDOW_DAYS, } from "./commands/usage.js";
|
|
17
17
|
import { historyCommand, HISTORY_HELP } from "./commands/history.js";
|
|
18
|
+
import { handleFetch } from "./commands/fetch.js";
|
|
19
|
+
import { handleArchive, parseArchiveArgs } from "./commands/archive.js";
|
|
18
20
|
import { cacheStats, clearAllCaches, parsePruneDuration, pruneCaches } from "./lib/cache.js";
|
|
19
21
|
import { parseBatchManifest } from "./lib/batch-manifest.js";
|
|
20
22
|
import { assignBatchProviders } from "./lib/batch-assign.js";
|
|
@@ -78,6 +80,10 @@ Commands:
|
|
|
78
80
|
credential-free)
|
|
79
81
|
history Inventory of saved --save artifacts (list / show / stats,
|
|
80
82
|
credential-free)
|
|
83
|
+
fetch Direct, binary-safe HTTP client (evidentiary GET + API,
|
|
84
|
+
credential-free)
|
|
85
|
+
archive Internet Archive Wayback Machine (CDX index + snapshot
|
|
86
|
+
replay, credential-free)
|
|
81
87
|
code Execute TypeScript tool chains (Code Mode, Z.AI)
|
|
82
88
|
init Interactive onboarding wizard (writes ~/.scoutline/config.json)
|
|
83
89
|
|
|
@@ -108,6 +114,7 @@ Global Options:
|
|
|
108
114
|
--save [<path>] Save the result as a clean report (content + requestId) after a successful shared-capability run (search/read/crawl/map/research/repo/vision). Master copy in the artifact store; <path> also receives an export copy. A valueless --save (trailing, or followed by another option, e.g. --save --save-format markdown) writes the master only. Refuses an existing export target without --save-force.
|
|
109
115
|
--save-format <json|markdown> Report format (default: json)
|
|
110
116
|
--save-force Overwrite an existing export target
|
|
117
|
+
--isolated Run in process-isolated state (unique artifacts namespace)
|
|
111
118
|
|
|
112
119
|
Help:
|
|
113
120
|
scoutline --help
|
|
@@ -125,6 +132,8 @@ Help:
|
|
|
125
132
|
scoutline cache --help
|
|
126
133
|
scoutline usage --help
|
|
127
134
|
scoutline history --help
|
|
135
|
+
scoutline fetch --help
|
|
136
|
+
scoutline archive --help
|
|
128
137
|
scoutline init --help
|
|
129
138
|
`.trim();
|
|
130
139
|
function parseArgs(args) {
|
|
@@ -231,6 +240,7 @@ function extractGlobalOptions(args) {
|
|
|
231
240
|
let forceRaw = false;
|
|
232
241
|
let provider;
|
|
233
242
|
let noFallback = false;
|
|
243
|
+
let isolated = false;
|
|
234
244
|
let savePath;
|
|
235
245
|
let saveSeen = false;
|
|
236
246
|
let saveFormat = "json";
|
|
@@ -331,6 +341,10 @@ function extractGlobalOptions(args) {
|
|
|
331
341
|
saveForce = true;
|
|
332
342
|
continue;
|
|
333
343
|
}
|
|
344
|
+
if (arg === "--isolated") {
|
|
345
|
+
isolated = true;
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
334
348
|
rest.push(arg);
|
|
335
349
|
}
|
|
336
350
|
return {
|
|
@@ -339,6 +353,7 @@ function extractGlobalOptions(args) {
|
|
|
339
353
|
forceRaw,
|
|
340
354
|
provider,
|
|
341
355
|
noFallback,
|
|
356
|
+
isolated,
|
|
342
357
|
save: saveSeen ? { exportPath: savePath, format: saveFormat, force: saveForce } : undefined,
|
|
343
358
|
rest,
|
|
344
359
|
};
|
|
@@ -1035,7 +1050,7 @@ async function handleSearch(args, outputMode, deps) {
|
|
|
1035
1050
|
return applyContextWrapper(outcome.result);
|
|
1036
1051
|
}, outputMode, deps.now, deps.secrets, save);
|
|
1037
1052
|
}
|
|
1038
|
-
async function handleRead(args, outputMode, deps) {
|
|
1053
|
+
async function handleRead(args, outputMode, deps, forceRaw = false) {
|
|
1039
1054
|
const { flags, positional } = parseArgs(args);
|
|
1040
1055
|
if (flags.help || flags.h || positional.length === 0) {
|
|
1041
1056
|
deps.invocation.writeStdout(READ_HELP);
|
|
@@ -1058,6 +1073,18 @@ async function handleRead(args, outputMode, deps) {
|
|
|
1058
1073
|
throw new ValidationError(`Invalid --extract mode: ${extractFlag}. Use one of: code, links, tables, headings`);
|
|
1059
1074
|
}
|
|
1060
1075
|
const extract = extractFlag !== undefined ? extractFlag : undefined;
|
|
1076
|
+
// Byte-exact PDF modes are fetch-only (ADR-0006 §8): Reader content
|
|
1077
|
+
// is provider-normalized and cannot be byte-faithful. Reject at
|
|
1078
|
+
// parse level (before Provider resolution) with a pointer instead
|
|
1079
|
+
// of accepting and dropping the flags. Note: `--raw` keeps its
|
|
1080
|
+
// legacy global output-mode meaning and is not read's flag.
|
|
1081
|
+
// forceRaw carries the global --raw token: read has no content-raw
|
|
1082
|
+
// mode, so answering with a provider-normalized read (the legacy
|
|
1083
|
+
// output-mode interpretation) would silently do the wrong thing —
|
|
1084
|
+
// reject loudly with the fetch pointer instead.
|
|
1085
|
+
if (flags.pdf !== undefined || flags["pdf-repair"] !== undefined || forceRaw) {
|
|
1086
|
+
throw new ValidationError("--raw/--pdf/--pdf-repair are fetch-only (read content is provider-normalized); use `scoutline fetch <url> --raw` for the verbatim body or `scoutline fetch <url> --pdf text` / `--pdf raw` with `--pdf-repair` for damaged PDFs (see `scoutline fetch --help`)");
|
|
1087
|
+
}
|
|
1061
1088
|
// Resolve the effective Provider (DESIGN.md §6, FR-001–FR-005):
|
|
1062
1089
|
// explicit --provider > SCOUTLINE_PROVIDER > quota-ranked pick.
|
|
1063
1090
|
// Selection never consults credentials beyond the descriptor
|
|
@@ -1644,7 +1671,7 @@ async function handleRepo(args, outputMode, deps) {
|
|
|
1644
1671
|
...(deps.consume !== undefined ? { consume: deps.consume } : {}),
|
|
1645
1672
|
...(deps.now !== undefined ? { now: deps.now } : {}),
|
|
1646
1673
|
};
|
|
1647
|
-
const language = flags.language;
|
|
1674
|
+
const language = (flags.language ?? flags.lang);
|
|
1648
1675
|
const maxChars = flags["max-chars"] ? parseInt(flags["max-chars"], 10) : undefined;
|
|
1649
1676
|
const noCache = flags["no-cache"] === true;
|
|
1650
1677
|
const treePath = flags.path;
|
|
@@ -1938,6 +1965,7 @@ async function handleDoctor(args, outputMode, deps) {
|
|
|
1938
1965
|
return 0;
|
|
1939
1966
|
}
|
|
1940
1967
|
const noTools = flags["no-tools"] === true;
|
|
1968
|
+
const healthProbe = flags["health"] === true;
|
|
1941
1969
|
// #94 — `--available` filters the report's providers array to
|
|
1942
1970
|
// availability-"ok" rows. The filter itself lives in
|
|
1943
1971
|
// buildDiagnosticsReport (availableOnly); only the flag parse
|
|
@@ -1957,6 +1985,7 @@ async function handleDoctor(args, outputMode, deps) {
|
|
|
1957
1985
|
return invokeCommand(deps.invocation, () => doctor({
|
|
1958
1986
|
buildReport: () => buildDiagnosticsReport({
|
|
1959
1987
|
noTools,
|
|
1988
|
+
healthProbe,
|
|
1960
1989
|
availableOnly,
|
|
1961
1990
|
effectiveProvider,
|
|
1962
1991
|
descriptors: deps.providerDescriptors,
|
|
@@ -2339,6 +2368,8 @@ export async function handleHistory(args, outputMode, deps) {
|
|
|
2339
2368
|
...(requestId !== undefined ? { requestId } : {}),
|
|
2340
2369
|
}), outputMode, deps.now, deps.secrets);
|
|
2341
2370
|
}
|
|
2371
|
+
export { handleFetch, fetchCommand, executeFetch, FETCH_HELP } from "./commands/fetch.js";
|
|
2372
|
+
export { handleArchive, archiveCdxCommand, archiveGetCommand, ARCHIVE_HELP } from "./commands/archive.js";
|
|
2342
2373
|
async function handleQuota(args, outputMode, deps) {
|
|
2343
2374
|
const { flags } = parseArgs(args);
|
|
2344
2375
|
if (flags.help || flags.h) {
|
|
@@ -2665,7 +2696,8 @@ function loadVerificationRecords(config, dependencies) {
|
|
|
2665
2696
|
return hasAny ? out : undefined;
|
|
2666
2697
|
}
|
|
2667
2698
|
export async function main(args, dependencies) {
|
|
2668
|
-
const { invocation, env, now } = dependencies;
|
|
2699
|
+
const { invocation, env: initialEnv, now } = dependencies;
|
|
2700
|
+
let env = initialEnv;
|
|
2669
2701
|
// #73: one normalized config-loader seam — an explicit loader wins,
|
|
2670
2702
|
// then an injected deps.config, else production ambient loading. All
|
|
2671
2703
|
// hermeticity gates below read this local, never the raw field.
|
|
@@ -2730,7 +2762,10 @@ export async function main(args, dependencies) {
|
|
|
2730
2762
|
invocation.writeStderr(formatErrorOutput(error, bestEffortOutputMode(args, invocation), envSecrets));
|
|
2731
2763
|
return getErrorExitCode(error);
|
|
2732
2764
|
}
|
|
2733
|
-
const { outputFormat, forcePretty, forceRaw, provider, noFallback, rest } = extracted;
|
|
2765
|
+
const { outputFormat, forcePretty, forceRaw, provider, noFallback, isolated, rest } = extracted;
|
|
2766
|
+
if (isolated) {
|
|
2767
|
+
env = { ...env, SCOUTLINE_ISOLATED: "1" };
|
|
2768
|
+
}
|
|
2734
2769
|
// Fixup C — B10: resolve the output mode BEFORE the dispatch try/catch.
|
|
2735
2770
|
// An invalid explicit mode still surfaces as a typed ValidationError,
|
|
2736
2771
|
// but the surface formatter uses the user's REQUESTED mode (or the
|
|
@@ -2797,7 +2832,11 @@ export async function main(args, dependencies) {
|
|
|
2797
2832
|
// sink's failure becomes one redacted warning and never blocks or
|
|
2798
2833
|
// fails the other.
|
|
2799
2834
|
const consume = dependencies.consume ??
|
|
2800
|
-
|
|
2835
|
+
// ADR-0006 §5: --isolated runs skip local state persistence
|
|
2836
|
+
// entirely — no usage-ledger writes, no quota-snapshot writes — so
|
|
2837
|
+
// concurrent isolated processes never contend on shared
|
|
2838
|
+
// config-root files. Reads (doctor's quota view) are unaffected.
|
|
2839
|
+
(quotaRefreshEnabled && !isolated
|
|
2801
2840
|
? createCompositeConsumptionSink(createQuotaStoreConsumptionSink({ store: quotaStore, now: now ?? Date.now }),
|
|
2802
2841
|
// The ledger path resolves from the SAME injected-env config
|
|
2803
2842
|
// root `handleUsage` reads through (resolveConfigRootPure over
|
|
@@ -2977,6 +3016,51 @@ export async function main(args, dependencies) {
|
|
|
2977
3016
|
return getErrorExitCode(error);
|
|
2978
3017
|
}
|
|
2979
3018
|
}
|
|
3019
|
+
// `fetch` is credential-free (direct network call to target origin;
|
|
3020
|
+
// no Provider resolution, no Adapter, no LLM translation, no quota
|
|
3021
|
+
// tracking). Short-circuit before the credentialed config load so
|
|
3022
|
+
// missing or unconfigured ~/.scoutline/config.json never blocks direct
|
|
3023
|
+
// evidentiary downloads or API calls (ADR-0006).
|
|
3024
|
+
if (command === "fetch") {
|
|
3025
|
+
try {
|
|
3026
|
+
// `--raw` is a CONTENT flag on fetch (emit the body verbatim),
|
|
3027
|
+
// not the legacy global output-mode flag. With no explicit -O it
|
|
3028
|
+
// would otherwise resolve the output to `data` and bury the body
|
|
3029
|
+
// inside the JSON envelope; route to a text presentation mode so
|
|
3030
|
+
// the body prints directly. An explicit -O still wins.
|
|
3031
|
+
const fetchOutputMode = forceRaw && outputFormat === undefined ? "compact" : outputMode;
|
|
3032
|
+
return await handleFetch(commandArgs, fetchOutputMode, buildHandlerDeps(env, envSecrets, true), forceRaw);
|
|
3033
|
+
}
|
|
3034
|
+
catch (error) {
|
|
3035
|
+
invocation.writeStderr(formatErrorOutput(error, outputMode, envSecrets));
|
|
3036
|
+
return getErrorExitCode(error);
|
|
3037
|
+
}
|
|
3038
|
+
}
|
|
3039
|
+
// `archive` is credential-free (queries Internet Archive public APIs;
|
|
3040
|
+
// keyless, no Provider resolution, no Adapter, no quota tracking).
|
|
3041
|
+
// Short-circuit before the credentialed config load so missing or
|
|
3042
|
+
// unconfigured ~/.scoutline/config.json never blocks CDX searches or
|
|
3043
|
+
// snapshot replay (ADR-0006).
|
|
3044
|
+
if (command === "archive") {
|
|
3045
|
+
try {
|
|
3046
|
+
// Same as fetch, but ONLY for `get`: `--raw` there is a content
|
|
3047
|
+
// flag (emit the snapshot body verbatim) that must not resolve to
|
|
3048
|
+
// the `data` envelope hiding it. `cdx --raw` keeps the legacy
|
|
3049
|
+
// global meaning (unwrapped data) — flipping its presentation to
|
|
3050
|
+
// the human table was never the flag's contract.
|
|
3051
|
+
// Determine the subcommand through the parser (not positional
|
|
3052
|
+
// assumption): options may precede `get`/`cdx`.
|
|
3053
|
+
const archiveSubcommand = parseArchiveArgs(commandArgs).subcommand;
|
|
3054
|
+
const archiveOutputMode = forceRaw && outputFormat === undefined && archiveSubcommand === "get"
|
|
3055
|
+
? "compact"
|
|
3056
|
+
: outputMode;
|
|
3057
|
+
return await handleArchive(commandArgs, archiveOutputMode, buildHandlerDeps(env, envSecrets, true), forceRaw);
|
|
3058
|
+
}
|
|
3059
|
+
catch (error) {
|
|
3060
|
+
invocation.writeStderr(formatErrorOutput(error, outputMode, envSecrets));
|
|
3061
|
+
return getErrorExitCode(error);
|
|
3062
|
+
}
|
|
3063
|
+
}
|
|
2980
3064
|
// save-artifacts T3 — pre-dispatch guards (DESIGN D6 step 2). The save
|
|
2981
3065
|
// request only exists for a save-capable command with `--save` present;
|
|
2982
3066
|
// every other command (capable-but-no-save, non-capable) already had the
|
|
@@ -3182,7 +3266,7 @@ export async function main(args, dependencies) {
|
|
|
3182
3266
|
// would violate the JSON error contract (stderr is reserved for the
|
|
3183
3267
|
// structured error envelope; data-only stdout).
|
|
3184
3268
|
};
|
|
3185
|
-
if (quotaRefreshEnabled && isQuotaObservationalCommand) {
|
|
3269
|
+
if (quotaRefreshEnabled && !isolated && isQuotaObservationalCommand) {
|
|
3186
3270
|
await refreshQuotaSnapshots({
|
|
3187
3271
|
descriptors: providerDescriptors,
|
|
3188
3272
|
env: resolvedEnv,
|
|
@@ -3242,7 +3326,7 @@ export async function main(args, dependencies) {
|
|
|
3242
3326
|
break;
|
|
3243
3327
|
case "read":
|
|
3244
3328
|
commandRecognized = true;
|
|
3245
|
-
exitCode = await handleRead(commandArgs, outputMode, handlerDepsWithSave);
|
|
3329
|
+
exitCode = await handleRead(commandArgs, outputMode, handlerDepsWithSave, forceRaw);
|
|
3246
3330
|
break;
|
|
3247
3331
|
case "crawl":
|
|
3248
3332
|
commandRecognized = true;
|
|
@@ -3316,6 +3400,7 @@ export async function main(args, dependencies) {
|
|
|
3316
3400
|
// within the threshold, so the common case (fresh snapshot) is a
|
|
3317
3401
|
// single state-file read + no transport calls.
|
|
3318
3402
|
if (quotaRefreshEnabled &&
|
|
3403
|
+
!isolated &&
|
|
3319
3404
|
commandRecognized &&
|
|
3320
3405
|
!isQuotaObservationalCommand &&
|
|
3321
3406
|
!isHelpInvocation &&
|