scoutline 0.19.7 → 0.21.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 +131 -25
- package/bin/scoutline.js +0 -0
- package/dist/capabilities/map.d.ts +3 -3
- package/dist/capabilities/map.js +3 -3
- package/dist/capabilities/quota.d.ts +13 -6
- package/dist/capabilities/quota.d.ts.map +1 -1
- package/dist/capabilities/quota.js +15 -0
- package/dist/capabilities/quota.js.map +1 -1
- package/dist/capabilities/science.d.ts +193 -0
- package/dist/capabilities/science.d.ts.map +1 -0
- package/dist/capabilities/science.js +110 -0
- package/dist/capabilities/science.js.map +1 -0
- package/dist/command-invocation.d.ts +13 -1
- package/dist/command-invocation.d.ts.map +1 -1
- package/dist/command-invocation.js +44 -2
- package/dist/command-invocation.js.map +1 -1
- package/dist/commands/archive.d.ts +178 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +871 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +12 -3
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/crawl.d.ts +15 -2
- package/dist/commands/crawl.d.ts.map +1 -1
- package/dist/commands/crawl.js +93 -34
- package/dist/commands/crawl.js.map +1 -1
- package/dist/commands/doctor.d.ts +8 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +40 -5
- 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 +596 -0
- package/dist/commands/fetch.js.map +1 -0
- package/dist/commands/history.d.ts +165 -8
- package/dist/commands/history.d.ts.map +1 -1
- package/dist/commands/history.js +591 -20
- package/dist/commands/history.js.map +1 -1
- package/dist/commands/init.d.ts +13 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +411 -43
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/map.d.ts.map +1 -1
- package/dist/commands/map.js +5 -0
- package/dist/commands/map.js.map +1 -1
- package/dist/commands/quota.d.ts.map +1 -1
- package/dist/commands/quota.js +2 -0
- package/dist/commands/quota.js.map +1 -1
- package/dist/commands/read.d.ts +28 -6
- package/dist/commands/read.d.ts.map +1 -1
- package/dist/commands/read.js +328 -31
- package/dist/commands/read.js.map +1 -1
- package/dist/commands/repo.d.ts +12 -10
- package/dist/commands/repo.d.ts.map +1 -1
- package/dist/commands/repo.js +189 -21
- package/dist/commands/repo.js.map +1 -1
- package/dist/commands/repository-explorer.d.ts +15 -7
- package/dist/commands/repository-explorer.d.ts.map +1 -1
- package/dist/commands/repository-explorer.js +117 -97
- package/dist/commands/repository-explorer.js.map +1 -1
- package/dist/commands/research.d.ts +21 -4
- package/dist/commands/research.d.ts.map +1 -1
- package/dist/commands/research.js +83 -12
- package/dist/commands/research.js.map +1 -1
- package/dist/commands/science.d.ts +54 -0
- package/dist/commands/science.d.ts.map +1 -0
- package/dist/commands/science.js +999 -0
- package/dist/commands/science.js.map +1 -0
- package/dist/commands/search.d.ts +13 -2
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +106 -7
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/watch.d.ts +94 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +900 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/index.d.ts +168 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1679 -232
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-registration/deploy.d.ts +69 -0
- package/dist/lib/agent-registration/deploy.d.ts.map +1 -0
- package/dist/lib/agent-registration/deploy.js +279 -0
- package/dist/lib/agent-registration/deploy.js.map +1 -0
- package/dist/lib/agent-registration/engines.d.ts +77 -0
- package/dist/lib/agent-registration/engines.d.ts.map +1 -0
- package/dist/lib/agent-registration/engines.js +544 -0
- package/dist/lib/agent-registration/engines.js.map +1 -0
- package/dist/lib/agent-registration/registry.d.ts +32 -0
- package/dist/lib/agent-registration/registry.d.ts.map +1 -0
- package/dist/lib/agent-registration/registry.js +94 -0
- package/dist/lib/agent-registration/registry.js.map +1 -0
- package/dist/lib/api-client.d.ts +2 -3
- package/dist/lib/api-client.d.ts.map +1 -1
- package/dist/lib/api-client.js +18 -0
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/artifacts.d.ts +83 -3
- package/dist/lib/artifacts.d.ts.map +1 -1
- package/dist/lib/artifacts.js +246 -13
- package/dist/lib/artifacts.js.map +1 -1
- package/dist/lib/async-file-lock.d.ts +19 -9
- package/dist/lib/async-file-lock.d.ts.map +1 -1
- package/dist/lib/async-file-lock.js +25 -11
- package/dist/lib/async-file-lock.js.map +1 -1
- package/dist/lib/batch-manifest.d.ts +1 -0
- package/dist/lib/batch-manifest.d.ts.map +1 -1
- package/dist/lib/batch-manifest.js +12 -5
- package/dist/lib/batch-manifest.js.map +1 -1
- package/dist/lib/batch-runner.d.ts.map +1 -1
- package/dist/lib/batch-runner.js +25 -0
- package/dist/lib/batch-runner.js.map +1 -1
- package/dist/lib/code-mode.d.ts +19 -0
- package/dist/lib/code-mode.d.ts.map +1 -1
- package/dist/lib/code-mode.js +170 -14
- package/dist/lib/code-mode.js.map +1 -1
- package/dist/lib/config-store.d.ts +48 -1
- package/dist/lib/config-store.d.ts.map +1 -1
- package/dist/lib/config-store.js +92 -5
- package/dist/lib/config-store.js.map +1 -1
- package/dist/lib/config.js +3 -3
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/errors.d.ts +20 -0
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +26 -0
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/journal.d.ts +258 -0
- package/dist/lib/journal.d.ts.map +1 -0
- package/dist/lib/journal.js +582 -0
- package/dist/lib/journal.js.map +1 -0
- package/dist/lib/mcp-client.d.ts +18 -0
- package/dist/lib/mcp-client.d.ts.map +1 -1
- package/dist/lib/mcp-client.js +145 -17
- package/dist/lib/mcp-client.js.map +1 -1
- package/dist/lib/output-budget-persistence.d.ts +76 -0
- package/dist/lib/output-budget-persistence.d.ts.map +1 -0
- package/dist/lib/output-budget-persistence.js +76 -0
- package/dist/lib/output-budget-persistence.js.map +1 -0
- package/dist/lib/output-budget.d.ts +99 -0
- package/dist/lib/output-budget.d.ts.map +1 -0
- package/dist/lib/output-budget.js +175 -0
- package/dist/lib/output-budget.js.map +1 -0
- 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/provider-fallback.d.ts.map +1 -1
- package/dist/lib/provider-fallback.js +3 -0
- package/dist/lib/provider-fallback.js.map +1 -1
- package/dist/lib/quota-mapping.d.ts.map +1 -1
- package/dist/lib/quota-mapping.js +31 -0
- package/dist/lib/quota-mapping.js.map +1 -1
- package/dist/lib/quota-store.d.ts +11 -1
- package/dist/lib/quota-store.d.ts.map +1 -1
- package/dist/lib/quota-store.js +11 -2
- package/dist/lib/quota-store.js.map +1 -1
- package/dist/lib/redact.d.ts.map +1 -1
- package/dist/lib/redact.js +18 -8
- package/dist/lib/redact.js.map +1 -1
- package/dist/lib/save-artifacts.d.ts +38 -0
- package/dist/lib/save-artifacts.d.ts.map +1 -0
- package/dist/lib/save-artifacts.js +146 -0
- package/dist/lib/save-artifacts.js.map +1 -0
- package/dist/lib/section-diff.d.ts +90 -0
- package/dist/lib/section-diff.d.ts.map +1 -0
- package/dist/lib/section-diff.js +395 -0
- package/dist/lib/section-diff.js.map +1 -0
- package/dist/lib/skill-source.d.ts +11 -0
- package/dist/lib/skill-source.d.ts.map +1 -0
- package/dist/lib/skill-source.js +22 -0
- package/dist/lib/skill-source.js.map +1 -0
- package/dist/lib/tty.d.ts +1 -1
- 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/dist/lib/watch-store.d.ts +203 -0
- package/dist/lib/watch-store.d.ts.map +1 -0
- package/dist/lib/watch-store.js +628 -0
- package/dist/lib/watch-store.js.map +1 -0
- package/dist/providers/arxiv/adapter.d.ts +88 -0
- package/dist/providers/arxiv/adapter.d.ts.map +1 -0
- package/dist/providers/arxiv/adapter.js +316 -0
- package/dist/providers/arxiv/adapter.js.map +1 -0
- package/dist/providers/arxiv/client.d.ts +33 -0
- package/dist/providers/arxiv/client.d.ts.map +1 -0
- package/dist/providers/arxiv/client.js +130 -0
- package/dist/providers/arxiv/client.js.map +1 -0
- package/dist/providers/arxiv/diagnostics.d.ts +28 -0
- package/dist/providers/arxiv/diagnostics.d.ts.map +1 -0
- package/dist/providers/arxiv/diagnostics.js +34 -0
- package/dist/providers/arxiv/diagnostics.js.map +1 -0
- package/dist/providers/crossref/adapter.d.ts +97 -0
- package/dist/providers/crossref/adapter.d.ts.map +1 -0
- package/dist/providers/crossref/adapter.js +249 -0
- package/dist/providers/crossref/adapter.js.map +1 -0
- package/dist/providers/crossref/client.d.ts +10 -0
- package/dist/providers/crossref/client.d.ts.map +1 -0
- package/dist/providers/crossref/client.js +143 -0
- package/dist/providers/crossref/client.js.map +1 -0
- package/dist/providers/crossref/diagnostics.d.ts +18 -0
- package/dist/providers/crossref/diagnostics.d.ts.map +1 -0
- package/dist/providers/crossref/diagnostics.js +23 -0
- package/dist/providers/crossref/diagnostics.js.map +1 -0
- package/dist/providers/europepmc/adapter.d.ts +94 -0
- package/dist/providers/europepmc/adapter.d.ts.map +1 -0
- package/dist/providers/europepmc/adapter.js +264 -0
- package/dist/providers/europepmc/adapter.js.map +1 -0
- package/dist/providers/europepmc/client.d.ts +18 -0
- package/dist/providers/europepmc/client.d.ts.map +1 -0
- package/dist/providers/europepmc/client.js +128 -0
- package/dist/providers/europepmc/client.js.map +1 -0
- package/dist/providers/europepmc/diagnostics.d.ts +18 -0
- package/dist/providers/europepmc/diagnostics.d.ts.map +1 -0
- package/dist/providers/europepmc/diagnostics.js +23 -0
- package/dist/providers/europepmc/diagnostics.js.map +1 -0
- package/dist/providers/openalex/adapter.d.ts +53 -0
- package/dist/providers/openalex/adapter.d.ts.map +1 -0
- package/dist/providers/openalex/adapter.js +313 -0
- package/dist/providers/openalex/adapter.js.map +1 -0
- package/dist/providers/openalex/client.d.ts +18 -0
- package/dist/providers/openalex/client.d.ts.map +1 -0
- package/dist/providers/openalex/client.js +159 -0
- package/dist/providers/openalex/client.js.map +1 -0
- package/dist/providers/openalex/diagnostics.d.ts +19 -0
- package/dist/providers/openalex/diagnostics.d.ts.map +1 -0
- package/dist/providers/openalex/diagnostics.js +25 -0
- package/dist/providers/openalex/diagnostics.js.map +1 -0
- package/dist/providers/perplexity/adapter.d.ts +10 -8
- package/dist/providers/perplexity/adapter.d.ts.map +1 -1
- package/dist/providers/perplexity/adapter.js +68 -41
- package/dist/providers/perplexity/adapter.js.map +1 -1
- package/dist/providers/perplexity/client.d.ts +22 -12
- package/dist/providers/perplexity/client.d.ts.map +1 -1
- package/dist/providers/perplexity/client.js +18 -17
- package/dist/providers/perplexity/client.js.map +1 -1
- package/dist/providers/pubmed/adapter.d.ts +56 -0
- package/dist/providers/pubmed/adapter.d.ts.map +1 -0
- package/dist/providers/pubmed/adapter.js +425 -0
- package/dist/providers/pubmed/adapter.js.map +1 -0
- package/dist/providers/pubmed/client.d.ts +29 -0
- package/dist/providers/pubmed/client.d.ts.map +1 -0
- package/dist/providers/pubmed/client.js +153 -0
- package/dist/providers/pubmed/client.js.map +1 -0
- package/dist/providers/pubmed/diagnostics.d.ts +18 -0
- package/dist/providers/pubmed/diagnostics.d.ts.map +1 -0
- package/dist/providers/pubmed/diagnostics.js +23 -0
- package/dist/providers/pubmed/diagnostics.js.map +1 -0
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +16 -0
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/selection.d.ts +1 -1
- package/dist/providers/selection.d.ts.map +1 -1
- package/dist/providers/selection.js +5 -2
- package/dist/providers/selection.js.map +1 -1
- package/dist/providers/types.d.ts +28 -7
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js +94 -6
- package/dist/providers/types.js.map +1 -1
- package/dist/providers/zai/quota.d.ts.map +1 -1
- package/dist/providers/zai/quota.js +29 -8
- package/dist/providers/zai/quota.js.map +1 -1
- package/dist/providers/zai/reader.d.ts.map +1 -1
- package/dist/providers/zai/reader.js +5 -3
- package/dist/providers/zai/reader.js.map +1 -1
- package/dist/providers/zai/repository.d.ts.map +1 -1
- package/dist/providers/zai/repository.js +5 -3
- package/dist/providers/zai/repository.js.map +1 -1
- package/package.json +3 -2
- package/skills/scoutline/SKILL.md +787 -0
- package/skills/scoutline/references/advanced.md +469 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Science Capability Contract (DESIGN D1; PRD AC-10d).
|
|
3
|
+
*
|
|
4
|
+
* One capability file, house shape mirroring `search.ts`. Declares the
|
|
5
|
+
* Provider-neutral meaning shared by every science supplier: the control
|
|
6
|
+
* record, search/get request shapes, the normalized `ScienceWork` result,
|
|
7
|
+
* the supplier-partitioned cache identity, and the three capability
|
|
8
|
+
* interfaces (search/get/cite). This ticket ships ONLY the contract — no
|
|
9
|
+
* Provider, transport, or Adapter code lives here.
|
|
10
|
+
*
|
|
11
|
+
* Interfaces are compile-time only, so the validate() grammars are
|
|
12
|
+
* implemented as exported pure helpers (`validateScienceSearchRequest`,
|
|
13
|
+
* `validateScienceGetRequest`, `parseScienceIdentifier`) that the
|
|
14
|
+
* interfaces' validate() methods delegate to.
|
|
15
|
+
*
|
|
16
|
+
* Scope rulings encoded here:
|
|
17
|
+
* - `year` accepts ONLY the closed forms "2020" | "2018:2022"
|
|
18
|
+
* (PRD AC-7/AC-7b). Empty, malformed, and reversed ranges throw.
|
|
19
|
+
* - The shared validator judges ONLY `query` + `year`. `author`,
|
|
20
|
+
* `venue`, and `type` pass through unjudged — per-control
|
|
21
|
+
* accept/reject is the Adapter concern, and the `--type` union
|
|
22
|
+
* vocabulary (including `component` rejection) lives at command
|
|
23
|
+
* parse, never here.
|
|
24
|
+
* - Identifier grammar is BARE forms only: DOI `^10\.\d{4,9}/`,
|
|
25
|
+
* numeric PMID, arXiv `\d{4}\.\d{4,5}` plus the legacy
|
|
26
|
+
* `archive/number` form (e.g. `cs/0501001`). A `doi:` prefix is not
|
|
27
|
+
* one of the closed forms. Parsed once at the command layer.
|
|
28
|
+
*/
|
|
29
|
+
import { ValidationError } from "../lib/errors.js";
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// Suppliers
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
/**
|
|
34
|
+
* The five science supplier ids, in the design listing order. This is the
|
|
35
|
+
* PROVIDER_IDS insertion order, NOT the fan-out arm order (the
|
|
36
|
+
* openalex-first arm ordering is an executor concern).
|
|
37
|
+
*/
|
|
38
|
+
export const SCIENCE_SUPPLIER_IDS = Object.freeze(["arxiv", "openalex", "crossref", "pubmed", "europepmc"]);
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Year grammar (PRD AC-7/AC-7b)
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
/** Single year "2020" or closed range "2018:2022"; nothing else. */
|
|
43
|
+
const SCIENCE_YEAR_PATTERN = /^(\d{4})(?::(\d{4}))?$/;
|
|
44
|
+
function validateScienceYear(year) {
|
|
45
|
+
const match = SCIENCE_YEAR_PATTERN.exec(year);
|
|
46
|
+
if (!match) {
|
|
47
|
+
throw new ValidationError(`Invalid year "${year}": expected a year "2020" or closed range "2018:2022"`);
|
|
48
|
+
}
|
|
49
|
+
const from = match[1];
|
|
50
|
+
const to = match[2];
|
|
51
|
+
if (to !== undefined && Number(from) > Number(to)) {
|
|
52
|
+
throw new ValidationError(`Invalid year range "${year}": the start year must not exceed the end year`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/** Bare DOI: `10.` registrant (4-9 digits) then a slash suffix. */
|
|
56
|
+
const BARE_DOI_PATTERN = /^10\.\d{4,9}\/.+$/;
|
|
57
|
+
/** Modern arXiv id: YYMM.NNNNN (4-digit head, 4-5 digit tail). */
|
|
58
|
+
const ARXIV_ID_PATTERN = /^\d{4}\.\d{4,5}$/;
|
|
59
|
+
/** Legacy arXiv id: archive/YYMMNNN (e.g. `cs/0501001`). */
|
|
60
|
+
const ARXIV_LEGACY_PATTERN = /^[a-z][a-z-]*\/\d{7}$/;
|
|
61
|
+
/** Numeric PMID. */
|
|
62
|
+
const PMID_PATTERN = /^\d+$/;
|
|
63
|
+
/**
|
|
64
|
+
* Classify a bare science identifier. Returns `"doi"`, `"pmid"`, or
|
|
65
|
+
* `"arxiv"` when the identifier matches one of the closed forms, null
|
|
66
|
+
* otherwise. Bare forms only — prefixed input (e.g. `doi:10.1038/…`)
|
|
67
|
+
* returns null. Parsed once at the command layer; routing to suppliers
|
|
68
|
+
* serving that id type happens downstream.
|
|
69
|
+
*/
|
|
70
|
+
export function parseScienceIdentifier(identifier) {
|
|
71
|
+
if (BARE_DOI_PATTERN.test(identifier))
|
|
72
|
+
return "doi";
|
|
73
|
+
if (ARXIV_ID_PATTERN.test(identifier))
|
|
74
|
+
return "arxiv";
|
|
75
|
+
if (ARXIV_LEGACY_PATTERN.test(identifier))
|
|
76
|
+
return "arxiv";
|
|
77
|
+
if (PMID_PATTERN.test(identifier))
|
|
78
|
+
return "pmid";
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
// Shared validate helpers
|
|
83
|
+
// ---------------------------------------------------------------------------
|
|
84
|
+
/**
|
|
85
|
+
* Validate a science search request. Judges only the `query` (at least
|
|
86
|
+
* one non-whitespace character) and the `year` control grammar.
|
|
87
|
+
* `author`, `venue`, and `type` pass through unjudged — per-control
|
|
88
|
+
* accept/reject is the Adapter concern.
|
|
89
|
+
*/
|
|
90
|
+
export function validateScienceSearchRequest(request) {
|
|
91
|
+
if (typeof request.query !== "string" || request.query.trim() === "") {
|
|
92
|
+
throw new ValidationError("Query must contain at least one non-whitespace character");
|
|
93
|
+
}
|
|
94
|
+
const year = request.controls?.year;
|
|
95
|
+
if (year !== undefined) {
|
|
96
|
+
validateScienceYear(year);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Validate a science get request. The identifier must be one of the bare
|
|
101
|
+
* closed forms (`parseScienceIdentifier` non-null); anything outside the
|
|
102
|
+
* grammar throws `ValidationError`.
|
|
103
|
+
*/
|
|
104
|
+
export function validateScienceGetRequest(request) {
|
|
105
|
+
if (typeof request.identifier !== "string" ||
|
|
106
|
+
parseScienceIdentifier(request.identifier) === null) {
|
|
107
|
+
throw new ValidationError(`Invalid identifier: expected a bare DOI, numeric PMID, or arXiv id`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=science.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"science.js","sourceRoot":"","sources":["../../src/capabilities/science.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAM7B,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;AAgK5E,8EAA8E;AAC9E,gCAAgC;AAChC,8EAA8E;AAE9E,oEAAoE;AACpE,MAAM,oBAAoB,GAAG,wBAAwB,CAAC;AAEtD,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,eAAe,CACvB,iBAAiB,IAAI,uDAAuD,CAC7E,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,EAAE,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,eAAe,CACvB,uBAAuB,IAAI,gDAAgD,CAC5E,CAAC;IACJ,CAAC;AACH,CAAC;AASD,mEAAmE;AACnE,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAC7C,kEAAkE;AAClE,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AAC5C,4DAA4D;AAC5D,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;AACrD,oBAAoB;AACpB,MAAM,YAAY,GAAG,OAAO,CAAC;AAE7B;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CACpC,UAAkB;IAElB,IAAI,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IACpD,IAAI,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,OAAO,OAAO,CAAC;IACtD,IAAI,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,OAAO,OAAO,CAAC;IAC1D,IAAI,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,OAAO,MAAM,CAAC;IACjD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAC1C,OAA6B;IAE7B,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACrE,MAAM,IAAI,eAAe,CAAC,0DAA0D,CAAC,CAAC;IACxF,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC;IACpC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAA0B;IAClE,IACE,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ;QACtC,sBAAsB,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,EACnD,CAAC;QACD,MAAM,IAAI,eAAe,CACvB,oEAAoE,CACrE,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -17,6 +17,18 @@ export interface DataCommandResult<T = unknown> {
|
|
|
17
17
|
readonly data: T;
|
|
18
18
|
readonly presentations?: CommandPresentations;
|
|
19
19
|
readonly exitCode?: number;
|
|
20
|
+
/**
|
|
21
|
+
* Pre-projection (pre-`--fields`) rows for capabilities whose journal
|
|
22
|
+
* skeleton must preserve url+title identities even when the user
|
|
23
|
+
* projects away those fields in the command output.
|
|
24
|
+
*
|
|
25
|
+
* Only the search command populates this; every other command leaves
|
|
26
|
+
* it absent (undefined is not `unknown`-assignable but it's optional).
|
|
27
|
+
*/
|
|
28
|
+
readonly rawRows?: readonly {
|
|
29
|
+
url?: string;
|
|
30
|
+
title?: string;
|
|
31
|
+
}[];
|
|
20
32
|
}
|
|
21
33
|
export interface TextCommandResult {
|
|
22
34
|
readonly kind: "text";
|
|
@@ -74,5 +86,5 @@ export type SaveHook = (context: SaveHookContext) => Promise<void>;
|
|
|
74
86
|
* The trailing newline is appended at the Node Adapter boundary, not
|
|
75
87
|
* here, so `invokeCommand` itself is process-effect-free.
|
|
76
88
|
*/
|
|
77
|
-
export declare function invokeCommand(adapter: CommandInvocationAdapter, behavior: (context: CommandContext) => Promise<CommandResult>, outputMode: OutputMode, now?: () => number, secrets?: string[], save?: SaveHook): Promise<number>;
|
|
89
|
+
export declare function invokeCommand(adapter: CommandInvocationAdapter, behavior: (context: CommandContext) => Promise<CommandResult>, outputMode: OutputMode, now?: () => number, secrets?: string[], save?: SaveHook, journal?: SaveHook): Promise<number>;
|
|
78
90
|
//# sourceMappingURL=command-invocation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-invocation.d.ts","sourceRoot":"","sources":["../src/command-invocation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAKlD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,CAAC;AAErE,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAErF,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,OAAO;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,QAAQ,CAAC,aAAa,CAAC,EAAE,oBAAoB,CAAC;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"command-invocation.d.ts","sourceRoot":"","sources":["../src/command-invocation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAKlD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,CAAC;AAErE,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAErF,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,OAAO;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,QAAQ,CAAC,aAAa,CAAC,EAAE,oBAAoB,CAAC;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAChE;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,OAAO,IAAI,iBAAiB,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC;AAElF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C;AAED;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAsDnE;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,wBAAwB,EACjC,QAAQ,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,aAAa,CAAC,EAC7D,UAAU,EAAE,UAAU,EACtB,GAAG,GAAE,MAAM,MAAiB,EAC5B,OAAO,CAAC,EAAE,MAAM,EAAE,EAClB,IAAI,CAAC,EAAE,QAAQ,EACf,OAAO,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,MAAM,CAAC,CAoFjB"}
|
|
@@ -36,6 +36,11 @@ function isTextOutputMode(mode) {
|
|
|
36
36
|
* credential-shaped fields), so legitimate output is unchanged.
|
|
37
37
|
*/
|
|
38
38
|
function selectOutput(result, outputMode, now, secrets) {
|
|
39
|
+
if (outputMode === "json" || outputMode === "pretty") {
|
|
40
|
+
const data = result.kind === "text" ? result.text : result.data;
|
|
41
|
+
const redactedData = redactSecrets(data, secrets);
|
|
42
|
+
return formatSuccessOutput(redactedData, outputMode, now);
|
|
43
|
+
}
|
|
39
44
|
if (result.kind === "text") {
|
|
40
45
|
return redactSecrets(result.text, secrets);
|
|
41
46
|
}
|
|
@@ -63,7 +68,7 @@ function selectOutput(result, outputMode, now, secrets) {
|
|
|
63
68
|
* The trailing newline is appended at the Node Adapter boundary, not
|
|
64
69
|
* here, so `invokeCommand` itself is process-effect-free.
|
|
65
70
|
*/
|
|
66
|
-
export async function invokeCommand(adapter, behavior, outputMode, now = Date.now, secrets, save) {
|
|
71
|
+
export async function invokeCommand(adapter, behavior, outputMode, now = Date.now, secrets, save, journal) {
|
|
67
72
|
const notices = [];
|
|
68
73
|
// F1: resolve secrets once and redact at BOTH the success-output and
|
|
69
74
|
// error boundaries. Previously only the error path consumed `secrets`;
|
|
@@ -86,7 +91,44 @@ export async function invokeCommand(adapter, behavior, outputMode, now = Date.no
|
|
|
86
91
|
// existing catch below (notices flushed, one error envelope, stdout
|
|
87
92
|
// suppressed). With no hook this is a no-op.
|
|
88
93
|
if (save !== undefined) {
|
|
89
|
-
|
|
94
|
+
// Cluster F (cubic P2): capture the save failure but don't rethrow
|
|
95
|
+
// yet — the always-on journal hook must still run, so a
|
|
96
|
+
// provider-verified run leaves a journal row recording the attempt
|
|
97
|
+
// even when saving the artifact fails.
|
|
98
|
+
let saveThrew = false;
|
|
99
|
+
let saveError;
|
|
100
|
+
try {
|
|
101
|
+
await save({ result, resolvedSecrets, now, notice: context.notice });
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
saveThrew = true;
|
|
105
|
+
saveError = error;
|
|
106
|
+
}
|
|
107
|
+
// History-journal merge T2a: the always-on journal hook runs BESIDE
|
|
108
|
+
// the save hook at the same seam — AFTER it, so the save hook has
|
|
109
|
+
// already stamped its requestId into the shared capture cell for the
|
|
110
|
+
// saveRef cross-link. Rethrow precedence:
|
|
111
|
+
// - save succeeded, journal failed → rethrow (unchanged contract:
|
|
112
|
+
// rides the catch below — notices, one error envelope, no stdout).
|
|
113
|
+
// - save failed → the save error rethrows below; a journal error
|
|
114
|
+
// would only mask it, so it degrades to a stderr notice instead.
|
|
115
|
+
if (journal !== undefined) {
|
|
116
|
+
try {
|
|
117
|
+
await journal({ result, resolvedSecrets, now, notice: context.notice });
|
|
118
|
+
}
|
|
119
|
+
catch (journalError) {
|
|
120
|
+
if (!saveThrew) {
|
|
121
|
+
throw journalError;
|
|
122
|
+
}
|
|
123
|
+
context.notice("journal write failed after save failure");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (saveThrew) {
|
|
127
|
+
throw saveError;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else if (journal !== undefined) {
|
|
131
|
+
await journal({ result, resolvedSecrets, now, notice: context.notice });
|
|
90
132
|
}
|
|
91
133
|
}
|
|
92
134
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-invocation.js","sourceRoot":"","sources":["../src/command-invocation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"command-invocation.js","sourceRoot":"","sources":["../src/command-invocation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* archive command — Internet Archive Wayback Machine integration (ADR-0006).
|
|
3
|
+
*
|
|
4
|
+
* Implements temporal archival intelligence:
|
|
5
|
+
*
|
|
6
|
+
* - `archive cdx <url-or-pattern> [--from TS] [--to TS] [--status 200] [--limit N]`:
|
|
7
|
+
* Queries the CDX Server API to enumerate historical captures.
|
|
8
|
+
* - `archive get <url> [--at <timestamp|best>] [--raw]`:
|
|
9
|
+
* Replays a capture using Wayback's `id_` verbatim mode (toolbar stripped),
|
|
10
|
+
* auto-resolving the best snapshot via the Availability API when omitted.
|
|
11
|
+
* - `archive diff <url> --since <date|duration>`:
|
|
12
|
+
* One-shot snapshot-vs-live comparison: replays the capture at or
|
|
13
|
+
* before `--since` (CDX-selected, never nearest-after) and diffs its
|
|
14
|
+
* sections against the live page (watch-temporal-diff lane B, T3).
|
|
15
|
+
*
|
|
16
|
+
* Credential-free (public, keyless API) dispatched before config load.
|
|
17
|
+
*/
|
|
18
|
+
import type { CommandResult } from "../command-invocation.js";
|
|
19
|
+
import type { OutputMode } from "../lib/output.js";
|
|
20
|
+
import type { HandlerDependencies } from "../index.js";
|
|
21
|
+
export declare const ARCHIVE_HELP: string;
|
|
22
|
+
export declare const WAYBACK_CDX_ENDPOINT = "https://web.archive.org/cdx/search/cdx";
|
|
23
|
+
export declare const WAYBACK_AVAILABILITY_ENDPOINT = "https://archive.org/wayback/available";
|
|
24
|
+
export declare const DEFAULT_ARCHIVE_TIMEOUT_MS = 30000;
|
|
25
|
+
export interface ArchiveCapture {
|
|
26
|
+
readonly timestamp: string;
|
|
27
|
+
readonly statusCode: number;
|
|
28
|
+
readonly length: number;
|
|
29
|
+
readonly digest: string;
|
|
30
|
+
readonly originalUrl: string;
|
|
31
|
+
}
|
|
32
|
+
export interface ArchiveCdxReport {
|
|
33
|
+
readonly schemaVersion: 1;
|
|
34
|
+
readonly url: string;
|
|
35
|
+
readonly total: number;
|
|
36
|
+
readonly captures: readonly ArchiveCapture[];
|
|
37
|
+
}
|
|
38
|
+
export interface ArchiveGetReport {
|
|
39
|
+
readonly schemaVersion: 1;
|
|
40
|
+
readonly url: string;
|
|
41
|
+
readonly snapshotTimestamp: string;
|
|
42
|
+
readonly archiveUrl: string;
|
|
43
|
+
readonly statusCode: number;
|
|
44
|
+
readonly bytes: number;
|
|
45
|
+
readonly contentType?: string;
|
|
46
|
+
readonly content?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface ArchiveDiffOptions {
|
|
49
|
+
readonly since?: string;
|
|
50
|
+
readonly timeout?: number;
|
|
51
|
+
}
|
|
52
|
+
export interface ArchiveDiffReport {
|
|
53
|
+
readonly schemaVersion: 1;
|
|
54
|
+
readonly url: string;
|
|
55
|
+
readonly asOf: string;
|
|
56
|
+
readonly snapshotTimestamp: string;
|
|
57
|
+
readonly finalUrl: string;
|
|
58
|
+
readonly added: readonly string[];
|
|
59
|
+
readonly removed: readonly string[];
|
|
60
|
+
readonly changed: readonly string[];
|
|
61
|
+
readonly hashOnly: boolean;
|
|
62
|
+
readonly moved: boolean;
|
|
63
|
+
}
|
|
64
|
+
export interface ArchiveCdxOptions {
|
|
65
|
+
readonly from?: string;
|
|
66
|
+
readonly to?: string;
|
|
67
|
+
readonly status?: string;
|
|
68
|
+
readonly limit?: number;
|
|
69
|
+
readonly timeout?: number;
|
|
70
|
+
}
|
|
71
|
+
export interface ArchiveGetOptions {
|
|
72
|
+
readonly at?: string;
|
|
73
|
+
readonly raw?: boolean;
|
|
74
|
+
readonly timeout?: number;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Fetch with exponential backoff on HTTP 429/503 (rate limiting).
|
|
78
|
+
*/
|
|
79
|
+
export declare function fetchWithArchiveBackoff<T = Response>(url: string, options?: {
|
|
80
|
+
timeout?: number;
|
|
81
|
+
headers?: Record<string, string>;
|
|
82
|
+
sleep?: (ms: number) => Promise<void>;
|
|
83
|
+
}, consumer?: (res: Response) => Promise<T>): Promise<T>;
|
|
84
|
+
/**
|
|
85
|
+
* Enumerate captures via CDX server.
|
|
86
|
+
*/
|
|
87
|
+
export declare function executeArchiveCdx(urlOrPattern: string, options?: ArchiveCdxOptions, dependencies?: {
|
|
88
|
+
sleep?: (ms: number) => Promise<void>;
|
|
89
|
+
cdxEndpoint?: string;
|
|
90
|
+
}): Promise<ArchiveCdxReport>;
|
|
91
|
+
/**
|
|
92
|
+
* Resolve snapshot timestamp via Wayback Availability API.
|
|
93
|
+
*/
|
|
94
|
+
export declare function resolveAvailableSnapshot(url: string, timestampHint?: string, dependencies?: {
|
|
95
|
+
sleep?: (ms: number) => Promise<void>;
|
|
96
|
+
timeout?: number;
|
|
97
|
+
availabilityEndpoint?: string;
|
|
98
|
+
}): Promise<{
|
|
99
|
+
timestamp: string;
|
|
100
|
+
archiveUrl: string;
|
|
101
|
+
}>;
|
|
102
|
+
/**
|
|
103
|
+
* Fetch raw capture content via Wayback's `id_` verbatim mode.
|
|
104
|
+
*/
|
|
105
|
+
export declare function executeArchiveGet(url: string, options?: ArchiveGetOptions, dependencies?: {
|
|
106
|
+
sleep?: (ms: number) => Promise<void>;
|
|
107
|
+
availabilityEndpoint?: string;
|
|
108
|
+
replayBaseUrl?: string;
|
|
109
|
+
}): Promise<ArchiveGetReport>;
|
|
110
|
+
/**
|
|
111
|
+
* Invocation-seam wrapper for archive cdx.
|
|
112
|
+
*/
|
|
113
|
+
export declare function archiveCdxCommand(urlOrPattern: string, options?: ArchiveCdxOptions): Promise<CommandResult<ArchiveCdxReport>>;
|
|
114
|
+
/**
|
|
115
|
+
* Invocation-seam wrapper for archive get.
|
|
116
|
+
*/
|
|
117
|
+
export declare function archiveGetCommand(url: string, options?: ArchiveGetOptions): Promise<CommandResult<ArchiveGetReport>>;
|
|
118
|
+
export declare function resolveSinceInstant(since: string, now?: () => number): {
|
|
119
|
+
atMs: number;
|
|
120
|
+
asOf: string;
|
|
121
|
+
};
|
|
122
|
+
/** Pull the charset parameter out of a Content-Type header, if present. */
|
|
123
|
+
export declare function charsetFromContentType(contentType: string | undefined): string | undefined;
|
|
124
|
+
/**
|
|
125
|
+
* Fetch the LIVE side: manual redirect loop (≤10 hops, 303/301/302
|
|
126
|
+
* downgrade semantics per fetch), 50MB bounded read (never
|
|
127
|
+
* `arrayBuffer()`), browser UA, AbortController timeout. Returns the
|
|
128
|
+
* final body plus `moved` — true only when the chain contains a
|
|
129
|
+
* permanent (301/308) hop AND the final URL differs from the request.
|
|
130
|
+
*/
|
|
131
|
+
export declare function fetchLiveDocument(url: string, timeoutMs: number): Promise<{
|
|
132
|
+
raw: Buffer;
|
|
133
|
+
finalUrl: string;
|
|
134
|
+
moved: boolean;
|
|
135
|
+
contentType?: string;
|
|
136
|
+
statusCode: number;
|
|
137
|
+
}>;
|
|
138
|
+
/**
|
|
139
|
+
* One-shot snapshot-vs-live section diff (watch-temporal-diff lane B, T3).
|
|
140
|
+
*
|
|
141
|
+
* Archive side = snapshot RAW bytes via `id_` replay; live side = real
|
|
142
|
+
* HTTP fetch. Sections extracted from each side's bytes under its own
|
|
143
|
+
* charset hint; non-HTML degrades to hash-only per the engine contract.
|
|
144
|
+
*/
|
|
145
|
+
export declare function executeArchiveDiff(url: string, options?: ArchiveDiffOptions, dependencies?: {
|
|
146
|
+
sleep?: (ms: number) => Promise<void>;
|
|
147
|
+
cdxEndpoint?: string;
|
|
148
|
+
replayBaseUrl?: string;
|
|
149
|
+
now?: () => number;
|
|
150
|
+
}): Promise<ArchiveDiffReport>;
|
|
151
|
+
/**
|
|
152
|
+
* Same-document URL comparison: normalizes before comparing so a
|
|
153
|
+
* 301 to a trailing-slash variant of the same path is NOT a move,
|
|
154
|
+
* matching watch run's cross-surface rule. Case-insensitive host,
|
|
155
|
+
* trailing-slash-insensitive for non-root paths, query strings stay
|
|
156
|
+
* significant. Unparseable inputs fall back to exact string equality
|
|
157
|
+
* (degrades to the pre-normalization behavior, never worse).
|
|
158
|
+
* Exported for watch.ts to adopt the same comparison.
|
|
159
|
+
*/
|
|
160
|
+
export declare function isSameDocumentUrl(a: string, b: string): boolean;
|
|
161
|
+
/**
|
|
162
|
+
* Invocation-seam wrapper for archive diff.
|
|
163
|
+
*/
|
|
164
|
+
export declare function archiveDiffCommand(url: string, options?: ArchiveDiffOptions): Promise<CommandResult<ArchiveDiffReport>>;
|
|
165
|
+
/**
|
|
166
|
+
* Parse CLI args for archive command.
|
|
167
|
+
*/
|
|
168
|
+
export declare function parseArchiveArgs(args: readonly string[]): {
|
|
169
|
+
readonly subcommand?: string;
|
|
170
|
+
readonly positional: readonly string[];
|
|
171
|
+
readonly flags: Record<string, string | boolean>;
|
|
172
|
+
readonly showHelp: boolean;
|
|
173
|
+
};
|
|
174
|
+
/**
|
|
175
|
+
* Dispatcher handler for `archive` in `src/index.ts`.
|
|
176
|
+
*/
|
|
177
|
+
export declare function handleArchive(args: string[], outputMode: OutputMode, deps: HandlerDependencies, forceRaw?: boolean): Promise<number>;
|
|
178
|
+
//# sourceMappingURL=archive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":"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"}
|