scoutline 0.6.4 → 0.7.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 +8 -9
- package/bin/scoutline.js +2 -3
- package/dist/capabilities/crawl.d.ts +93 -0
- package/dist/capabilities/crawl.d.ts.map +1 -0
- package/dist/capabilities/crawl.js +62 -0
- package/dist/capabilities/crawl.js.map +1 -0
- package/dist/capabilities/diagnostics.d.ts +45 -43
- package/dist/capabilities/diagnostics.d.ts.map +1 -1
- package/dist/capabilities/diagnostics.js +58 -71
- package/dist/capabilities/diagnostics.js.map +1 -1
- package/dist/capabilities/map.d.ts +81 -0
- package/dist/capabilities/map.d.ts.map +1 -0
- package/dist/capabilities/map.js +60 -0
- package/dist/capabilities/map.js.map +1 -0
- package/dist/capabilities/quota.js +1 -1
- package/dist/capabilities/quota.js.map +1 -1
- package/dist/capabilities/research.d.ts +98 -0
- package/dist/capabilities/research.d.ts.map +1 -0
- package/dist/capabilities/research.js +71 -0
- package/dist/capabilities/research.js.map +1 -0
- package/dist/capabilities/search.d.ts +9 -1
- package/dist/capabilities/search.d.ts.map +1 -1
- package/dist/commands/crawl.d.ts +46 -0
- package/dist/commands/crawl.d.ts.map +1 -0
- package/dist/commands/crawl.js +170 -0
- package/dist/commands/crawl.js.map +1 -0
- package/dist/commands/doctor.d.ts +7 -8
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +37 -34
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/map.d.ts +39 -0
- package/dist/commands/map.d.ts.map +1 -0
- package/dist/commands/map.js +121 -0
- package/dist/commands/map.js.map +1 -0
- package/dist/commands/read.d.ts.map +1 -1
- package/dist/commands/read.js +7 -1
- package/dist/commands/read.js.map +1 -1
- package/dist/commands/research.d.ts +62 -0
- package/dist/commands/research.d.ts.map +1 -0
- package/dist/commands/research.js +314 -0
- package/dist/commands/research.js.map +1 -0
- package/dist/commands/search.d.ts +2 -1
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +11 -4
- package/dist/commands/search.js.map +1 -1
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +260 -13
- package/dist/index.js.map +1 -1
- package/dist/lib/cache.d.ts +13 -0
- package/dist/lib/cache.d.ts.map +1 -1
- package/dist/lib/cache.js +15 -0
- package/dist/lib/cache.js.map +1 -1
- package/dist/lib/execution.d.ts +105 -1
- package/dist/lib/execution.d.ts.map +1 -1
- package/dist/lib/execution.js +73 -1
- package/dist/lib/execution.js.map +1 -1
- package/dist/lib/redact.d.ts +2 -1
- package/dist/lib/redact.d.ts.map +1 -1
- package/dist/lib/redact.js +8 -1
- package/dist/lib/redact.js.map +1 -1
- package/dist/lib/research-state.d.ts +104 -0
- package/dist/lib/research-state.d.ts.map +1 -0
- package/dist/lib/research-state.js +214 -0
- package/dist/lib/research-state.js.map +1 -0
- package/dist/lib/search-topic.d.ts +21 -0
- package/dist/lib/search-topic.d.ts.map +1 -0
- package/dist/lib/search-topic.js +36 -0
- package/dist/lib/search-topic.js.map +1 -0
- package/dist/providers/minimax/adapter.d.ts.map +1 -1
- package/dist/providers/minimax/adapter.js +6 -1
- package/dist/providers/minimax/adapter.js.map +1 -1
- package/dist/providers/minimax/vision-conformance.d.ts +2 -2
- package/dist/providers/minimax/vision-conformance.js +2 -2
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +2 -0
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/tavily/adapter.d.ts +62 -0
- package/dist/providers/tavily/adapter.d.ts.map +1 -0
- package/dist/providers/tavily/adapter.js +970 -0
- package/dist/providers/tavily/adapter.js.map +1 -0
- package/dist/providers/tavily/client.d.ts +184 -0
- package/dist/providers/tavily/client.d.ts.map +1 -0
- package/dist/providers/tavily/client.js +486 -0
- package/dist/providers/tavily/client.js.map +1 -0
- package/dist/providers/tavily/credentials.d.ts +34 -0
- package/dist/providers/tavily/credentials.d.ts.map +1 -0
- package/dist/providers/tavily/credentials.js +56 -0
- package/dist/providers/tavily/credentials.js.map +1 -0
- package/dist/providers/tavily/diagnostics.d.ts +44 -0
- package/dist/providers/tavily/diagnostics.d.ts.map +1 -0
- package/dist/providers/tavily/diagnostics.js +70 -0
- package/dist/providers/tavily/diagnostics.js.map +1 -0
- package/dist/providers/tavily/quota.d.ts +60 -0
- package/dist/providers/tavily/quota.d.ts.map +1 -0
- package/dist/providers/tavily/quota.js +186 -0
- package/dist/providers/tavily/quota.js.map +1 -0
- package/dist/providers/types.d.ts +14 -2
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js +1 -1
- package/dist/providers/types.js.map +1 -1
- package/dist/providers/zai/adapter.d.ts.map +1 -1
- package/dist/providers/zai/adapter.js +6 -1
- package/dist/providers/zai/adapter.js.map +1 -1
- package/package.json +1 -1
package/dist/lib/execution.d.ts
CHANGED
|
@@ -26,6 +26,7 @@ import type { SearchCapability, SearchRequest, SearchSource } from "../capabilit
|
|
|
26
26
|
import type { RepositoryOperation, RepositoryOperationKind } from "../capabilities/repository.js";
|
|
27
27
|
import type { ReaderFetchRequest, ReaderFetchResult, ReaderOperation, ReaderOperationKind } from "../capabilities/reader.js";
|
|
28
28
|
import { type ResponseCache } from "./cache.js";
|
|
29
|
+
import type { ProviderId } from "../providers/types.js";
|
|
29
30
|
/**
|
|
30
31
|
* Retry policy for a single Provider operation. Defaults are applied
|
|
31
32
|
* per-operation from {@link defaultRetryPolicy}.
|
|
@@ -57,7 +58,7 @@ export interface ExecutionDependencies {
|
|
|
57
58
|
* composed from the Reader Migration {@link ReaderOperationKind}
|
|
58
59
|
* source of truth for the same reason.
|
|
59
60
|
*/
|
|
60
|
-
export type ProviderOperation = "search" | "vision" | "quota" | "diagnostics" | RepositoryOperationKind | ReaderOperationKind;
|
|
61
|
+
export type ProviderOperation = "search" | "vision" | "quota" | "diagnostics" | RepositoryOperationKind | ReaderOperationKind | "crawl" | "map" | "research";
|
|
61
62
|
/**
|
|
62
63
|
* Default retry policy per operation. Search, quota, diagnostics, the
|
|
63
64
|
* three repository operations, and the reader operation allow one
|
|
@@ -187,4 +188,107 @@ export interface ExecuteReaderOptions {
|
|
|
187
188
|
* command-output, selection, or presentation module.
|
|
188
189
|
*/
|
|
189
190
|
export declare function executeReaderOperation(operation: ReaderOperation<ReaderFetchRequest, ReaderFetchResult>, request: ReaderFetchRequest, options: ExecuteReaderOptions, dependencies: ExecutionDependencies): Promise<ReaderFetchResult>;
|
|
191
|
+
/**
|
|
192
|
+
* Identity used to read and write a provider-partitioned cache entry for
|
|
193
|
+
* a generic {@link CachedOperation}. `credentialFingerprint` is the full
|
|
194
|
+
* lowercase SHA-256 hex digest of the resolved credential; `request` is
|
|
195
|
+
* the normalized Capability request.
|
|
196
|
+
*
|
|
197
|
+
* Unlike {@link ReaderCacheIdentity} and the repository identity, this
|
|
198
|
+
* shape carries NO `operation` field and NO `legacyCandidates` — the new
|
|
199
|
+
* capabilities (crawl, map, research) have no v0.2 legacy cache entries
|
|
200
|
+
* to read through (tech-plan §4 / D2).
|
|
201
|
+
*/
|
|
202
|
+
export interface CacheIdentity<Request, Result> {
|
|
203
|
+
readonly provider: ProviderId;
|
|
204
|
+
readonly capability: string;
|
|
205
|
+
readonly credentialFingerprint: string;
|
|
206
|
+
readonly request: Readonly<Request>;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Generic cached operation descriptor for capabilities built on the
|
|
210
|
+
* simplified execution wrapper (crawl, map, research). Same surface as
|
|
211
|
+
* {@link RepositoryOperation} and {@link ReaderOperation} — `validate`,
|
|
212
|
+
* `cacheIdentity`, `decodeCached`, `invoke` — minus the legacy-candidate
|
|
213
|
+
* machinery.
|
|
214
|
+
*/
|
|
215
|
+
export interface CachedOperation<Request, Result> {
|
|
216
|
+
readonly kind: string;
|
|
217
|
+
/**
|
|
218
|
+
* Validate the request before any Provider access. Throws
|
|
219
|
+
* `ValidationError` for missing required fields and
|
|
220
|
+
* `UnsupportedOptionError` for Provider-specific options the Adapter
|
|
221
|
+
* does not accept.
|
|
222
|
+
*/
|
|
223
|
+
validate(request: Request): void;
|
|
224
|
+
/**
|
|
225
|
+
* Build the cache identity for a request. Called only after `validate`
|
|
226
|
+
* succeeds.
|
|
227
|
+
*/
|
|
228
|
+
cacheIdentity(request: Request): CacheIdentity<Request, Result>;
|
|
229
|
+
/**
|
|
230
|
+
* Total decoder for cached normalized entries. Accepts `unknown`,
|
|
231
|
+
* validates shape, returns the typed result or `null`. NEVER throws.
|
|
232
|
+
*/
|
|
233
|
+
decodeCached(value: unknown): Result | null;
|
|
234
|
+
/**
|
|
235
|
+
* Invoke the Provider and return the normalized result. The Adapter
|
|
236
|
+
* closes its transport and never retries inside this method; shared
|
|
237
|
+
* execution owns retry policy.
|
|
238
|
+
*
|
|
239
|
+
* `signal` is an OPTIONAL cooperative-cancellation channel. When a
|
|
240
|
+
* caller threads an `AbortSignal` through `executeCachedOperation`, the
|
|
241
|
+
* Adapter MAY observe it (e.g. in a long-running poll loop) to stop
|
|
242
|
+
* early and release pending timers so the process can exit. Operations
|
|
243
|
+
* that have nothing to abort (crawl, map) simply ignore it.
|
|
244
|
+
*/
|
|
245
|
+
invoke(request: Request, signal?: AbortSignal): Promise<Result>;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Options for {@link executeCachedOperation}. `noCache` bypasses the
|
|
249
|
+
* provider-partitioned cache for both reads and writes; it never bypasses
|
|
250
|
+
* validation, identity, invoke, or retry semantics. `retryPolicy`
|
|
251
|
+
* overrides the default policy from {@link defaultRetryPolicy}.
|
|
252
|
+
*/
|
|
253
|
+
export interface ExecuteCachedOptions {
|
|
254
|
+
noCache?: boolean;
|
|
255
|
+
retryPolicy?: RetryPolicy;
|
|
256
|
+
/**
|
|
257
|
+
* Cooperative-cancellation signal forwarded to `operation.invoke`. When
|
|
258
|
+
* aborted, a supporting Adapter (currently research's poll loop) stops
|
|
259
|
+
* early and releases pending timers so a CLI that has already timed out
|
|
260
|
+
* can exit cleanly instead of staying alive on a lingering `setTimeout`.
|
|
261
|
+
* Unsupported operations ignore it.
|
|
262
|
+
*/
|
|
263
|
+
signal?: AbortSignal;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Simplified generic cache + retry executor for capabilities without
|
|
267
|
+
* legacy cache entries (crawl, map, research). Mirrors the observable
|
|
268
|
+
* ordering of {@link executeReaderOperation} but omits the
|
|
269
|
+
* legacy-candidate loop (tech-plan §4 / D2).
|
|
270
|
+
*
|
|
271
|
+
* The observable order is fixed:
|
|
272
|
+
*
|
|
273
|
+
* 1. `operation.validate(request)` — throws `ValidationError`
|
|
274
|
+
* synchronously before any cache or Adapter work.
|
|
275
|
+
* 2. `operation.cacheIdentity(request)` — Adapter computes the
|
|
276
|
+
* provider-partitioned cache key from the validated request and
|
|
277
|
+
* a single resolved credential.
|
|
278
|
+
* 3. Read the provider-partitioned cache key and pass the raw value
|
|
279
|
+
* through `operation.decodeCached`. A valid decode returns
|
|
280
|
+
* immediately; `null` is a miss; malformed values never propagate.
|
|
281
|
+
* 4. `operation.invoke(request)` is wrapped through
|
|
282
|
+
* `executeProviderOperation` with the default retry policy derived
|
|
283
|
+
* from `identity.capability` (which is a valid `ProviderOperation`
|
|
284
|
+
* member for every capability using this wrapper). Each retry
|
|
285
|
+
* creates a fresh Adapter transport attempt; cache hits create no
|
|
286
|
+
* transport.
|
|
287
|
+
* 5. The normalized result is written to the provider-partitioned
|
|
288
|
+
* cache key.
|
|
289
|
+
*
|
|
290
|
+
* `--no-cache` skips steps 3 and 5. It never skips validation (1),
|
|
291
|
+
* identity (2), invoke (4), or retry semantics.
|
|
292
|
+
*/
|
|
293
|
+
export declare function executeCachedOperation<Request, Result>(operation: CachedOperation<Request, Result>, request: Request, options: ExecuteCachedOptions, dependencies: ExecutionDependencies): Promise<Result>;
|
|
190
294
|
//# sourceMappingURL=execution.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../src/lib/execution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC/F,OAAO,KAAK,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAClG,OAAO,KAAK,EAEV,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACpB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAyB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../src/lib/execution.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/execution.js
CHANGED
|
@@ -54,8 +54,14 @@ export function defaultRetryPolicy(operation) {
|
|
|
54
54
|
case "repository-read-file":
|
|
55
55
|
case "repository-list-directory":
|
|
56
56
|
case "reader-fetch":
|
|
57
|
-
|
|
57
|
+
case "crawl":
|
|
58
|
+
case "map":
|
|
58
59
|
return { ...base, maxRetries: 1 };
|
|
60
|
+
case "research":
|
|
61
|
+
// No retry — double-charge risk. The adapter's invoke() handles
|
|
62
|
+
// the full create→poll→state-file lifecycle internally (tech-plan
|
|
63
|
+
// §3); a transient failure on POST is terminal.
|
|
64
|
+
return { ...base, maxRetries: 0 };
|
|
59
65
|
}
|
|
60
66
|
}
|
|
61
67
|
/**
|
|
@@ -380,4 +386,70 @@ export async function executeReaderOperation(operation, request, options, depend
|
|
|
380
386
|
}
|
|
381
387
|
return result;
|
|
382
388
|
}
|
|
389
|
+
/**
|
|
390
|
+
* Simplified generic cache + retry executor for capabilities without
|
|
391
|
+
* legacy cache entries (crawl, map, research). Mirrors the observable
|
|
392
|
+
* ordering of {@link executeReaderOperation} but omits the
|
|
393
|
+
* legacy-candidate loop (tech-plan §4 / D2).
|
|
394
|
+
*
|
|
395
|
+
* The observable order is fixed:
|
|
396
|
+
*
|
|
397
|
+
* 1. `operation.validate(request)` — throws `ValidationError`
|
|
398
|
+
* synchronously before any cache or Adapter work.
|
|
399
|
+
* 2. `operation.cacheIdentity(request)` — Adapter computes the
|
|
400
|
+
* provider-partitioned cache key from the validated request and
|
|
401
|
+
* a single resolved credential.
|
|
402
|
+
* 3. Read the provider-partitioned cache key and pass the raw value
|
|
403
|
+
* through `operation.decodeCached`. A valid decode returns
|
|
404
|
+
* immediately; `null` is a miss; malformed values never propagate.
|
|
405
|
+
* 4. `operation.invoke(request)` is wrapped through
|
|
406
|
+
* `executeProviderOperation` with the default retry policy derived
|
|
407
|
+
* from `identity.capability` (which is a valid `ProviderOperation`
|
|
408
|
+
* member for every capability using this wrapper). Each retry
|
|
409
|
+
* creates a fresh Adapter transport attempt; cache hits create no
|
|
410
|
+
* transport.
|
|
411
|
+
* 5. The normalized result is written to the provider-partitioned
|
|
412
|
+
* cache key.
|
|
413
|
+
*
|
|
414
|
+
* `--no-cache` skips steps 3 and 5. It never skips validation (1),
|
|
415
|
+
* identity (2), invoke (4), or retry semantics.
|
|
416
|
+
*/
|
|
417
|
+
export async function executeCachedOperation(operation, request, options, dependencies) {
|
|
418
|
+
// 1. Validate Capability request.
|
|
419
|
+
operation.validate(request);
|
|
420
|
+
// 2. Adapter-owned cache identity (after validation).
|
|
421
|
+
const identity = operation.cacheIdentity(request);
|
|
422
|
+
// 3. Provider-partitioned cache key. The key namespace is
|
|
423
|
+
// `${capability}-${operation.kind}` (mirrors the reader/repository
|
|
424
|
+
// convention) so future operations under the same capability cannot
|
|
425
|
+
// collide: `crawl-crawl-fetch`, `map-map-fetch`, etc.
|
|
426
|
+
const newKey = buildProviderCacheKey({
|
|
427
|
+
provider: identity.provider,
|
|
428
|
+
capability: `${identity.capability}-${operation.kind}`,
|
|
429
|
+
credentialFingerprint: identity.credentialFingerprint,
|
|
430
|
+
request: identity.request,
|
|
431
|
+
});
|
|
432
|
+
if (!options.noCache) {
|
|
433
|
+
const raw = await dependencies.cache.get(newKey);
|
|
434
|
+
if (raw !== null) {
|
|
435
|
+
const decoded = operation.decodeCached(raw);
|
|
436
|
+
if (decoded !== null) {
|
|
437
|
+
return decoded;
|
|
438
|
+
}
|
|
439
|
+
// Malformed normalized value: treat as a miss and fall through.
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
// 4. Retry-wrapped invoke. The capability name in the cache identity
|
|
443
|
+
// ("crawl", "map", "research") IS a valid ProviderOperation member
|
|
444
|
+
// and drives the default retry policy. Auth, Validation,
|
|
445
|
+
// Unsupported, and exhausted Quota failures are terminal; transient
|
|
446
|
+
// timeout, network, and 5xx/429-equivalent failures get the
|
|
447
|
+
// operation-specific retry count.
|
|
448
|
+
const result = await executeProviderOperation(identity.capability, () => operation.invoke(request, options.signal), dependencies, options.retryPolicy);
|
|
449
|
+
// 5. Cache the full normalized result before returning.
|
|
450
|
+
if (!options.noCache) {
|
|
451
|
+
await dependencies.cache.set(newKey, result);
|
|
452
|
+
}
|
|
453
|
+
return result;
|
|
454
|
+
}
|
|
383
455
|
//# sourceMappingURL=execution.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/lib/execution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAWH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAsB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/lib/execution.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/redact.d.ts
CHANGED
|
@@ -30,7 +30,8 @@ import type { Tool } from "@utcp/sdk";
|
|
|
30
30
|
* - x-api-key assignments (any case; `=`, `:`, or whitespace as the
|
|
31
31
|
* key/value separator — covers both `x-api-key=value` and
|
|
32
32
|
* `x-api-key value`).
|
|
33
|
-
* - Z_AI_API_KEY, ZAI_API_KEY, MINIMAX_API_KEY
|
|
33
|
+
* - Z_AI_API_KEY, ZAI_API_KEY, MINIMAX_API_KEY, TAVILY_API_KEY
|
|
34
|
+
* assignments.
|
|
34
35
|
* - The literal credentials passed in `extraSecrets` (each value is
|
|
35
36
|
* replaced wherever it appears; empty strings are skipped).
|
|
36
37
|
*/
|
package/dist/lib/redact.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../src/lib/redact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../src/lib/redact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAsBtC;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,CAqC9F;AAuBD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,EAAE,CAQhF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAiClF;AAQD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAIxE"}
|
package/dist/lib/redact.js
CHANGED
|
@@ -34,6 +34,7 @@ const CREDENTIAL_KEYS = new Set([
|
|
|
34
34
|
"z_ai_api_key",
|
|
35
35
|
"zai_api_key",
|
|
36
36
|
"minimax_api_key",
|
|
37
|
+
"tavily_api_key",
|
|
37
38
|
]);
|
|
38
39
|
const REDACTED = "[REDACTED]";
|
|
39
40
|
/**
|
|
@@ -46,7 +47,8 @@ const REDACTED = "[REDACTED]";
|
|
|
46
47
|
* - x-api-key assignments (any case; `=`, `:`, or whitespace as the
|
|
47
48
|
* key/value separator — covers both `x-api-key=value` and
|
|
48
49
|
* `x-api-key value`).
|
|
49
|
-
* - Z_AI_API_KEY, ZAI_API_KEY, MINIMAX_API_KEY
|
|
50
|
+
* - Z_AI_API_KEY, ZAI_API_KEY, MINIMAX_API_KEY, TAVILY_API_KEY
|
|
51
|
+
* assignments.
|
|
50
52
|
* - The literal credentials passed in `extraSecrets` (each value is
|
|
51
53
|
* replaced wherever it appears; empty strings are skipped).
|
|
52
54
|
*/
|
|
@@ -55,6 +57,9 @@ export function redactCredentialString(input, extraSecrets) {
|
|
|
55
57
|
return input;
|
|
56
58
|
let result = input;
|
|
57
59
|
result = result.replace(/Bearer\s+\S+/gi, REDACTED);
|
|
60
|
+
// Tavily API keys carry the `tvly-` prefix; redact the full token
|
|
61
|
+
// wherever it appears (logs, URLs, error bodies).
|
|
62
|
+
result = result.replace(/tvly-[A-Za-z0-9_-]+/gi, REDACTED);
|
|
58
63
|
// Fixup C — W3: the class accepts either `=`, `:`, or any whitespace
|
|
59
64
|
// as the key/value separator. The trailing `\S+` consumes the secret
|
|
60
65
|
// value; the entire `key + separator + value` span is replaced with
|
|
@@ -70,6 +75,7 @@ export function redactCredentialString(input, extraSecrets) {
|
|
|
70
75
|
result = result.replace(/Z_AI_API_KEY\s*[=:]\s*\S+/gi, REDACTED);
|
|
71
76
|
result = result.replace(/ZAI_API_KEY\s*[=:]\s*\S+/gi, REDACTED);
|
|
72
77
|
result = result.replace(/MINIMAX_API_KEY\s*[=:]\s*\S+/gi, REDACTED);
|
|
78
|
+
result = result.replace(/TAVILY_API_KEY\s*[=:]\s*\S+/gi, REDACTED);
|
|
73
79
|
// Embedded credential substrings inside URLs, e.g.
|
|
74
80
|
// `https://user:secret@host/path`. Catches both `https://` and
|
|
75
81
|
// `http://` schemes and replaces the entire URL with the marker so
|
|
@@ -121,6 +127,7 @@ export function configuredSecrets(env = process.env) {
|
|
|
121
127
|
env.Z_AI_API_KEY,
|
|
122
128
|
env.ZAI_API_KEY,
|
|
123
129
|
env.MINIMAX_API_KEY,
|
|
130
|
+
env.TAVILY_API_KEY,
|
|
124
131
|
];
|
|
125
132
|
return normalizeSecrets(candidates.filter((c) => typeof c === "string"));
|
|
126
133
|
}
|
package/dist/lib/redact.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/lib/redact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH;;;;GAIG;AACH,MAAM,eAAe,GAAwB,IAAI,GAAG,CAAC;IACnD,eAAe;IACf,WAAW;IACX,SAAS;IACT,QAAQ;IACR,cAAc;IACd,OAAO;IACP,cAAc;IACd,aAAa;IACb,iBAAiB;
|
|
1
|
+
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/lib/redact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH;;;;GAIG;AACH,MAAM,eAAe,GAAwB,IAAI,GAAG,CAAC;IACnD,eAAe;IACf,WAAW;IACX,SAAS;IACT,QAAQ;IACR,cAAc;IACd,OAAO;IACP,cAAc;IACd,aAAa;IACb,iBAAiB;IACjB,gBAAgB;CACjB,CAAC,CAAC;AAEH,MAAM,QAAQ,GAAG,YAAY,CAAC;AAE9B;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAa,EAAE,YAAgC;IACpF,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IACpD,kEAAkE;IAClE,kDAAkD;IAClD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAAC;IAC3D,qEAAqE;IACrE,qEAAqE;IACrE,oEAAoE;IACpE,wBAAwB;IACxB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,+BAA+B,EAAE,QAAQ,CAAC,CAAC;IACnE,sEAAsE;IACtE,oEAAoE;IACpE,mEAAmE;IACnE,oEAAoE;IACpE,iEAAiE;IACjE,sEAAsE;IACtE,sEAAsE;IACtE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,6BAA6B,EAAE,QAAQ,CAAC,CAAC;IACjE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,4BAA4B,EAAE,QAAQ,CAAC,CAAC;IAChE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,gCAAgC,EAAE,QAAQ,CAAC,CAAC;IACpE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,+BAA+B,EAAE,QAAQ,CAAC,CAAC;IACnE,mDAAmD;IACnD,+DAA+D;IAC/D,mEAAmE;IACnE,+BAA+B;IAC/B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,yCAAyC,EAAE,QAAQ,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC/C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAClC,iEAAiE;QACjE,iEAAiE;QACjE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,OAA2B;IACnD,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,SAAS;QACvC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAChC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG;IACpE,MAAM,UAAU,GAA8B;QAC5C,GAAG,CAAC,YAAY;QAChB,GAAG,CAAC,WAAW;QACf,GAAG,CAAC,eAAe;QACnB,GAAG,CAAC,cAAc;KACnB,CAAC;IACF,OAAO,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC;AACxF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc,EAAE,OAA2B;IACvE,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE7C,gDAAgD;IAChD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACxD,MAAM,CAAC,GAAG,OAAO,KAAK,CAAC;IACvB,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QACnB,OAAO,sBAAsB,CAAC,KAAe,EAAE,UAAU,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAEjC,0BAA0B;IAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,8DAA8D;IAC9D,kEAAkE;IAClE,gDAAgD;IAChD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,KAAgC,CAAC;IAC/C,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC3C,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;YACvB,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,KAAK,KAAK,MAAM,CAAC,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC;AACtD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,IAAU,EAAE,OAA2B;IAChE,MAAM,QAAQ,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACzF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAS,CAAC;IACvD,OAAO,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAS,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Research state file — resume mechanism for interrupted research
|
|
3
|
+
* (tech-plan §3, T07).
|
|
4
|
+
*
|
|
5
|
+
* Research costs 4-250 credits per request. A research task runs
|
|
6
|
+
* asynchronously server-side: POST /research creates it and returns a
|
|
7
|
+
* `request_id`, then GET /research/{id} polls until completion. If the
|
|
8
|
+
* CLI exits (Ctrl-C, crash) mid-poll, the task keeps running and
|
|
9
|
+
* consuming credits. Without a persistence mechanism, the next identical
|
|
10
|
+
* request would POST a SECOND task — a double charge.
|
|
11
|
+
*
|
|
12
|
+
* This module persists `{ requestId, identityHash, createdAt, status }`
|
|
13
|
+
* to `~/.scoutline/research/<state-hash>.json` so the next invocation of
|
|
14
|
+
* the same request detects the in-flight task and polls it instead of
|
|
15
|
+
* creating a new one. The state-hash is deterministic for a given
|
|
16
|
+
* `{provider, capability, credentialFingerprint, request}` tuple (see
|
|
17
|
+
* `computeResearchStateHash`).
|
|
18
|
+
*
|
|
19
|
+
* Boundary rules (ARCHITECTURE.md §2):
|
|
20
|
+
* - May import cache-root resolution and normalized errors.
|
|
21
|
+
* - Must NOT import transport, command presentation, or a Provider
|
|
22
|
+
* Adapter.
|
|
23
|
+
*
|
|
24
|
+
* Resilience contract (tech-plan §3 / G1-G3):
|
|
25
|
+
* - `write()` uses `{ flag: "wx" }` for atomic creation. A concurrent
|
|
26
|
+
* invocation that finds the file already exists gets EEXIST and
|
|
27
|
+
* polls the existing task instead of creating a new one.
|
|
28
|
+
* - `read()` catches JSON parse errors, deletes the corrupt file, and
|
|
29
|
+
* returns `null` (treated as absent → new task created).
|
|
30
|
+
* - `remove()` deletes the file and ignores ENOENT (already gone).
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* A single in-flight research task's persisted state. `status` tracks the
|
|
34
|
+
* last-seen poll status ("pending" or "in_progress"); the poll loop
|
|
35
|
+
* updates it so a resume after Ctrl-C skips statuses already observed.
|
|
36
|
+
*/
|
|
37
|
+
export interface ResearchState {
|
|
38
|
+
readonly requestId: string;
|
|
39
|
+
readonly identityHash: string;
|
|
40
|
+
readonly createdAt: string;
|
|
41
|
+
readonly status: "pending" | "in_progress";
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Port the Adapter uses to read/write/remove research state. Production
|
|
45
|
+
* wires {@link createProductionResearchStateFile}; tests inject in-memory
|
|
46
|
+
* doubles to exercise the lifecycle deterministically without touching
|
|
47
|
+
* the filesystem.
|
|
48
|
+
*/
|
|
49
|
+
export interface ResearchStateFile {
|
|
50
|
+
read(identityHash: string): Promise<ResearchState | null>;
|
|
51
|
+
write(identityHash: string, state: ResearchState): Promise<void>;
|
|
52
|
+
remove(identityHash: string): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Inputs to the research state hash. `credentialFingerprint` is the full
|
|
56
|
+
* lowercase SHA-256 hex digest of the active credential (same value used
|
|
57
|
+
* for the response-cache fingerprint). `request` is the normalized
|
|
58
|
+
* ResearchRequest whose recursively key-sorted JSON becomes part of the
|
|
59
|
+
* hash.
|
|
60
|
+
*/
|
|
61
|
+
export interface ResearchStateHashInput {
|
|
62
|
+
readonly provider: string;
|
|
63
|
+
readonly capability: string;
|
|
64
|
+
readonly credentialFingerprint: string;
|
|
65
|
+
readonly request: unknown;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Compute the deterministic state-file identity hash for a research
|
|
69
|
+
* request (tech-plan §3 / CR3).
|
|
70
|
+
*
|
|
71
|
+
* state-hash = SHA-256(recursively-key-sorted-JSON({
|
|
72
|
+
* provider, capability, credentialFingerprint, request
|
|
73
|
+
* }))
|
|
74
|
+
*
|
|
75
|
+
* Same canonical approach as `buildProviderCacheKey`'s request hashing,
|
|
76
|
+
* extended to include provider + capability + credential. Rotating the
|
|
77
|
+
* API key orphans old state files (correct — the old task belongs to the
|
|
78
|
+
* old key's billing). The hash never contains a raw credential.
|
|
79
|
+
*/
|
|
80
|
+
export declare function computeResearchStateHash(input: ResearchStateHashInput): string;
|
|
81
|
+
/**
|
|
82
|
+
* Build a production {@link ResearchStateFile} backed by files under
|
|
83
|
+
* `~/.scoutline/research/` (via {@link researchStateDir}). One JSON file
|
|
84
|
+
* per in-flight task, named `<state-hash>.json`.
|
|
85
|
+
*
|
|
86
|
+
* - `write()` atomically creates the file with `{ flag: "wx" }`. A
|
|
87
|
+
* concurrent invocation that finds it exists throws EEXIST; the caller
|
|
88
|
+
* catches that and polls the existing task.
|
|
89
|
+
* - `read()` catches JSON parse errors, deletes the corrupt file, and
|
|
90
|
+
* returns `null`.
|
|
91
|
+
* - `remove()` deletes the file and ignores ENOENT.
|
|
92
|
+
*/
|
|
93
|
+
export declare function createProductionResearchStateFile(): ResearchStateFile;
|
|
94
|
+
/**
|
|
95
|
+
* Convenience helper exported for the Adapter and tests: builds an
|
|
96
|
+
* in-memory {@link ResearchStateFile} that throws EEXIST on a second
|
|
97
|
+
* write to the same hash, mirroring the production `{ flag: "wx" }`
|
|
98
|
+
* contract exactly. The adapter's lifecycle must not depend on whether
|
|
99
|
+
* the state file is disk-backed or memory-backed.
|
|
100
|
+
*/
|
|
101
|
+
export declare function createInMemoryResearchStateFile(): ResearchStateFile & {
|
|
102
|
+
readonly store: Map<string, string>;
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=research-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research-state.d.ts","sourceRoot":"","sources":["../../src/lib/research-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAYH;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,aAAa,CAAC;CAC5C;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAC1D,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C;AAMD;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAuBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAQ9E;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,iCAAiC,IAAI,iBAAiB,CAmErE;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,IAAI,iBAAiB,GAAG;IACrE,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC,CAgDA"}
|