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.
Files changed (270) hide show
  1. package/README.md +131 -25
  2. package/bin/scoutline.js +0 -0
  3. package/dist/capabilities/map.d.ts +3 -3
  4. package/dist/capabilities/map.js +3 -3
  5. package/dist/capabilities/quota.d.ts +13 -6
  6. package/dist/capabilities/quota.d.ts.map +1 -1
  7. package/dist/capabilities/quota.js +15 -0
  8. package/dist/capabilities/quota.js.map +1 -1
  9. package/dist/capabilities/science.d.ts +193 -0
  10. package/dist/capabilities/science.d.ts.map +1 -0
  11. package/dist/capabilities/science.js +110 -0
  12. package/dist/capabilities/science.js.map +1 -0
  13. package/dist/command-invocation.d.ts +13 -1
  14. package/dist/command-invocation.d.ts.map +1 -1
  15. package/dist/command-invocation.js +44 -2
  16. package/dist/command-invocation.js.map +1 -1
  17. package/dist/commands/archive.d.ts +178 -0
  18. package/dist/commands/archive.d.ts.map +1 -0
  19. package/dist/commands/archive.js +871 -0
  20. package/dist/commands/archive.js.map +1 -0
  21. package/dist/commands/config.d.ts.map +1 -1
  22. package/dist/commands/config.js +12 -3
  23. package/dist/commands/config.js.map +1 -1
  24. package/dist/commands/crawl.d.ts +15 -2
  25. package/dist/commands/crawl.d.ts.map +1 -1
  26. package/dist/commands/crawl.js +93 -34
  27. package/dist/commands/crawl.js.map +1 -1
  28. package/dist/commands/doctor.d.ts +8 -0
  29. package/dist/commands/doctor.d.ts.map +1 -1
  30. package/dist/commands/doctor.js +40 -5
  31. package/dist/commands/doctor.js.map +1 -1
  32. package/dist/commands/fetch.d.ts +75 -0
  33. package/dist/commands/fetch.d.ts.map +1 -0
  34. package/dist/commands/fetch.js +596 -0
  35. package/dist/commands/fetch.js.map +1 -0
  36. package/dist/commands/history.d.ts +165 -8
  37. package/dist/commands/history.d.ts.map +1 -1
  38. package/dist/commands/history.js +591 -20
  39. package/dist/commands/history.js.map +1 -1
  40. package/dist/commands/init.d.ts +13 -0
  41. package/dist/commands/init.d.ts.map +1 -1
  42. package/dist/commands/init.js +411 -43
  43. package/dist/commands/init.js.map +1 -1
  44. package/dist/commands/map.d.ts.map +1 -1
  45. package/dist/commands/map.js +5 -0
  46. package/dist/commands/map.js.map +1 -1
  47. package/dist/commands/quota.d.ts.map +1 -1
  48. package/dist/commands/quota.js +2 -0
  49. package/dist/commands/quota.js.map +1 -1
  50. package/dist/commands/read.d.ts +28 -6
  51. package/dist/commands/read.d.ts.map +1 -1
  52. package/dist/commands/read.js +328 -31
  53. package/dist/commands/read.js.map +1 -1
  54. package/dist/commands/repo.d.ts +12 -10
  55. package/dist/commands/repo.d.ts.map +1 -1
  56. package/dist/commands/repo.js +189 -21
  57. package/dist/commands/repo.js.map +1 -1
  58. package/dist/commands/repository-explorer.d.ts +15 -7
  59. package/dist/commands/repository-explorer.d.ts.map +1 -1
  60. package/dist/commands/repository-explorer.js +117 -97
  61. package/dist/commands/repository-explorer.js.map +1 -1
  62. package/dist/commands/research.d.ts +21 -4
  63. package/dist/commands/research.d.ts.map +1 -1
  64. package/dist/commands/research.js +83 -12
  65. package/dist/commands/research.js.map +1 -1
  66. package/dist/commands/science.d.ts +54 -0
  67. package/dist/commands/science.d.ts.map +1 -0
  68. package/dist/commands/science.js +999 -0
  69. package/dist/commands/science.js.map +1 -0
  70. package/dist/commands/search.d.ts +13 -2
  71. package/dist/commands/search.d.ts.map +1 -1
  72. package/dist/commands/search.js +106 -7
  73. package/dist/commands/search.js.map +1 -1
  74. package/dist/commands/watch.d.ts +94 -0
  75. package/dist/commands/watch.d.ts.map +1 -0
  76. package/dist/commands/watch.js +900 -0
  77. package/dist/commands/watch.js.map +1 -0
  78. package/dist/index.d.ts +168 -4
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +1679 -232
  81. package/dist/index.js.map +1 -1
  82. package/dist/lib/agent-registration/deploy.d.ts +69 -0
  83. package/dist/lib/agent-registration/deploy.d.ts.map +1 -0
  84. package/dist/lib/agent-registration/deploy.js +279 -0
  85. package/dist/lib/agent-registration/deploy.js.map +1 -0
  86. package/dist/lib/agent-registration/engines.d.ts +77 -0
  87. package/dist/lib/agent-registration/engines.d.ts.map +1 -0
  88. package/dist/lib/agent-registration/engines.js +544 -0
  89. package/dist/lib/agent-registration/engines.js.map +1 -0
  90. package/dist/lib/agent-registration/registry.d.ts +32 -0
  91. package/dist/lib/agent-registration/registry.d.ts.map +1 -0
  92. package/dist/lib/agent-registration/registry.js +94 -0
  93. package/dist/lib/agent-registration/registry.js.map +1 -0
  94. package/dist/lib/api-client.d.ts +2 -3
  95. package/dist/lib/api-client.d.ts.map +1 -1
  96. package/dist/lib/api-client.js +18 -0
  97. package/dist/lib/api-client.js.map +1 -1
  98. package/dist/lib/artifacts.d.ts +83 -3
  99. package/dist/lib/artifacts.d.ts.map +1 -1
  100. package/dist/lib/artifacts.js +246 -13
  101. package/dist/lib/artifacts.js.map +1 -1
  102. package/dist/lib/async-file-lock.d.ts +19 -9
  103. package/dist/lib/async-file-lock.d.ts.map +1 -1
  104. package/dist/lib/async-file-lock.js +25 -11
  105. package/dist/lib/async-file-lock.js.map +1 -1
  106. package/dist/lib/batch-manifest.d.ts +1 -0
  107. package/dist/lib/batch-manifest.d.ts.map +1 -1
  108. package/dist/lib/batch-manifest.js +12 -5
  109. package/dist/lib/batch-manifest.js.map +1 -1
  110. package/dist/lib/batch-runner.d.ts.map +1 -1
  111. package/dist/lib/batch-runner.js +25 -0
  112. package/dist/lib/batch-runner.js.map +1 -1
  113. package/dist/lib/code-mode.d.ts +19 -0
  114. package/dist/lib/code-mode.d.ts.map +1 -1
  115. package/dist/lib/code-mode.js +170 -14
  116. package/dist/lib/code-mode.js.map +1 -1
  117. package/dist/lib/config-store.d.ts +48 -1
  118. package/dist/lib/config-store.d.ts.map +1 -1
  119. package/dist/lib/config-store.js +92 -5
  120. package/dist/lib/config-store.js.map +1 -1
  121. package/dist/lib/config.js +3 -3
  122. package/dist/lib/config.js.map +1 -1
  123. package/dist/lib/errors.d.ts +20 -0
  124. package/dist/lib/errors.d.ts.map +1 -1
  125. package/dist/lib/errors.js +26 -0
  126. package/dist/lib/errors.js.map +1 -1
  127. package/dist/lib/journal.d.ts +258 -0
  128. package/dist/lib/journal.d.ts.map +1 -0
  129. package/dist/lib/journal.js +582 -0
  130. package/dist/lib/journal.js.map +1 -0
  131. package/dist/lib/mcp-client.d.ts +18 -0
  132. package/dist/lib/mcp-client.d.ts.map +1 -1
  133. package/dist/lib/mcp-client.js +145 -17
  134. package/dist/lib/mcp-client.js.map +1 -1
  135. package/dist/lib/output-budget-persistence.d.ts +76 -0
  136. package/dist/lib/output-budget-persistence.d.ts.map +1 -0
  137. package/dist/lib/output-budget-persistence.js +76 -0
  138. package/dist/lib/output-budget-persistence.js.map +1 -0
  139. package/dist/lib/output-budget.d.ts +99 -0
  140. package/dist/lib/output-budget.d.ts.map +1 -0
  141. package/dist/lib/output-budget.js +175 -0
  142. package/dist/lib/output-budget.js.map +1 -0
  143. package/dist/lib/pdf.d.ts +22 -0
  144. package/dist/lib/pdf.d.ts.map +1 -0
  145. package/dist/lib/pdf.js +1213 -0
  146. package/dist/lib/pdf.js.map +1 -0
  147. package/dist/lib/provider-fallback.d.ts.map +1 -1
  148. package/dist/lib/provider-fallback.js +3 -0
  149. package/dist/lib/provider-fallback.js.map +1 -1
  150. package/dist/lib/quota-mapping.d.ts.map +1 -1
  151. package/dist/lib/quota-mapping.js +31 -0
  152. package/dist/lib/quota-mapping.js.map +1 -1
  153. package/dist/lib/quota-store.d.ts +11 -1
  154. package/dist/lib/quota-store.d.ts.map +1 -1
  155. package/dist/lib/quota-store.js +11 -2
  156. package/dist/lib/quota-store.js.map +1 -1
  157. package/dist/lib/redact.d.ts.map +1 -1
  158. package/dist/lib/redact.js +18 -8
  159. package/dist/lib/redact.js.map +1 -1
  160. package/dist/lib/save-artifacts.d.ts +38 -0
  161. package/dist/lib/save-artifacts.d.ts.map +1 -0
  162. package/dist/lib/save-artifacts.js +146 -0
  163. package/dist/lib/save-artifacts.js.map +1 -0
  164. package/dist/lib/section-diff.d.ts +90 -0
  165. package/dist/lib/section-diff.d.ts.map +1 -0
  166. package/dist/lib/section-diff.js +395 -0
  167. package/dist/lib/section-diff.js.map +1 -0
  168. package/dist/lib/skill-source.d.ts +11 -0
  169. package/dist/lib/skill-source.d.ts.map +1 -0
  170. package/dist/lib/skill-source.js +22 -0
  171. package/dist/lib/skill-source.js.map +1 -0
  172. package/dist/lib/tty.d.ts +1 -1
  173. package/dist/lib/tty.d.ts.map +1 -1
  174. package/dist/lib/tty.js +10 -1
  175. package/dist/lib/tty.js.map +1 -1
  176. package/dist/lib/watch-store.d.ts +203 -0
  177. package/dist/lib/watch-store.d.ts.map +1 -0
  178. package/dist/lib/watch-store.js +628 -0
  179. package/dist/lib/watch-store.js.map +1 -0
  180. package/dist/providers/arxiv/adapter.d.ts +88 -0
  181. package/dist/providers/arxiv/adapter.d.ts.map +1 -0
  182. package/dist/providers/arxiv/adapter.js +316 -0
  183. package/dist/providers/arxiv/adapter.js.map +1 -0
  184. package/dist/providers/arxiv/client.d.ts +33 -0
  185. package/dist/providers/arxiv/client.d.ts.map +1 -0
  186. package/dist/providers/arxiv/client.js +130 -0
  187. package/dist/providers/arxiv/client.js.map +1 -0
  188. package/dist/providers/arxiv/diagnostics.d.ts +28 -0
  189. package/dist/providers/arxiv/diagnostics.d.ts.map +1 -0
  190. package/dist/providers/arxiv/diagnostics.js +34 -0
  191. package/dist/providers/arxiv/diagnostics.js.map +1 -0
  192. package/dist/providers/crossref/adapter.d.ts +97 -0
  193. package/dist/providers/crossref/adapter.d.ts.map +1 -0
  194. package/dist/providers/crossref/adapter.js +249 -0
  195. package/dist/providers/crossref/adapter.js.map +1 -0
  196. package/dist/providers/crossref/client.d.ts +10 -0
  197. package/dist/providers/crossref/client.d.ts.map +1 -0
  198. package/dist/providers/crossref/client.js +143 -0
  199. package/dist/providers/crossref/client.js.map +1 -0
  200. package/dist/providers/crossref/diagnostics.d.ts +18 -0
  201. package/dist/providers/crossref/diagnostics.d.ts.map +1 -0
  202. package/dist/providers/crossref/diagnostics.js +23 -0
  203. package/dist/providers/crossref/diagnostics.js.map +1 -0
  204. package/dist/providers/europepmc/adapter.d.ts +94 -0
  205. package/dist/providers/europepmc/adapter.d.ts.map +1 -0
  206. package/dist/providers/europepmc/adapter.js +264 -0
  207. package/dist/providers/europepmc/adapter.js.map +1 -0
  208. package/dist/providers/europepmc/client.d.ts +18 -0
  209. package/dist/providers/europepmc/client.d.ts.map +1 -0
  210. package/dist/providers/europepmc/client.js +128 -0
  211. package/dist/providers/europepmc/client.js.map +1 -0
  212. package/dist/providers/europepmc/diagnostics.d.ts +18 -0
  213. package/dist/providers/europepmc/diagnostics.d.ts.map +1 -0
  214. package/dist/providers/europepmc/diagnostics.js +23 -0
  215. package/dist/providers/europepmc/diagnostics.js.map +1 -0
  216. package/dist/providers/openalex/adapter.d.ts +53 -0
  217. package/dist/providers/openalex/adapter.d.ts.map +1 -0
  218. package/dist/providers/openalex/adapter.js +313 -0
  219. package/dist/providers/openalex/adapter.js.map +1 -0
  220. package/dist/providers/openalex/client.d.ts +18 -0
  221. package/dist/providers/openalex/client.d.ts.map +1 -0
  222. package/dist/providers/openalex/client.js +159 -0
  223. package/dist/providers/openalex/client.js.map +1 -0
  224. package/dist/providers/openalex/diagnostics.d.ts +19 -0
  225. package/dist/providers/openalex/diagnostics.d.ts.map +1 -0
  226. package/dist/providers/openalex/diagnostics.js +25 -0
  227. package/dist/providers/openalex/diagnostics.js.map +1 -0
  228. package/dist/providers/perplexity/adapter.d.ts +10 -8
  229. package/dist/providers/perplexity/adapter.d.ts.map +1 -1
  230. package/dist/providers/perplexity/adapter.js +68 -41
  231. package/dist/providers/perplexity/adapter.js.map +1 -1
  232. package/dist/providers/perplexity/client.d.ts +22 -12
  233. package/dist/providers/perplexity/client.d.ts.map +1 -1
  234. package/dist/providers/perplexity/client.js +18 -17
  235. package/dist/providers/perplexity/client.js.map +1 -1
  236. package/dist/providers/pubmed/adapter.d.ts +56 -0
  237. package/dist/providers/pubmed/adapter.d.ts.map +1 -0
  238. package/dist/providers/pubmed/adapter.js +425 -0
  239. package/dist/providers/pubmed/adapter.js.map +1 -0
  240. package/dist/providers/pubmed/client.d.ts +29 -0
  241. package/dist/providers/pubmed/client.d.ts.map +1 -0
  242. package/dist/providers/pubmed/client.js +153 -0
  243. package/dist/providers/pubmed/client.js.map +1 -0
  244. package/dist/providers/pubmed/diagnostics.d.ts +18 -0
  245. package/dist/providers/pubmed/diagnostics.d.ts.map +1 -0
  246. package/dist/providers/pubmed/diagnostics.js +23 -0
  247. package/dist/providers/pubmed/diagnostics.js.map +1 -0
  248. package/dist/providers/registry.d.ts.map +1 -1
  249. package/dist/providers/registry.js +16 -0
  250. package/dist/providers/registry.js.map +1 -1
  251. package/dist/providers/selection.d.ts +1 -1
  252. package/dist/providers/selection.d.ts.map +1 -1
  253. package/dist/providers/selection.js +5 -2
  254. package/dist/providers/selection.js.map +1 -1
  255. package/dist/providers/types.d.ts +28 -7
  256. package/dist/providers/types.d.ts.map +1 -1
  257. package/dist/providers/types.js +94 -6
  258. package/dist/providers/types.js.map +1 -1
  259. package/dist/providers/zai/quota.d.ts.map +1 -1
  260. package/dist/providers/zai/quota.js +29 -8
  261. package/dist/providers/zai/quota.js.map +1 -1
  262. package/dist/providers/zai/reader.d.ts.map +1 -1
  263. package/dist/providers/zai/reader.js +5 -3
  264. package/dist/providers/zai/reader.js.map +1 -1
  265. package/dist/providers/zai/repository.d.ts.map +1 -1
  266. package/dist/providers/zai/repository.js +5 -3
  267. package/dist/providers/zai/repository.js.map +1 -1
  268. package/package.json +3 -2
  269. package/skills/scoutline/SKILL.md +787 -0
  270. 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;CAC5B;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;AAgDnE;;;;;;;;;;;;;;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,GACd,OAAO,CAAC,MAAM,CAAC,CAkDjB"}
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
- await save({ result, resolvedSecrets, now, notice: context.notice });
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":"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"}
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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"}