@askalf/deepdive 0.13.1 → 0.14.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 -1
- package/dist/agent.d.ts +2 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +36 -13
- package/dist/agent.js.map +1 -1
- package/dist/browser.d.ts +1 -0
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +23 -5
- package/dist/browser.js.map +1 -1
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +22 -2
- package/dist/cache.js.map +1 -1
- package/dist/citations.d.ts +1 -0
- package/dist/citations.d.ts.map +1 -1
- package/dist/citations.js +4 -1
- package/dist/citations.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +313 -17
- package/dist/cli.js.map +1 -1
- package/dist/completion.d.ts +3 -0
- package/dist/completion.d.ts.map +1 -0
- package/dist/completion.js +110 -0
- package/dist/completion.js.map +1 -0
- package/dist/confidence.d.ts +17 -0
- package/dist/confidence.d.ts.map +1 -0
- package/dist/confidence.js +41 -0
- package/dist/confidence.js.map +1 -0
- package/dist/config-file.d.ts +13 -0
- package/dist/config-file.d.ts.map +1 -0
- package/dist/config-file.js +149 -0
- package/dist/config-file.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -0
- package/dist/config.js.map +1 -1
- package/dist/dates.d.ts +8 -0
- package/dist/dates.d.ts.map +1 -0
- package/dist/dates.js +195 -0
- package/dist/dates.js.map +1 -0
- package/dist/diff.d.ts +46 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +227 -0
- package/dist/diff.js.map +1 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +12 -6
- package/dist/doctor.js.map +1 -1
- package/dist/html-export.d.ts +6 -0
- package/dist/html-export.d.ts.map +1 -0
- package/dist/html-export.js +146 -0
- package/dist/html-export.js.map +1 -0
- package/dist/index.d.ts +10 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/markdown.d.ts +7 -0
- package/dist/markdown.d.ts.map +1 -0
- package/dist/markdown.js +232 -0
- package/dist/markdown.js.map +1 -0
- package/dist/profiles.d.ts +5 -0
- package/dist/profiles.d.ts.map +1 -0
- package/dist/profiles.js +38 -0
- package/dist/profiles.js.map +1 -0
- package/dist/robots.d.ts +1 -0
- package/dist/robots.d.ts.map +1 -1
- package/dist/robots.js +4 -7
- package/dist/robots.js.map +1 -1
- package/dist/search/arxiv.d.ts +7 -0
- package/dist/search/arxiv.d.ts.map +1 -0
- package/dist/search/arxiv.js +81 -0
- package/dist/search/arxiv.js.map +1 -0
- package/dist/search/brave.d.ts +1 -1
- package/dist/search/brave.d.ts.map +1 -1
- package/dist/search/brave.js +2 -1
- package/dist/search/brave.js.map +1 -1
- package/dist/search/duckduckgo.d.ts +1 -1
- package/dist/search/duckduckgo.d.ts.map +1 -1
- package/dist/search/duckduckgo.js +2 -1
- package/dist/search/duckduckgo.js.map +1 -1
- package/dist/search/github.d.ts +16 -0
- package/dist/search/github.d.ts.map +1 -0
- package/dist/search/github.js +59 -0
- package/dist/search/github.js.map +1 -0
- package/dist/search/searxng.d.ts +1 -1
- package/dist/search/searxng.d.ts.map +1 -1
- package/dist/search/searxng.js +2 -1
- package/dist/search/searxng.js.map +1 -1
- package/dist/search/wikipedia.d.ts +16 -0
- package/dist/search/wikipedia.d.ts.map +1 -0
- package/dist/search/wikipedia.js +56 -0
- package/dist/search/wikipedia.js.map +1 -0
- package/dist/search.d.ts +1 -0
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +26 -0
- package/dist/search.js.map +1 -1
- package/dist/sessions.d.ts +15 -0
- package/dist/sessions.d.ts.map +1 -1
- package/dist/sessions.js +67 -0
- package/dist/sessions.js.map +1 -1
- package/dist/synthesize.d.ts +6 -1
- package/dist/synthesize.d.ts.map +1 -1
- package/dist/synthesize.js +14 -5
- package/dist/synthesize.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
// HTML export — turn a saved session into a single, self-contained,
|
|
2
|
+
// shareable HTML document. No external assets, no scripts, inline CSS only,
|
|
3
|
+
// so the file works offline, opens in any browser, and can be emailed or
|
|
4
|
+
// committed as an artifact. Pure over a SessionRecord.
|
|
5
|
+
//
|
|
6
|
+
// This is the "polished artifact" that hosted research tools produce and the
|
|
7
|
+
// terminal markdown doesn't: the thing you hand to a colleague. The answer's
|
|
8
|
+
// markdown is rendered via the hand-rolled src/markdown.ts so there's still
|
|
9
|
+
// zero runtime dependency.
|
|
10
|
+
import { markdownToHtml, escapeHtml } from "./markdown.js";
|
|
11
|
+
const CITATION_ANCHOR_PREFIX = "source-";
|
|
12
|
+
const DEFAULT_FOOTER = 'Generated by <a href="https://github.com/askalf/deepdive" rel="noopener noreferrer">deepdive</a>' +
|
|
13
|
+
' — a local research agent from <a href="https://sprayberrylabs.com" rel="noopener noreferrer">Sprayberry Labs</a>.';
|
|
14
|
+
export function renderHtmlReport(record, opts = {}) {
|
|
15
|
+
const title = escapeHtml(oneLine(record.question)) || "deepdive report";
|
|
16
|
+
const body = markdownToHtml(record.answer, {
|
|
17
|
+
citationAnchorPrefix: CITATION_ANCHOR_PREFIX,
|
|
18
|
+
});
|
|
19
|
+
const meta = renderMetaLine(record);
|
|
20
|
+
const sources = renderSourcesHtml(record);
|
|
21
|
+
const footer = opts.footer === undefined ? DEFAULT_FOOTER : opts.footer;
|
|
22
|
+
const footerHtml = footer ? `\n <footer>${footer}</footer>` : "";
|
|
23
|
+
return `<!doctype html>
|
|
24
|
+
<html lang="en">
|
|
25
|
+
<head>
|
|
26
|
+
<meta charset="utf-8">
|
|
27
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
28
|
+
<meta name="generator" content="deepdive">
|
|
29
|
+
<title>${title}</title>
|
|
30
|
+
<style>${STYLE}</style>
|
|
31
|
+
</head>
|
|
32
|
+
<body>
|
|
33
|
+
<main>
|
|
34
|
+
<h1>${title}</h1>
|
|
35
|
+
${meta}
|
|
36
|
+
<article>
|
|
37
|
+
${body}
|
|
38
|
+
</article>
|
|
39
|
+
${sources}${footerHtml}
|
|
40
|
+
</main>
|
|
41
|
+
</body>
|
|
42
|
+
</html>
|
|
43
|
+
`;
|
|
44
|
+
}
|
|
45
|
+
function renderMetaLine(record) {
|
|
46
|
+
const parts = [];
|
|
47
|
+
const created = new Date(record.createdAt);
|
|
48
|
+
if (!Number.isNaN(created.getTime())) {
|
|
49
|
+
parts.push(`<time datetime="${created.toISOString()}">${created.toISOString().slice(0, 10)}</time>`);
|
|
50
|
+
}
|
|
51
|
+
if (record.llm?.model)
|
|
52
|
+
parts.push(escapeHtml(record.llm.model));
|
|
53
|
+
const n = record.sources.length;
|
|
54
|
+
parts.push(`${n} source${n === 1 ? "" : "s"}`);
|
|
55
|
+
if (record.rounds.length > 0) {
|
|
56
|
+
parts.push(`${record.rounds.length} round${record.rounds.length === 1 ? "" : "s"}`);
|
|
57
|
+
}
|
|
58
|
+
const cost = record.cost?.amountUsd;
|
|
59
|
+
if (typeof cost === "number" && Number.isFinite(cost) && cost > 0) {
|
|
60
|
+
parts.push(`~$${cost.toFixed(cost < 0.01 ? 4 : 2)}`);
|
|
61
|
+
}
|
|
62
|
+
return `<p class="meta">${parts.join(" · ")}</p>`;
|
|
63
|
+
}
|
|
64
|
+
function renderSourcesHtml(record) {
|
|
65
|
+
if (record.sources.length === 0)
|
|
66
|
+
return "";
|
|
67
|
+
const items = record.sources
|
|
68
|
+
.map((s) => {
|
|
69
|
+
const date = new Date(s.fetchedAt);
|
|
70
|
+
const fetched = Number.isNaN(date.getTime())
|
|
71
|
+
? ""
|
|
72
|
+
: `fetched ${date.toISOString().slice(0, 10)}`;
|
|
73
|
+
const pub = typeof s.publishedAt === "number"
|
|
74
|
+
? `published ${new Date(s.publishedAt).toISOString().slice(0, 10)}`
|
|
75
|
+
: "";
|
|
76
|
+
const metaBits = [pub, fetched].filter(Boolean).join(" · ");
|
|
77
|
+
const dateStr = metaBits ? ` <span class="fetched">${metaBits}</span>` : "";
|
|
78
|
+
const safeUrl = escapeHtml(s.url);
|
|
79
|
+
const label = escapeHtml(oneLine(s.title)) || safeUrl;
|
|
80
|
+
const safeHref = isSafeHref(s.url) ? safeUrl : "#";
|
|
81
|
+
return ` <li id="${CITATION_ANCHOR_PREFIX}${s.id}"><a href="${safeHref}" rel="noopener noreferrer">${label}</a>${dateStr}</li>`;
|
|
82
|
+
})
|
|
83
|
+
.join("\n");
|
|
84
|
+
return ` <section class="sources">\n <h2>Sources</h2>\n <ol>\n${items}\n </ol>\n </section>`;
|
|
85
|
+
}
|
|
86
|
+
function isSafeHref(url) {
|
|
87
|
+
return /^(https?:|mailto:|file:)/i.test(url);
|
|
88
|
+
}
|
|
89
|
+
function oneLine(s) {
|
|
90
|
+
return s.replace(/\s+/g, " ").trim();
|
|
91
|
+
}
|
|
92
|
+
// Inline stylesheet — readable typography, light/dark aware, print-friendly.
|
|
93
|
+
const STYLE = `
|
|
94
|
+
:root { color-scheme: light dark; }
|
|
95
|
+
* { box-sizing: border-box; }
|
|
96
|
+
body {
|
|
97
|
+
margin: 0;
|
|
98
|
+
font: 16px/1.65 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
99
|
+
color: #1a1a1a;
|
|
100
|
+
background: #fbfbfa;
|
|
101
|
+
}
|
|
102
|
+
main { max-width: 46rem; margin: 0 auto; padding: 3rem 1.25rem 4rem; }
|
|
103
|
+
h1 { font-size: 1.85rem; line-height: 1.25; margin: 0 0 0.5rem; letter-spacing: -0.01em; }
|
|
104
|
+
h2 { font-size: 1.3rem; margin: 2rem 0 0.75rem; }
|
|
105
|
+
h3 { font-size: 1.1rem; margin: 1.5rem 0 0.5rem; }
|
|
106
|
+
h4, h5, h6 { margin: 1.25rem 0 0.5rem; }
|
|
107
|
+
p { margin: 0 0 1rem; }
|
|
108
|
+
a { color: #1a56db; text-decoration: none; }
|
|
109
|
+
a:hover { text-decoration: underline; }
|
|
110
|
+
.meta { color: #6b7280; font-size: 0.85rem; margin: 0 0 2rem; }
|
|
111
|
+
article { font-size: 1.02rem; }
|
|
112
|
+
ul, ol { padding-left: 1.5rem; margin: 0 0 1rem; }
|
|
113
|
+
li { margin: 0.3rem 0; }
|
|
114
|
+
blockquote { margin: 0 0 1rem; padding: 0.4rem 1rem; border-left: 3px solid #d1d5db; color: #4b5563; }
|
|
115
|
+
code { font: 0.88em ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace; background: #f0f0ef; padding: 0.1em 0.35em; border-radius: 4px; }
|
|
116
|
+
pre { background: #f0f0ef; padding: 1rem; border-radius: 8px; overflow-x: auto; margin: 0 0 1rem; }
|
|
117
|
+
pre code { background: none; padding: 0; }
|
|
118
|
+
table { border-collapse: collapse; width: 100%; margin: 0 0 1.25rem; font-size: 0.95rem; }
|
|
119
|
+
th, td { border: 1px solid #e5e7eb; padding: 0.5rem 0.7rem; text-align: left; vertical-align: top; }
|
|
120
|
+
th { background: #f3f4f6; font-weight: 600; }
|
|
121
|
+
hr { border: none; border-top: 1px solid #e5e7eb; margin: 2rem 0; }
|
|
122
|
+
sup.cite { font-size: 0.7em; line-height: 0; }
|
|
123
|
+
sup.cite a { padding: 0 0.1em; }
|
|
124
|
+
.sources { margin-top: 2.5rem; border-top: 1px solid #e5e7eb; padding-top: 1rem; }
|
|
125
|
+
.sources li { margin: 0.45rem 0; }
|
|
126
|
+
.sources .fetched { color: #9ca3af; font-size: 0.82rem; }
|
|
127
|
+
:target { background: #fff3bf; scroll-margin-top: 1rem; }
|
|
128
|
+
footer { margin-top: 3rem; padding-top: 1.25rem; border-top: 1px solid #e5e7eb; color: #9ca3af; font-size: 0.82rem; }
|
|
129
|
+
@media (prefers-color-scheme: dark) {
|
|
130
|
+
body { color: #e5e7eb; background: #18181b; }
|
|
131
|
+
a { color: #7aa7ff; }
|
|
132
|
+
.meta, footer { color: #9ca3af; }
|
|
133
|
+
blockquote { border-left-color: #3f3f46; color: #a1a1aa; }
|
|
134
|
+
code, pre { background: #27272a; }
|
|
135
|
+
th { background: #27272a; }
|
|
136
|
+
th, td { border-color: #3f3f46; }
|
|
137
|
+
hr, .sources, footer { border-color: #3f3f46; }
|
|
138
|
+
:target { background: #422006; }
|
|
139
|
+
}
|
|
140
|
+
@media print {
|
|
141
|
+
body { background: #fff; }
|
|
142
|
+
main { max-width: none; padding: 0; }
|
|
143
|
+
a { color: inherit; }
|
|
144
|
+
}
|
|
145
|
+
`.trim();
|
|
146
|
+
//# sourceMappingURL=html-export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-export.js","sourceRoot":"","sources":["../src/html-export.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,19 +3,27 @@ export { planQueries, parsePlan, critique, parseCritique, type Plan, type Critiq
|
|
|
3
3
|
export { resolveSearchAdapter, dedupeByUrl, type SearchAdapter, type SearchResult, } from "./search.js";
|
|
4
4
|
export { BrowserSession, type BrowserOptions, type FetchedPage } from "./browser.js";
|
|
5
5
|
export { extractContent, type ExtractedContent } from "./extract.js";
|
|
6
|
-
export { synthesize, type SourceWithContent } from "./synthesize.js";
|
|
6
|
+
export { synthesize, type SourceWithContent, type SynthesizeOptions } from "./synthesize.js";
|
|
7
|
+
export { extractPublishedDate, metaTags, jsonLdDates, toEpoch, } from "./dates.js";
|
|
8
|
+
export { assessConfidence, formatConfidenceLine, type ConfidenceLevel, type ConfidenceInput, type ConfidenceAssessment, } from "./confidence.js";
|
|
7
9
|
export { buildSourceTable, renderAnswerMarkdown, renderSourcesMarkdown, type Source, } from "./citations.js";
|
|
8
10
|
export { callLLM, LLMError, DEFAULT_LLM_TIMEOUT_MS, DEFAULT_LLM_ATTEMPTS, type LLMConfig, type LLMMessage, type LLMResult, } from "./llm.js";
|
|
9
11
|
export { callLLMStream, parseBlocks, parseSSE, type StreamOptions } from "./llm-stream.js";
|
|
10
12
|
export { retry, backoffDelay, type RetryOptions } from "./retry.js";
|
|
11
13
|
export { resolveConfig, type RuntimeConfig, type CLIFlags } from "./config.js";
|
|
14
|
+
export { loadConfigFile, fileConfigToEnv, knownConfigKeys, defaultConfigPath, type FileConfig, type ParsedConfigFile, } from "./config-file.js";
|
|
15
|
+
export { BUILTIN_PROFILES, resolveProfile, listProfiles } from "./profiles.js";
|
|
16
|
+
export { completionScript, type Shell } from "./completion.js";
|
|
12
17
|
export { createCache, cacheKey, type PageCache, type CacheOptions } from "./cache.js";
|
|
13
18
|
export { runConcurrent } from "./concurrency.js";
|
|
14
19
|
export { priceFor, estimateCost, formatCostLine, formatUsd, formatTokens, looksLikeDario, daysAgo, PRICE_TABLE, PRICE_TABLE_VERIFIED_AT, PRICE_TABLE_STALE_AFTER_DAYS, DARIO_DEFAULT_BASE_URL, type ModelPrice, type TokenUsage, type CostEstimate, } from "./pricing.js";
|
|
15
20
|
export { extractPdfText, isPdfExtractorAvailable, looksLikePdf, joinTextItems, dedupeRunningHeadersFooters, PdfExtractorMissingError, type PdfExtractOptions, type PdfExtractResult, } from "./pdf.js";
|
|
16
21
|
export { ingestLocalPaths, expandPaths, stripTags, type LocalIngestOptions, type LocalIngestResult, } from "./local.js";
|
|
17
22
|
export { classifyUrl, matchesAny, normalizePattern, parseDomainList, type DomainFilter, type DomainVerdict, } from "./domain-filter.js";
|
|
18
|
-
export { generateSessionId, saveSession, loadSession, listSessions, resolveSessionId, renderSessionsList, defaultSessionsDir, humanDuration, type SessionRecord, type SessionMeta, type SessionStorageOptions, } from "./sessions.js";
|
|
23
|
+
export { generateSessionId, saveSession, loadSession, listSessions, resolveSessionId, renderSessionsList, defaultSessionsDir, humanDuration, deleteSession, pruneSessions, selectSessionsToPrune, parseDuration, type SessionRecord, type SessionMeta, type SessionStorageOptions, type PruneCriteria, } from "./sessions.js";
|
|
24
|
+
export { markdownToHtml, renderInline, escapeHtml, type MarkdownToHtmlOptions, } from "./markdown.js";
|
|
25
|
+
export { renderHtmlReport, type HtmlReportOptions, } from "./html-export.js";
|
|
26
|
+
export { diffSessions, diffSources, diffLines, renderDiffText, buildDiffNarrateUser, DIFF_NARRATE_SYSTEM, type SessionDiff, type SourceRef, type DiffLine, type LineKind, type SessionSide, type RenderDiffOptions, } from "./diff.js";
|
|
19
27
|
export { detectApiFormat, toOpenAIRequest, fromOpenAIResponse, openaiSSEToAnthropic, authHeadersFor, pathFor, type ApiFormat, type AnthropicRequestBody, type OpenAIRequestBody, type AnthropicResponseShape, type OpenAIResponseShape, type AnthropicSSEEvent, type OpenAIStreamEvent, } from "./llm-format.js";
|
|
20
28
|
export { verifyCitations, splitSentences, extractCiteIds, contentTokens, recall, stripSourcesBlock, DEFAULT_CITE_MIN_RECALL, type CitationCheck, type VerificationReport, type VerifyOptions, } from "./verify.js";
|
|
21
29
|
export { trimTrailingSlashes, stripHashFragment, dedupeKey } from "./url-util.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,QAAQ,EACR,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,WAAW,EACX,SAAS,EACT,QAAQ,EACR,aAAa,EACb,KAAK,IAAI,EACT,KAAK,QAAQ,GACd,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -5,18 +5,26 @@ export { resolveSearchAdapter, dedupeByUrl, } from "./search.js";
|
|
|
5
5
|
export { BrowserSession } from "./browser.js";
|
|
6
6
|
export { extractContent } from "./extract.js";
|
|
7
7
|
export { synthesize } from "./synthesize.js";
|
|
8
|
+
export { extractPublishedDate, metaTags, jsonLdDates, toEpoch, } from "./dates.js";
|
|
9
|
+
export { assessConfidence, formatConfidenceLine, } from "./confidence.js";
|
|
8
10
|
export { buildSourceTable, renderAnswerMarkdown, renderSourcesMarkdown, } from "./citations.js";
|
|
9
11
|
export { callLLM, LLMError, DEFAULT_LLM_TIMEOUT_MS, DEFAULT_LLM_ATTEMPTS, } from "./llm.js";
|
|
10
12
|
export { callLLMStream, parseBlocks, parseSSE } from "./llm-stream.js";
|
|
11
13
|
export { retry, backoffDelay } from "./retry.js";
|
|
12
14
|
export { resolveConfig } from "./config.js";
|
|
15
|
+
export { loadConfigFile, fileConfigToEnv, knownConfigKeys, defaultConfigPath, } from "./config-file.js";
|
|
16
|
+
export { BUILTIN_PROFILES, resolveProfile, listProfiles } from "./profiles.js";
|
|
17
|
+
export { completionScript } from "./completion.js";
|
|
13
18
|
export { createCache, cacheKey } from "./cache.js";
|
|
14
19
|
export { runConcurrent } from "./concurrency.js";
|
|
15
20
|
export { priceFor, estimateCost, formatCostLine, formatUsd, formatTokens, looksLikeDario, daysAgo, PRICE_TABLE, PRICE_TABLE_VERIFIED_AT, PRICE_TABLE_STALE_AFTER_DAYS, DARIO_DEFAULT_BASE_URL, } from "./pricing.js";
|
|
16
21
|
export { extractPdfText, isPdfExtractorAvailable, looksLikePdf, joinTextItems, dedupeRunningHeadersFooters, PdfExtractorMissingError, } from "./pdf.js";
|
|
17
22
|
export { ingestLocalPaths, expandPaths, stripTags, } from "./local.js";
|
|
18
23
|
export { classifyUrl, matchesAny, normalizePattern, parseDomainList, } from "./domain-filter.js";
|
|
19
|
-
export { generateSessionId, saveSession, loadSession, listSessions, resolveSessionId, renderSessionsList, defaultSessionsDir, humanDuration, } from "./sessions.js";
|
|
24
|
+
export { generateSessionId, saveSession, loadSession, listSessions, resolveSessionId, renderSessionsList, defaultSessionsDir, humanDuration, deleteSession, pruneSessions, selectSessionsToPrune, parseDuration, } from "./sessions.js";
|
|
25
|
+
export { markdownToHtml, renderInline, escapeHtml, } from "./markdown.js";
|
|
26
|
+
export { renderHtmlReport, } from "./html-export.js";
|
|
27
|
+
export { diffSessions, diffSources, diffLines, renderDiffText, buildDiffNarrateUser, DIFF_NARRATE_SYSTEM, } from "./diff.js";
|
|
20
28
|
export { detectApiFormat, toOpenAIRequest, fromOpenAIResponse, openaiSSEToAnthropic, authHeadersFor, pathFor, } from "./llm-format.js";
|
|
21
29
|
export { verifyCitations, splitSentences, extractCiteIds, contentTokens, recall, stripSourcesBlock, DEFAULT_CITE_MIN_RECALL, } from "./verify.js";
|
|
22
30
|
export { trimTrailingSlashes, stripHashFragment, dedupeKey } from "./url-util.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAExC,OAAO,EACL,QAAQ,GAMT,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,WAAW,EACX,SAAS,EACT,QAAQ,EACR,aAAa,GAGd,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,oBAAoB,EACpB,WAAW,GAGZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAyC,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,cAAc,EAAyB,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface MarkdownToHtmlOptions {
|
|
2
|
+
citationAnchorPrefix?: string;
|
|
3
|
+
}
|
|
4
|
+
export declare function markdownToHtml(md: string, opts?: MarkdownToHtmlOptions): string;
|
|
5
|
+
export declare function renderInline(text: string, opts?: MarkdownToHtmlOptions): string;
|
|
6
|
+
export declare function escapeHtml(s: string): string;
|
|
7
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,qBAAqB;IAIpC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AASD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,MAAM,CA6GnF;AAmED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,MAAM,CA+CnF;AASD,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAO5C"}
|
package/dist/markdown.js
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
// Minimal, hand-rolled Markdown → HTML renderer.
|
|
2
|
+
//
|
|
3
|
+
// deepdive's "one runtime dependency" rule (see CLAUDE.md) rules out a
|
|
4
|
+
// markdown library, but the HTML export (`deepdive export <id> --format=html`)
|
|
5
|
+
// needs to turn the synthesizer's GitHub-flavored markdown into a polished,
|
|
6
|
+
// shareable document. This covers exactly the subset the synthesizer emits:
|
|
7
|
+
// ATX headings, paragraphs, bold/italic, inline + fenced code, links,
|
|
8
|
+
// ordered/unordered lists, GFM tables, blockquotes, horizontal rules, and the
|
|
9
|
+
// inline `[N]` citation markers (turned into superscript anchors so a reader
|
|
10
|
+
// can jump to the source).
|
|
11
|
+
//
|
|
12
|
+
// Pure over strings; no DOM, no deps. If the synthesizer starts emitting a
|
|
13
|
+
// construct this doesn't handle, the text falls through as an escaped
|
|
14
|
+
// paragraph rather than breaking — fail soft, since this is presentation, not
|
|
15
|
+
// data.
|
|
16
|
+
// Private-use sentinels that cannot occur in escaped source text. Used to
|
|
17
|
+
// "park" already-generated HTML so later inline passes never touch it.
|
|
18
|
+
const PARK_OPEN = String.fromCharCode(0xe000);
|
|
19
|
+
const PARK_CLOSE = String.fromCharCode(0xe001);
|
|
20
|
+
// Render a markdown document to an HTML fragment (no <html>/<body> wrapper —
|
|
21
|
+
// the caller owns the document shell). Block-level first, inline second.
|
|
22
|
+
export function markdownToHtml(md, opts = {}) {
|
|
23
|
+
const lines = md.replace(/\r\n/g, "\n").replace(/\r/g, "\n").split("\n");
|
|
24
|
+
const blocks = [];
|
|
25
|
+
let i = 0;
|
|
26
|
+
while (i < lines.length) {
|
|
27
|
+
const line = lines[i];
|
|
28
|
+
// Blank line — skip; blocks are separated structurally.
|
|
29
|
+
if (line.trim() === "") {
|
|
30
|
+
i++;
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
// Fenced code block: ``` or ~~~ (optional language hint, which we ignore).
|
|
34
|
+
const fence = /^(```+|~~~+)(.*)$/.exec(line.trim());
|
|
35
|
+
if (fence) {
|
|
36
|
+
const marker = fence[1];
|
|
37
|
+
const body = [];
|
|
38
|
+
i++;
|
|
39
|
+
while (i < lines.length && lines[i].trim() !== marker) {
|
|
40
|
+
body.push(lines[i]);
|
|
41
|
+
i++;
|
|
42
|
+
}
|
|
43
|
+
i++; // consume closing fence (or run off the end)
|
|
44
|
+
blocks.push(`<pre><code>${escapeHtml(body.join("\n"))}</code></pre>`);
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
// Horizontal rule.
|
|
48
|
+
if (/^(\s*[-*_])(\s*\1){2,}\s*$/.test(line)) {
|
|
49
|
+
blocks.push("<hr>");
|
|
50
|
+
i++;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
// ATX heading (# … ######).
|
|
54
|
+
const heading = /^(#{1,6})\s+(.*)$/.exec(line);
|
|
55
|
+
if (heading) {
|
|
56
|
+
const level = heading[1].length;
|
|
57
|
+
blocks.push(`<h${level}>${renderInline(heading[2].trim(), opts)}</h${level}>`);
|
|
58
|
+
i++;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
// GFM table: a header row of `| … |` immediately followed by a
|
|
62
|
+
// separator row of dashes/colons.
|
|
63
|
+
if (isTableRow(line) && i + 1 < lines.length && isTableSeparator(lines[i + 1])) {
|
|
64
|
+
const tableLines = [line, lines[i + 1]];
|
|
65
|
+
i += 2;
|
|
66
|
+
while (i < lines.length && isTableRow(lines[i])) {
|
|
67
|
+
tableLines.push(lines[i]);
|
|
68
|
+
i++;
|
|
69
|
+
}
|
|
70
|
+
blocks.push(renderTable(tableLines, opts));
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
// Blockquote: one or more consecutive `> ` lines.
|
|
74
|
+
if (/^\s*>\s?/.test(line)) {
|
|
75
|
+
const quoted = [];
|
|
76
|
+
while (i < lines.length && /^\s*>\s?/.test(lines[i])) {
|
|
77
|
+
quoted.push(lines[i].replace(/^\s*>\s?/, ""));
|
|
78
|
+
i++;
|
|
79
|
+
}
|
|
80
|
+
blocks.push(`<blockquote>${markdownToHtml(quoted.join("\n"), opts)}</blockquote>`);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
// Lists: a run of ordered (`1.`) or unordered (`-`/`*`/`+`) items.
|
|
84
|
+
if (isListItem(line)) {
|
|
85
|
+
const ordered = isOrderedItem(line);
|
|
86
|
+
const items = [];
|
|
87
|
+
while (i < lines.length && isListItem(lines[i]) && isOrderedItem(lines[i]) === ordered) {
|
|
88
|
+
// Gather continuation lines (non-blank, non-item) into the same <li>
|
|
89
|
+
// so wrapped list text stays together.
|
|
90
|
+
let item = lines[i].replace(LIST_ITEM_RE, "");
|
|
91
|
+
i++;
|
|
92
|
+
while (i < lines.length &&
|
|
93
|
+
lines[i].trim() !== "" &&
|
|
94
|
+
!isListItem(lines[i]) &&
|
|
95
|
+
!/^#{1,6}\s/.test(lines[i])) {
|
|
96
|
+
item += " " + lines[i].trim();
|
|
97
|
+
i++;
|
|
98
|
+
}
|
|
99
|
+
items.push(`<li>${renderInline(item.trim(), opts)}</li>`);
|
|
100
|
+
}
|
|
101
|
+
const tag = ordered ? "ol" : "ul";
|
|
102
|
+
blocks.push(`<${tag}>\n${items.join("\n")}\n</${tag}>`);
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
// Paragraph: consume until a blank line or a line that starts a new block.
|
|
106
|
+
const para = [line];
|
|
107
|
+
i++;
|
|
108
|
+
while (i < lines.length &&
|
|
109
|
+
lines[i].trim() !== "" &&
|
|
110
|
+
!startsNewBlock(lines[i], lines[i + 1])) {
|
|
111
|
+
para.push(lines[i]);
|
|
112
|
+
i++;
|
|
113
|
+
}
|
|
114
|
+
blocks.push(`<p>${renderInline(para.join(" ").trim(), opts)}</p>`);
|
|
115
|
+
}
|
|
116
|
+
return blocks.join("\n");
|
|
117
|
+
}
|
|
118
|
+
const LIST_ITEM_RE = /^\s*(?:[-*+]|\d+[.)])\s+/;
|
|
119
|
+
function isListItem(line) {
|
|
120
|
+
return LIST_ITEM_RE.test(line);
|
|
121
|
+
}
|
|
122
|
+
function isOrderedItem(line) {
|
|
123
|
+
return /^\s*\d+[.)]\s+/.test(line);
|
|
124
|
+
}
|
|
125
|
+
function isTableRow(line) {
|
|
126
|
+
const t = line.trim();
|
|
127
|
+
return t.startsWith("|") && t.endsWith("|") && t.length >= 2;
|
|
128
|
+
}
|
|
129
|
+
function isTableSeparator(line) {
|
|
130
|
+
const t = line.trim();
|
|
131
|
+
if (!t.startsWith("|"))
|
|
132
|
+
return false;
|
|
133
|
+
return /^\|?(\s*:?-{1,}:?\s*\|)+\s*$/.test(t);
|
|
134
|
+
}
|
|
135
|
+
function startsNewBlock(line, next) {
|
|
136
|
+
if (/^#{1,6}\s/.test(line))
|
|
137
|
+
return true;
|
|
138
|
+
if (/^(```+|~~~+)/.test(line.trim()))
|
|
139
|
+
return true;
|
|
140
|
+
if (/^(\s*[-*_])(\s*\1){2,}\s*$/.test(line))
|
|
141
|
+
return true;
|
|
142
|
+
if (/^\s*>\s?/.test(line))
|
|
143
|
+
return true;
|
|
144
|
+
if (isListItem(line))
|
|
145
|
+
return true;
|
|
146
|
+
if (isTableRow(line) && next !== undefined && isTableSeparator(next))
|
|
147
|
+
return true;
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
function renderTable(tableLines, opts) {
|
|
151
|
+
const splitRow = (row) => row
|
|
152
|
+
.trim()
|
|
153
|
+
.replace(/^\|/, "")
|
|
154
|
+
.replace(/\|$/, "")
|
|
155
|
+
.split("|")
|
|
156
|
+
.map((c) => c.trim());
|
|
157
|
+
const header = splitRow(tableLines[0]);
|
|
158
|
+
const bodyRows = tableLines.slice(2).map(splitRow);
|
|
159
|
+
const thead = "<thead><tr>" +
|
|
160
|
+
header.map((c) => `<th>${renderInline(c, opts)}</th>`).join("") +
|
|
161
|
+
"</tr></thead>";
|
|
162
|
+
const tbody = "<tbody>" +
|
|
163
|
+
bodyRows
|
|
164
|
+
.map((cells) => "<tr>" +
|
|
165
|
+
cells.map((c) => `<td>${renderInline(c, opts)}</td>`).join("") +
|
|
166
|
+
"</tr>")
|
|
167
|
+
.join("") +
|
|
168
|
+
"</tbody>";
|
|
169
|
+
return `<table>${thead}${tbody}</table>`;
|
|
170
|
+
}
|
|
171
|
+
// Inline rendering. Escape HTML once up front, then layer markup back on via
|
|
172
|
+
// sentinel-parked placeholders so we never re-process generated tags. Order
|
|
173
|
+
// matters: code spans and links are extracted first (their contents must not
|
|
174
|
+
// be touched by later passes), then citations, then emphasis.
|
|
175
|
+
export function renderInline(text, opts = {}) {
|
|
176
|
+
let out = escapeHtml(text);
|
|
177
|
+
const stash = [];
|
|
178
|
+
const park = (html) => {
|
|
179
|
+
stash.push(html);
|
|
180
|
+
return `${PARK_OPEN}${stash.length - 1}${PARK_CLOSE}`;
|
|
181
|
+
};
|
|
182
|
+
// Inline code: `code` — content is literal, no further processing.
|
|
183
|
+
out = out.replace(/`([^`]+)`/g, (_m, code) => park(`<code>${code}</code>`));
|
|
184
|
+
// Links: [text](url). The text is already escaped; the url is escaped too.
|
|
185
|
+
// Only http(s), mailto, file, and in-doc (#) targets are allowed — anything
|
|
186
|
+
// else (javascript:, data:) renders as plain text to avoid injection in the
|
|
187
|
+
// exported HTML.
|
|
188
|
+
out = out.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g, (m, label, url) => {
|
|
189
|
+
if (!isSafeHref(url))
|
|
190
|
+
return m;
|
|
191
|
+
return park(`<a href="${url}" rel="noopener noreferrer">${label}</a>`);
|
|
192
|
+
});
|
|
193
|
+
// Citations: a `[N]` (or `[N][M]…`) run NOT immediately followed by `(`
|
|
194
|
+
// (which would make it a link we failed to parse). Each [N] becomes a
|
|
195
|
+
// superscript anchor (when a prefix is set) or a plain bracketed superscript.
|
|
196
|
+
out = out.replace(/(?:\[\d+\])+(?!\()/g, (run) => {
|
|
197
|
+
const ids = run.match(/\d+/g) ?? [];
|
|
198
|
+
const sups = ids
|
|
199
|
+
.map((id) => opts.citationAnchorPrefix
|
|
200
|
+
? `<a href="#${opts.citationAnchorPrefix}${id}">${id}</a>`
|
|
201
|
+
: `[${id}]`)
|
|
202
|
+
.join("");
|
|
203
|
+
return park(`<sup class="cite">${sups}</sup>`);
|
|
204
|
+
});
|
|
205
|
+
// Bold then italic. **x** / __x__ first so the single-char rules don't eat
|
|
206
|
+
// the markers.
|
|
207
|
+
out = out.replace(/\*\*([^*]+)\*\*/g, (_m, x) => `<strong>${x}</strong>`);
|
|
208
|
+
out = out.replace(/__([^_]+)__/g, (_m, x) => `<strong>${x}</strong>`);
|
|
209
|
+
out = out.replace(/(^|[^*])\*([^*\s][^*]*?)\*(?!\*)/g, (_m, pre, x) => `${pre}<em>${x}</em>`);
|
|
210
|
+
out = out.replace(/(^|[^_])_([^_\s][^_]*?)_(?!_)/g, (_m, pre, x) => `${pre}<em>${x}</em>`);
|
|
211
|
+
// Restore parked spans.
|
|
212
|
+
const restoreRe = new RegExp(`${PARK_OPEN}(\\d+)${PARK_CLOSE}`, "g");
|
|
213
|
+
out = out.replace(restoreRe, (_m, n) => stash[Number(n)]);
|
|
214
|
+
return out;
|
|
215
|
+
}
|
|
216
|
+
function isSafeHref(url) {
|
|
217
|
+
if (url.startsWith("#"))
|
|
218
|
+
return true;
|
|
219
|
+
if (url.startsWith("/") || url.startsWith("./") || url.startsWith("../"))
|
|
220
|
+
return true;
|
|
221
|
+
return /^(https?:|mailto:|file:)/i.test(url);
|
|
222
|
+
}
|
|
223
|
+
// Exported for unit tests. Escapes the five HTML-significant characters.
|
|
224
|
+
export function escapeHtml(s) {
|
|
225
|
+
return s
|
|
226
|
+
.replace(/&/g, "&")
|
|
227
|
+
.replace(/</g, "<")
|
|
228
|
+
.replace(/>/g, ">")
|
|
229
|
+
.replace(/"/g, """)
|
|
230
|
+
.replace(/'/g, "'");
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FileConfig } from "./config-file.js";
|
|
2
|
+
export declare const BUILTIN_PROFILES: Record<string, FileConfig>;
|
|
3
|
+
export declare function resolveProfile(name: string, userProfiles?: Record<string, FileConfig>): FileConfig;
|
|
4
|
+
export declare function listProfiles(userProfiles?: Record<string, FileConfig>): string[];
|
|
5
|
+
//# sourceMappingURL=profiles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../src/profiles.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAgBvD,CAAC;AAKF,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,YAAY,GAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAM,GAC5C,UAAU,CASZ;AAGD,wBAAgB,YAAY,CAC1B,YAAY,GAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAM,GAC5C,MAAM,EAAE,CAIV"}
|
package/dist/profiles.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// Named profiles — reusable bundles of settings selected with --profile=<name>.
|
|
2
|
+
// Built-ins cover the common modes; a user's config file can add or override
|
|
3
|
+
// profiles of the same name. Selecting a profile is equivalent to setting its
|
|
4
|
+
// keys as defaults (below env + CLI flags) for that run.
|
|
5
|
+
// Built-in profiles. Values use the same friendly keys as the config file.
|
|
6
|
+
export const BUILTIN_PROFILES = {
|
|
7
|
+
// Iterate harder: 3 critic rounds.
|
|
8
|
+
deep: { deep: 3 },
|
|
9
|
+
// Maximum diligence: deeper loop, wider source net, strict citations.
|
|
10
|
+
thorough: { deep: 4, maxSources: 20, strictCites: true },
|
|
11
|
+
// Lowest latency: high fetch concurrency, single-pass.
|
|
12
|
+
fast: { concurrency: 8, deep: 0 },
|
|
13
|
+
// Spend less: cheap models for the structurally-simple plan/critic stages,
|
|
14
|
+
// keep the quality model for synthesis.
|
|
15
|
+
cheap: {
|
|
16
|
+
planModel: "claude-haiku-4-5",
|
|
17
|
+
criticModel: "claude-haiku-4-5",
|
|
18
|
+
synthModel: "claude-sonnet-4-6",
|
|
19
|
+
},
|
|
20
|
+
// Fail the run on any weakly-supported citation; raise the recall bar.
|
|
21
|
+
strict: { strictCites: true, citeMinRecall: 0.5 },
|
|
22
|
+
};
|
|
23
|
+
// Resolve a profile name to its config. A user profile of the same name
|
|
24
|
+
// overrides the built-in (its keys win on top of the built-in's). Throws with
|
|
25
|
+
// the list of available profiles when the name is unknown.
|
|
26
|
+
export function resolveProfile(name, userProfiles = {}) {
|
|
27
|
+
const builtin = BUILTIN_PROFILES[name];
|
|
28
|
+
const user = userProfiles[name];
|
|
29
|
+
if (!builtin && !user) {
|
|
30
|
+
throw new Error(`unknown profile: ${name} (available: ${listProfiles(userProfiles).join(", ")})`);
|
|
31
|
+
}
|
|
32
|
+
return { ...(builtin ?? {}), ...(user ?? {}) };
|
|
33
|
+
}
|
|
34
|
+
// All selectable profile names — built-ins plus any from the config file.
|
|
35
|
+
export function listProfiles(userProfiles = {}) {
|
|
36
|
+
return Array.from(new Set([...Object.keys(BUILTIN_PROFILES), ...Object.keys(userProfiles)])).sort();
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../src/profiles.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,6EAA6E;AAC7E,8EAA8E;AAC9E,yDAAyD;AAIzD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,gBAAgB,GAA+B;IAC1D,mCAAmC;IACnC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;IACjB,sEAAsE;IACtE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;IACxD,uDAAuD;IACvD,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;IACjC,2EAA2E;IAC3E,wCAAwC;IACxC,KAAK,EAAE;QACL,SAAS,EAAE,kBAAkB;QAC7B,WAAW,EAAE,kBAAkB;QAC/B,UAAU,EAAE,mBAAmB;KAChC;IACD,uEAAuE;IACvE,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE;CAClD,CAAC;AAEF,wEAAwE;AACxE,8EAA8E;AAC9E,2DAA2D;AAC3D,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,eAA2C,EAAE;IAE7C,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,oBAAoB,IAAI,gBAAgB,YAAY,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACjF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;AACjD,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,YAAY,CAC1B,eAA2C,EAAE;IAE7C,OAAO,KAAK,CAAC,IAAI,CACf,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAC1E,CAAC,IAAI,EAAE,CAAC;AACX,CAAC"}
|
package/dist/robots.d.ts
CHANGED
package/dist/robots.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"robots.d.ts","sourceRoot":"","sources":["../src/robots.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAG3B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,GAAG,SAAS,CAAC;IACrD,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAAC;CACxD;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD,wBAAgB,iBAAiB,IAAI,WAAW,CAM/C;AAED,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAqB5B;AAiCD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"robots.d.ts","sourceRoot":"","sources":["../src/robots.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAG3B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,GAAG,SAAS,CAAC;IACrD,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAAC;CACxD;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD,wBAAgB,iBAAiB,IAAI,WAAW,CAM/C;AAED,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAqB5B;AAiCD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CA+CzD;AAGD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CA+BT"}
|
package/dist/robots.js
CHANGED
|
@@ -107,18 +107,15 @@ export function parseRobotsTxt(text) {
|
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
return {
|
|
110
|
-
|
|
110
|
+
// Full rules in file order, each carrying its user-agent. isPathAllowed
|
|
111
|
+
// reads these directly (longest-match per RFC 9309).
|
|
112
|
+
rules: grouped,
|
|
111
113
|
crawlDelaySec: crawlDelay,
|
|
112
|
-
// We stash the grouping by keeping a hidden field. But since we want a
|
|
113
|
-
// clean exported type, bake agent-matching in: we'll re-do the parse at
|
|
114
|
-
// check time. Simpler: re-parse cheaply or store a bigger structure.
|
|
115
|
-
// Actually let's just store the grouped form and compute at check time:
|
|
116
|
-
...{ _grouped: grouped },
|
|
117
114
|
};
|
|
118
115
|
}
|
|
119
116
|
// Exported for unit tests.
|
|
120
117
|
export function isPathAllowed(parsed, path, userAgent) {
|
|
121
|
-
const grouped = parsed.
|
|
118
|
+
const grouped = parsed.rules;
|
|
122
119
|
if (grouped.length === 0)
|
|
123
120
|
return true;
|
|
124
121
|
const ua = userAgent.toLowerCase();
|