@michaelborck/honeyguide-core 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/README.md +4 -0
  2. package/dist/align/outcomes.d.ts +75 -0
  3. package/dist/align/outcomes.js +266 -0
  4. package/dist/align/outcomes.js.map +1 -0
  5. package/dist/align/reasons.d.ts +11 -0
  6. package/dist/align/reasons.js +84 -0
  7. package/dist/align/reasons.js.map +1 -0
  8. package/dist/annotate/ladder.d.ts +1 -1
  9. package/dist/annotate/ladder.js +2 -2
  10. package/dist/annotate/ladder.js.map +1 -1
  11. package/dist/annotate/ollama.d.ts +3 -1
  12. package/dist/annotate/ollama.js +17 -11
  13. package/dist/annotate/ollama.js.map +1 -1
  14. package/dist/batch.d.ts +0 -0
  15. package/dist/batch.js +0 -0
  16. package/dist/batch.js.map +0 -0
  17. package/dist/brief.d.ts +30 -0
  18. package/dist/brief.js +70 -0
  19. package/dist/brief.js.map +1 -0
  20. package/dist/collection.d.ts +27 -0
  21. package/dist/collection.js +98 -0
  22. package/dist/collection.js.map +1 -0
  23. package/dist/config.d.ts +31 -1
  24. package/dist/config.js +10 -0
  25. package/dist/config.js.map +1 -1
  26. package/dist/enrich/page.d.ts +0 -0
  27. package/dist/enrich/page.js +0 -0
  28. package/dist/enrich/page.js.map +0 -0
  29. package/dist/enrich/sourceType.d.ts +0 -0
  30. package/dist/enrich/sourceType.js +0 -0
  31. package/dist/enrich/sourceType.js.map +0 -0
  32. package/dist/enrich/unpaywall.d.ts +28 -0
  33. package/dist/enrich/unpaywall.js +36 -0
  34. package/dist/enrich/unpaywall.js.map +1 -0
  35. package/dist/export/citations.d.ts +0 -0
  36. package/dist/export/citations.js +0 -0
  37. package/dist/export/citations.js.map +0 -0
  38. package/dist/export/lmsHtml.d.ts +0 -0
  39. package/dist/export/lmsHtml.js +16 -2
  40. package/dist/export/lmsHtml.js.map +1 -1
  41. package/dist/export/markdown.d.ts +0 -0
  42. package/dist/export/markdown.js +11 -3
  43. package/dist/export/markdown.js.map +1 -1
  44. package/dist/index.d.ts +18 -1
  45. package/dist/index.js +17 -1
  46. package/dist/index.js.map +1 -1
  47. package/dist/pipeline.d.ts +2 -2
  48. package/dist/pipeline.js +117 -12
  49. package/dist/pipeline.js.map +1 -1
  50. package/dist/rank/decision.d.ts +59 -0
  51. package/dist/rank/decision.js +124 -0
  52. package/dist/rank/decision.js.map +1 -0
  53. package/dist/rank/diversity.d.ts +0 -0
  54. package/dist/rank/diversity.js +0 -0
  55. package/dist/rank/diversity.js.map +0 -0
  56. package/dist/rank/embeddings.d.ts +41 -0
  57. package/dist/rank/embeddings.js +98 -0
  58. package/dist/rank/embeddings.js.map +1 -0
  59. package/dist/rank/reranker.d.ts +21 -0
  60. package/dist/rank/reranker.js +30 -0
  61. package/dist/rank/reranker.js.map +1 -0
  62. package/dist/rank/semantic.d.ts +14 -0
  63. package/dist/rank/semantic.js +58 -0
  64. package/dist/rank/semantic.js.map +1 -0
  65. package/dist/recheck.d.ts +0 -0
  66. package/dist/recheck.js +0 -0
  67. package/dist/recheck.js.map +0 -0
  68. package/dist/retrieval/arxiv.d.ts +24 -0
  69. package/dist/retrieval/arxiv.js +94 -0
  70. package/dist/retrieval/arxiv.js.map +1 -0
  71. package/dist/retrieval/books.d.ts +0 -0
  72. package/dist/retrieval/books.js +0 -0
  73. package/dist/retrieval/books.js.map +0 -0
  74. package/dist/retrieval/breaker.d.ts +16 -0
  75. package/dist/retrieval/breaker.js +42 -0
  76. package/dist/retrieval/breaker.js.map +1 -0
  77. package/dist/retrieval/cache.d.ts +8 -0
  78. package/dist/retrieval/cache.js +33 -0
  79. package/dist/retrieval/cache.js.map +1 -0
  80. package/dist/retrieval/candidates.d.ts +1 -1
  81. package/dist/retrieval/candidates.js +31 -7
  82. package/dist/retrieval/candidates.js.map +1 -1
  83. package/dist/retrieval/counterpoint.d.ts +0 -0
  84. package/dist/retrieval/counterpoint.js +1 -0
  85. package/dist/retrieval/counterpoint.js.map +1 -1
  86. package/dist/retrieval/europePmc.d.ts +32 -0
  87. package/dist/retrieval/europePmc.js +62 -0
  88. package/dist/retrieval/europePmc.js.map +1 -0
  89. package/dist/retrieval/openalexTopical.d.ts +0 -0
  90. package/dist/retrieval/openalexTopical.js +0 -0
  91. package/dist/retrieval/openalexTopical.js.map +0 -0
  92. package/dist/retrieval/paperMerge.d.ts +16 -0
  93. package/dist/retrieval/paperMerge.js +77 -0
  94. package/dist/retrieval/paperMerge.js.map +1 -0
  95. package/dist/retrieval/papers.d.ts +10 -5
  96. package/dist/retrieval/papers.js +51 -32
  97. package/dist/retrieval/papers.js.map +1 -1
  98. package/dist/retrieval/podcasts.d.ts +0 -0
  99. package/dist/retrieval/podcasts.js +0 -0
  100. package/dist/retrieval/podcasts.js.map +0 -0
  101. package/dist/retrieval/query.d.ts +0 -0
  102. package/dist/retrieval/query.js +1 -0
  103. package/dist/retrieval/query.js.map +1 -1
  104. package/dist/retrieval/rateLimit.d.ts +6 -0
  105. package/dist/retrieval/rateLimit.js +15 -0
  106. package/dist/retrieval/rateLimit.js.map +1 -0
  107. package/dist/retrieval/search/brave.d.ts +13 -0
  108. package/dist/retrieval/search/brave.js +32 -0
  109. package/dist/retrieval/search/brave.js.map +1 -0
  110. package/dist/retrieval/search/index.d.ts +13 -0
  111. package/dist/retrieval/search/index.js +22 -0
  112. package/dist/retrieval/search/index.js.map +1 -0
  113. package/dist/retrieval/search/searxng.d.ts +14 -0
  114. package/dist/retrieval/search/searxng.js +24 -0
  115. package/dist/retrieval/search/searxng.js.map +1 -0
  116. package/dist/retrieval/search/serper.d.ts +14 -0
  117. package/dist/retrieval/search/serper.js +38 -0
  118. package/dist/retrieval/search/serper.js.map +1 -0
  119. package/dist/retrieval/search/types.d.ts +17 -0
  120. package/dist/retrieval/search/types.js +2 -0
  121. package/dist/retrieval/search/types.js.map +1 -0
  122. package/dist/retrieval/videos.d.ts +0 -0
  123. package/dist/retrieval/videos.js +0 -0
  124. package/dist/retrieval/videos.js.map +0 -0
  125. package/dist/retrieval/web.d.ts +5 -6
  126. package/dist/retrieval/web.js +14 -27
  127. package/dist/retrieval/web.js.map +1 -1
  128. package/dist/types.d.ts +62 -0
  129. package/dist/types.js +0 -0
  130. package/dist/types.js.map +0 -0
  131. package/dist/verify/verify.d.ts +11 -2
  132. package/dist/verify/verify.js +13 -4
  133. package/dist/verify/verify.js.map +1 -1
  134. package/package.json +1 -1
package/dist/brief.js ADDED
@@ -0,0 +1,70 @@
1
+ const PRIOR = {
2
+ none: 'Students have not encountered this topic yet.',
3
+ reading: 'Students have already done a reading on this topic.',
4
+ lecture: 'Students have already had a lecture on this topic.',
5
+ notes: 'Students have their own notes on this topic.',
6
+ };
7
+ const TIMING = {
8
+ 'pre-class': 'This list is preparation before class.',
9
+ 'in-class': 'This list will be used during class.',
10
+ 'post-class': 'This list follows a class, for consolidation.',
11
+ assessment: 'This list is for assessment preparation.',
12
+ };
13
+ const STANCE = {
14
+ support: 'It should reinforce the current framing.',
15
+ challenge: 'It should challenge the current framing and surface disagreement.',
16
+ both: 'It should include both supporting material and counterpoints.',
17
+ };
18
+ /**
19
+ * Turn the interview answers into the fields the pipeline already understands:
20
+ * a counterpoint flag, search constraints and a teaching-context string.
21
+ */
22
+ export function compileBrief(answers, currentYear = new Date().getFullYear()) {
23
+ const constraints = {};
24
+ if (answers.openAccessOnly)
25
+ constraints.openAccessOnly = true;
26
+ if (answers.noVideo)
27
+ constraints.excludeFormats = ['video'];
28
+ if (answers.recentOnly)
29
+ constraints.minYear = currentYear - 5;
30
+ const note = answers.priorNote?.trim();
31
+ const context = [
32
+ PRIOR[answers.priorKnowledge],
33
+ note || null,
34
+ TIMING[answers.timing],
35
+ STANCE[answers.stance],
36
+ ]
37
+ .filter(Boolean)
38
+ .join(' ');
39
+ return {
40
+ counterpoint: answers.stance !== 'support',
41
+ constraints,
42
+ context,
43
+ };
44
+ }
45
+ /**
46
+ * Apply brief constraints to candidates before ranking. `openAccessOnly` is
47
+ * best-effort: only papers explicitly flagged as subscription are dropped;
48
+ * unknown access is kept (and labelled later).
49
+ */
50
+ export function applyConstraints(candidates, constraints) {
51
+ if (!constraints)
52
+ return candidates;
53
+ const excluded = new Set(constraints.excludeFormats ?? []);
54
+ return candidates.filter((candidate) => {
55
+ if (excluded.has(candidate.format))
56
+ return false;
57
+ if (constraints.minYear !== undefined &&
58
+ candidate.year !== null &&
59
+ candidate.year < constraints.minYear) {
60
+ return false;
61
+ }
62
+ if (constraints.openAccessOnly &&
63
+ candidate.format === 'paper' &&
64
+ candidate.licensing === 'library-subscription') {
65
+ return false;
66
+ }
67
+ return true;
68
+ });
69
+ }
70
+ //# sourceMappingURL=brief.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brief.js","sourceRoot":"","sources":["../src/brief.ts"],"names":[],"mappings":"AAsBA,MAAM,KAAK,GAAmD;IAC5D,IAAI,EAAE,+CAA+C;IACrD,OAAO,EAAE,qDAAqD;IAC9D,OAAO,EAAE,oDAAoD;IAC7D,KAAK,EAAE,8CAA8C;CACtD,CAAC;AAEF,MAAM,MAAM,GAA2C;IACrD,WAAW,EAAE,wCAAwC;IACrD,UAAU,EAAE,sCAAsC;IAClD,YAAY,EAAE,+CAA+C;IAC7D,UAAU,EAAE,0CAA0C;CACvD,CAAC;AAEF,MAAM,MAAM,GAA2C;IACrD,OAAO,EAAE,0CAA0C;IACnD,SAAS,EAAE,mEAAmE;IAC9E,IAAI,EAAE,+DAA+D;CACtE,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAqB,EACrB,cAAsB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;IAE9C,MAAM,WAAW,GAAsB,EAAE,CAAC;IAC1C,IAAI,OAAO,CAAC,cAAc;QAAE,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC;IAC9D,IAAI,OAAO,CAAC,OAAO;QAAE,WAAW,CAAC,cAAc,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5D,IAAI,OAAO,CAAC,UAAU;QAAE,WAAW,CAAC,OAAO,GAAG,WAAW,GAAG,CAAC,CAAC;IAE9D,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG;QACd,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC;QAC7B,IAAI,IAAI,IAAI;QACZ,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACtB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;KACvB;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,OAAO;QACL,YAAY,EAAE,OAAO,CAAC,MAAM,KAAK,SAAS;QAC1C,WAAW;QACX,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,UAAuB,EACvB,WAA+B;IAE/B,IAAI,CAAC,WAAW;QAAE,OAAO,UAAU,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;IAC3D,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE;QACrC,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QACjD,IACE,WAAW,CAAC,OAAO,KAAK,SAAS;YACjC,SAAS,CAAC,IAAI,KAAK,IAAI;YACvB,SAAS,CAAC,IAAI,GAAG,WAAW,CAAC,OAAO,EACpC,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IACE,WAAW,CAAC,cAAc;YAC1B,SAAS,CAAC,MAAM,KAAK,OAAO;YAC5B,SAAS,CAAC,SAAS,KAAK,sBAAsB,EAC9C,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { Outcome, Resource, SuggestResult } from './types.js';
2
+ /**
3
+ * Portable collection format (ADR-0014). A collection is a saved result list
4
+ * that can be reopened, rechecked and shared as a file — no server, accounts
5
+ * or permissions involved. The same document is what a future team backend
6
+ * would store, so the format is versioned from day one.
7
+ */
8
+ export declare const COLLECTION_KIND = "honeyguide-collection";
9
+ export declare const COLLECTION_SCHEMA_VERSION = 1;
10
+ export interface CollectionFile {
11
+ kind: typeof COLLECTION_KIND;
12
+ schemaVersion: number;
13
+ topic: string;
14
+ /** ISO timestamp of when the list was generated. */
15
+ createdAt: string;
16
+ /** Unit outcomes the list was aligned to, when supplied (ADR-0017). */
17
+ outcomes?: Outcome[];
18
+ result: SuggestResult;
19
+ }
20
+ export declare function toCollectionFile(topic: string, result: SuggestResult, outcomes?: Outcome[], now?: Date): CollectionFile;
21
+ /** Parse and validate a collection file; throws with a user-facing message. */
22
+ export declare function parseCollectionFile(input: string | unknown): CollectionFile;
23
+ /**
24
+ * Read resources from any saved Honeyguide JSON: a collection file, a legacy
25
+ * `suggest --json` result, or a batch output. Used by recheck.
26
+ */
27
+ export declare function resourcesFromSaved(input: unknown): Resource[];
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Portable collection format (ADR-0014). A collection is a saved result list
3
+ * that can be reopened, rechecked and shared as a file — no server, accounts
4
+ * or permissions involved. The same document is what a future team backend
5
+ * would store, so the format is versioned from day one.
6
+ */
7
+ export const COLLECTION_KIND = 'honeyguide-collection';
8
+ export const COLLECTION_SCHEMA_VERSION = 1;
9
+ export function toCollectionFile(topic, result, outcomes = [], now = new Date()) {
10
+ return {
11
+ kind: COLLECTION_KIND,
12
+ schemaVersion: COLLECTION_SCHEMA_VERSION,
13
+ topic: topic.trim(),
14
+ createdAt: now.toISOString(),
15
+ ...(outcomes.length ? { outcomes } : {}),
16
+ result: portable(result),
17
+ };
18
+ }
19
+ /**
20
+ * Collections are files people email to each other. Desktop screenshots are
21
+ * embedded data URLs and can be many megabytes, so they are dropped; ordinary
22
+ * http(s) thumbnail URLs are kept.
23
+ */
24
+ function portable(result) {
25
+ return {
26
+ ...result,
27
+ resources: result.resources.map((resource) => ({
28
+ ...resource,
29
+ thumbnailUrl: resource.thumbnailUrl && !resource.thumbnailUrl.startsWith('data:')
30
+ ? resource.thumbnailUrl
31
+ : null,
32
+ })),
33
+ };
34
+ }
35
+ /** Parse and validate a collection file; throws with a user-facing message. */
36
+ export function parseCollectionFile(input) {
37
+ let data = input;
38
+ if (typeof input === 'string') {
39
+ try {
40
+ data = JSON.parse(input);
41
+ }
42
+ catch {
43
+ throw new Error('Not valid JSON — expected a Honeyguide collection file.');
44
+ }
45
+ }
46
+ if (!data || typeof data !== 'object') {
47
+ throw new Error('Not a Honeyguide collection file.');
48
+ }
49
+ const obj = data;
50
+ if (obj.kind !== COLLECTION_KIND) {
51
+ throw new Error('Not a Honeyguide collection file.');
52
+ }
53
+ if (typeof obj.schemaVersion !== 'number') {
54
+ throw new Error('Collection file is missing its schema version.');
55
+ }
56
+ if (obj.schemaVersion > COLLECTION_SCHEMA_VERSION) {
57
+ throw new Error(`Collection schema v${obj.schemaVersion} is newer than this app supports (v${COLLECTION_SCHEMA_VERSION}). Update Honeyguide.`);
58
+ }
59
+ if (!obj.result || !Array.isArray(obj.result.resources)) {
60
+ throw new Error('Collection file is missing its resources.');
61
+ }
62
+ const outcomes = Array.isArray(obj.outcomes)
63
+ ? obj.outcomes
64
+ .filter((outcome) => Boolean(outcome) &&
65
+ typeof outcome.id === 'string' &&
66
+ typeof outcome.text === 'string')
67
+ .map((outcome) => ({ id: outcome.id, text: outcome.text }))
68
+ : [];
69
+ return {
70
+ kind: COLLECTION_KIND,
71
+ schemaVersion: obj.schemaVersion,
72
+ topic: typeof obj.topic === 'string' ? obj.topic : '',
73
+ createdAt: typeof obj.createdAt === 'string' ? obj.createdAt : nowIso(),
74
+ ...(outcomes.length ? { outcomes } : {}),
75
+ result: obj.result,
76
+ };
77
+ }
78
+ /**
79
+ * Read resources from any saved Honeyguide JSON: a collection file, a legacy
80
+ * `suggest --json` result, or a batch output. Used by recheck.
81
+ */
82
+ export function resourcesFromSaved(input) {
83
+ const obj = input;
84
+ if (!obj || typeof obj !== 'object')
85
+ return [];
86
+ if (obj.kind === COLLECTION_KIND)
87
+ return parseCollectionFile(obj).result.resources;
88
+ if (Array.isArray(obj.resources))
89
+ return obj.resources;
90
+ if (Array.isArray(obj.entries)) {
91
+ return obj.entries.flatMap((entry) => entry?.result?.resources ?? []);
92
+ }
93
+ return [];
94
+ }
95
+ function nowIso() {
96
+ return new Date().toISOString();
97
+ }
98
+ //# sourceMappingURL=collection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection.js","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -12,8 +12,38 @@ export interface PipelineConfig {
12
12
  ollamaModel?: string;
13
13
  /** YouTube Data API v3 key; without it video retrieval is unavailable. */
14
14
  youtubeApiKey?: string;
15
- /** SearXNG instance URL for general-web retrieval; optional. */
15
+ /**
16
+ * Web search providers (ADR-0013). SearXNG is preferred when an instance
17
+ * URL is set; otherwise a keyed provider is used. With none configured the
18
+ * web component reports unavailable (ADR-0006).
19
+ */
16
20
  searxngUrl?: string;
21
+ braveApiKey?: string;
22
+ serperApiKey?: string;
23
+ /** Semantic Scholar API key; lifts keyless throttling on paper search. */
24
+ semanticScholarApiKey?: string;
25
+ /**
26
+ * Optional semantic re-ranking (ADR-0015). Explicit opt-in: set an
27
+ * embeddings endpoint (usually Ollama) to reorder candidates by relevance
28
+ * before diversity balancing. With none set, ranking is unchanged.
29
+ */
30
+ embeddingUrl?: string;
31
+ embeddingModel?: string;
32
+ embeddingApiKey?: string;
33
+ /**
34
+ * Optional local System One decision model (Ollama >= 0.35,
35
+ * `/v1/systemone`). When set it is preferred over embeddings because it
36
+ * judges relevance directly (ADR-0016).
37
+ */
38
+ decisionUrl?: string;
39
+ decisionModel?: string;
40
+ decisionApiKey?: string;
41
+ /**
42
+ * Ask the local LLM for a one-line "why this outcome" reason per alignment.
43
+ * On by default when `ollamaUrl` is configured; set
44
+ * HONEYGUIDE_ALIGNMENT_REASONS=0 to disable.
45
+ */
46
+ alignmentReasons?: boolean;
17
47
  /** Contact email passed to polite-pool APIs (Crossref/OpenAlex). */
18
48
  mailto?: string;
19
49
  /**
package/dist/config.js CHANGED
@@ -5,6 +5,16 @@ export function configFromEnv(env = process.env) {
5
5
  ollamaModel: env.OLLAMA_MODEL || undefined,
6
6
  youtubeApiKey: env.YOUTUBE_API_KEY || undefined,
7
7
  searxngUrl: env.SEARXNG_URL || undefined,
8
+ braveApiKey: env.BRAVE_API_KEY || undefined,
9
+ serperApiKey: env.SERPER_API_KEY || undefined,
10
+ semanticScholarApiKey: env.SEMANTIC_SCHOLAR_API_KEY || undefined,
11
+ embeddingUrl: env.EMBEDDING_URL || undefined,
12
+ embeddingModel: env.EMBEDDING_MODEL || 'nomic-embed-text',
13
+ embeddingApiKey: env.EMBEDDING_API_KEY || undefined,
14
+ decisionUrl: env.DECISION_URL || undefined,
15
+ decisionModel: env.DECISION_MODEL || 'tev1:0.8b',
16
+ decisionApiKey: env.DECISION_API_KEY || undefined,
17
+ alignmentReasons: env.HONEYGUIDE_ALIGNMENT_REASONS !== '0',
8
18
  mailto: env.HONEYGUIDE_MAILTO || undefined,
9
19
  };
10
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AA4BA,MAAM,UAAU,aAAa,CAAC,MAAyB,OAAO,CAAC,GAAG;IAChE,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAAU,IAAI,SAAS;QACtC,YAAY,EAAE,GAAG,CAAC,cAAc,IAAI,SAAS;QAC7C,WAAW,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS;QAC1C,aAAa,EAAE,GAAG,CAAC,eAAe,IAAI,SAAS;QAC/C,UAAU,EAAE,GAAG,CAAC,WAAW,IAAI,SAAS;QACxC,MAAM,EAAE,GAAG,CAAC,iBAAiB,IAAI,SAAS;KAC3C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AA0DA,MAAM,UAAU,aAAa,CAAC,MAAyB,OAAO,CAAC,GAAG;IAChE,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAAU,IAAI,SAAS;QACtC,YAAY,EAAE,GAAG,CAAC,cAAc,IAAI,SAAS;QAC7C,WAAW,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS;QAC1C,aAAa,EAAE,GAAG,CAAC,eAAe,IAAI,SAAS;QAC/C,UAAU,EAAE,GAAG,CAAC,WAAW,IAAI,SAAS;QACxC,WAAW,EAAE,GAAG,CAAC,aAAa,IAAI,SAAS;QAC3C,YAAY,EAAE,GAAG,CAAC,cAAc,IAAI,SAAS;QAC7C,qBAAqB,EAAE,GAAG,CAAC,wBAAwB,IAAI,SAAS;QAChE,YAAY,EAAE,GAAG,CAAC,aAAa,IAAI,SAAS;QAC5C,cAAc,EAAE,GAAG,CAAC,eAAe,IAAI,kBAAkB;QACzD,eAAe,EAAE,GAAG,CAAC,iBAAiB,IAAI,SAAS;QACnD,WAAW,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS;QAC1C,aAAa,EAAE,GAAG,CAAC,cAAc,IAAI,WAAW;QAChD,cAAc,EAAE,GAAG,CAAC,gBAAgB,IAAI,SAAS;QACjD,gBAAgB,EAAE,GAAG,CAAC,4BAA4B,KAAK,GAAG;QAC1D,MAAM,EAAE,GAAG,CAAC,iBAAiB,IAAI,SAAS;KAC3C,CAAC;AACJ,CAAC"}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,28 @@
1
+ import type { AccessStatus } from '../types.js';
2
+ export interface UnpaywallInfo {
3
+ access: AccessStatus;
4
+ /** Best free-to-read location, when Unpaywall reports one. */
5
+ oaUrl?: string;
6
+ license?: string;
7
+ }
8
+ interface UnpaywallResponse {
9
+ is_oa?: boolean;
10
+ best_oa_location?: {
11
+ url?: string;
12
+ license?: string;
13
+ } | null;
14
+ }
15
+ /**
16
+ * Map Unpaywall's response to Honeyguide's access status. Anything other
17
+ * than an explicit `is_oa: true` is treated as subscription, because
18
+ * Unpaywall only reports papers it knows about — an unknown DOI never gets
19
+ * here (the HTTP call fails first).
20
+ */
21
+ export declare function mapUnpaywallResponse(data: UnpaywallResponse): UnpaywallInfo;
22
+ /**
23
+ * Query Unpaywall for a DOI (spec §3 institutional plumbing). Free and
24
+ * keyless, but it requires a contact email; without `HONEYGUIDE_MAILTO` the
25
+ * caller should skip this. Failure is non-fatal (ADR-0006).
26
+ */
27
+ export declare function lookupUnpaywall(doi: string, email: string): Promise<UnpaywallInfo | null>;
28
+ export {};
@@ -0,0 +1,36 @@
1
+ const ENDPOINT = 'https://api.unpaywall.org/v2';
2
+ const TIMEOUT_MS = 4000;
3
+ /**
4
+ * Map Unpaywall's response to Honeyguide's access status. Anything other
5
+ * than an explicit `is_oa: true` is treated as subscription, because
6
+ * Unpaywall only reports papers it knows about — an unknown DOI never gets
7
+ * here (the HTTP call fails first).
8
+ */
9
+ export function mapUnpaywallResponse(data) {
10
+ const oaUrl = data.best_oa_location?.url;
11
+ const license = data.best_oa_location?.license;
12
+ return {
13
+ access: data.is_oa ? 'open' : 'subscription',
14
+ oaUrl: typeof oaUrl === 'string' ? oaUrl : undefined,
15
+ license: typeof license === 'string' ? license : undefined,
16
+ };
17
+ }
18
+ /**
19
+ * Query Unpaywall for a DOI (spec §3 institutional plumbing). Free and
20
+ * keyless, but it requires a contact email; without `HONEYGUIDE_MAILTO` the
21
+ * caller should skip this. Failure is non-fatal (ADR-0006).
22
+ */
23
+ export async function lookupUnpaywall(doi, email) {
24
+ if (!doi || !email)
25
+ return null;
26
+ const path = doi.split('/').map(encodeURIComponent).join('/');
27
+ const url = `${ENDPOINT}/${path}?email=${encodeURIComponent(email)}`;
28
+ const res = await fetch(url, {
29
+ headers: { accept: 'application/json', 'user-agent': 'Honeyguide/1.0' },
30
+ signal: AbortSignal.timeout(TIMEOUT_MS),
31
+ });
32
+ if (!res.ok)
33
+ return null;
34
+ return mapUnpaywallResponse((await res.json()));
35
+ }
36
+ //# sourceMappingURL=unpaywall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unpaywall.js","sourceRoot":"","sources":["../../src/enrich/unpaywall.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAG,8BAA8B,CAAC;AAChD,MAAM,UAAU,GAAG,IAAI,CAAC;AAiBxB;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAuB;IAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC;IAC/C,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc;QAC5C,KAAK,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;QACpD,OAAO,EAAE,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;KAC3D,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAW,EACX,KAAa;IAEb,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9D,MAAM,GAAG,GAAG,GAAG,QAAQ,IAAI,IAAI,UAAU,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;IACrE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,gBAAgB,EAAE;QACvE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC;KACxC,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,oBAAoB,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAsB,CAAC,CAAC;AACvE,CAAC"}
File without changes
File without changes
File without changes
File without changes
@@ -1,3 +1,4 @@
1
+ import { verificationText } from '../verify/verify.js';
1
2
  /**
2
3
  * LMS-ready HTML (spec §10): a single self-contained fragment with inline
3
4
  * styles only, because LMS rich-text editors (Canvas, Moodle, Blackboard)
@@ -8,15 +9,23 @@ export function toLmsHtml(topic, result) {
8
9
  return [
9
10
  `<div style="font-family:sans-serif;max-width:46em">`,
10
11
  `<h2 style="margin-bottom:4px">Supporting resources: ${escape(topic)}</h2>`,
11
- `<p style="color:#555;font-size:0.9em">Every resource below was retrieved and verified — none are AI-generated citations.</p>`,
12
+ `<p style="color:#555;font-size:0.9em">Every resource below was retrieved from a real source and checked — none are AI-generated citations.</p>`,
12
13
  items,
13
14
  `</div>`,
14
15
  ].join('\n');
15
16
  }
16
17
  function resourceHtml(r) {
17
- const meta = [r.format, r.sourceType];
18
+ const meta = [
19
+ r.format,
20
+ r.sourceType,
21
+ verificationText(r.verification, r.verificationBasis),
22
+ ];
18
23
  if (r.year)
19
24
  meta.push(String(r.year));
25
+ if (r.access !== 'unknown')
26
+ meta.push(`access: ${r.access}`);
27
+ if (r.alignment?.confirmed)
28
+ meta.push(`outcome: ${r.alignment.outcomeText}`);
20
29
  if (r.licensing !== 'unknown')
21
30
  meta.push(r.licensing.replace(/-/g, ' '));
22
31
  if (r.accessibilityNotes.length)
@@ -29,6 +38,10 @@ function resourceHtml(r) {
29
38
  (r.annotation.source === 'llm' ? 'Rationale (generated): ' : 'Description (extracted): ') +
30
39
  `</em>${escape(r.annotation.text)}</p>`
31
40
  : '';
41
+ const alignmentReason = r.alignment?.confirmed && r.alignment.reason
42
+ ? `<p style="margin:2px 0 0;font-size:0.9em;color:#666">` +
43
+ `<em>Outcome rationale (generated): </em>${escape(r.alignment.reason)}</p>`
44
+ : '';
32
45
  return (`<div style="border-top:1px solid #ddd;padding:10px 0">` +
33
46
  `<a href="${escape(r.url)}" style="font-weight:bold">${escape(r.title)}</a>` +
34
47
  (r.authors.length
@@ -36,6 +49,7 @@ function resourceHtml(r) {
36
49
  : '') +
37
50
  `<div style="color:#777;font-size:0.85em">${escape(meta.join(' · '))}</div>` +
38
51
  annotation +
52
+ alignmentReason +
39
53
  `</div>`);
40
54
  }
41
55
  function escape(s) {
@@ -1 +1 @@
1
- {"version":3,"file":"lmsHtml.js","sourceRoot":"","sources":["../../src/export/lmsHtml.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,MAAqB;IAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5D,OAAO;QACL,qDAAqD;QACrD,uDAAuD,MAAM,CAAC,KAAK,CAAC,OAAO;QAC3E,8HAA8H;QAC9H,KAAK;QACL,QAAQ;KACT,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,CAAW;IAC/B,MAAM,IAAI,GAAa,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IAChD,IAAI,CAAC,CAAC,IAAI;QAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACzE,IAAI,CAAC,CAAC,kBAAkB,CAAC,MAAM;QAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5E,IAAI,CAAC,CAAC,sBAAsB;QAAE,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAErE,MAAM,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI;QAClC,CAAC,CAAC,6CAA6C;YAC7C,0CAA0C;YAC1C,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,2BAA2B,CAAC;YACzF,QAAQ,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM;QACzC,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,CACL,wDAAwD;QACxD,YAAY,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,8BAA8B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;QAC5E,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM;YACf,CAAC,CAAC,+BAA+B,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS;YAClF,CAAC,CAAC,EAAE,CAAC;QACP,4CAA4C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ;QAC5E,UAAU;QACV,QAAQ,CACT,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"lmsHtml.js","sourceRoot":"","sources":["../../src/export/lmsHtml.ts"],"names":[],"mappings":"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"}
File without changes
@@ -1,10 +1,11 @@
1
+ import { verificationText } from '../verify/verify.js';
1
2
  /** Markdown export (spec §10, the v1 export target). */
2
3
  export function toMarkdown(topic, result) {
3
4
  const lines = [
4
5
  `# Supporting resources: ${topic}`,
5
6
  '',
6
- `> Generated by Honeyguide. Every resource below was retrieved and`,
7
- `> verified — none are LLM-generated citations.`,
7
+ `> Generated by Honeyguide. Every resource below was retrieved from a`,
8
+ `> real source and checked — none are LLM-generated citations.`,
8
9
  '',
9
10
  ];
10
11
  const supporting = result.resources.filter((r) => r.stance !== 'counterpoint');
@@ -35,7 +36,11 @@ function resourceBlock(r) {
35
36
  if (r.venue)
36
37
  meta.push(r.venue);
37
38
  meta.push(`source: ${r.sourceType}`);
38
- meta.push(`verification: ${r.verification}`);
39
+ meta.push(`verification: ${verificationText(r.verification, r.verificationBasis)}`);
40
+ if (r.access !== 'unknown')
41
+ meta.push(`access: ${r.access}`);
42
+ if (r.alignment?.confirmed)
43
+ meta.push(`outcome: ${r.alignment.outcomeText}`);
39
44
  if (r.licensing !== 'unknown')
40
45
  meta.push(`licensing: ${r.licensing}`);
41
46
  if (r.accessibilityNotes.length)
@@ -47,6 +52,9 @@ function resourceBlock(r) {
47
52
  const provenance = r.annotation.source === 'llm' ? 'Rationale (generated)' : 'Description (extracted)';
48
53
  lines.push('', `${provenance}: ${r.annotation.text}`);
49
54
  }
55
+ if (r.alignment?.confirmed && r.alignment.reason) {
56
+ lines.push('', `Outcome rationale (generated): ${r.alignment.reason}`);
57
+ }
50
58
  return lines;
51
59
  }
52
60
  function label(format) {
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/export/markdown.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/export/markdown.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -11,15 +11,32 @@ export { suggestResources } from './pipeline.js';
11
11
  export { suggestBatch, toBatchMarkdown, type BatchEntry } from './batch.js';
12
12
  export { recheckResources, toRecheckMarkdown, type RecheckEntry } from './recheck.js';
13
13
  export { deriveCounterQueries, heuristicCounterQueries } from './retrieval/counterpoint.js';
14
+ export { COLLECTION_KIND, COLLECTION_SCHEMA_VERSION, toCollectionFile, parseCollectionFile, resourcesFromSaved, type CollectionFile, } from './collection.js';
14
15
  export { configFromEnv, type PipelineConfig } from './config.js';
16
+ export { compileBrief, applyConstraints, type BriefAnswers, type CompiledBrief, } from './brief.js';
17
+ export { buildRationalePrompt } from './annotate/ollama.js';
15
18
  export { toMarkdown } from './export/markdown.js';
16
19
  export { toCitations, formatApa, formatHarvard } from './export/citations.js';
17
20
  export { toLmsHtml } from './export/lmsHtml.js';
18
21
  export { mapOpenAlexLicensing } from './retrieval/openalexTopical.js';
22
+ export { createSearchProvider } from './retrieval/search/index.js';
23
+ export type { SearchProvider, WebSearchResult, WebSearchProviderName, } from './retrieval/search/index.js';
24
+ export { mergePaperCandidates, normalizeDoi, normalizeTitle } from './retrieval/paperMerge.js';
25
+ export { parseArxivFeed, arxivEntriesToCandidates, buildArxivQuery } from './retrieval/arxiv.js';
26
+ export { getCachedJson, setCachedJson, clearJsonCache } from './retrieval/cache.js';
27
+ export { CircuitBreaker, defaultBreaker } from './retrieval/breaker.js';
28
+ export { parseEuropePmcResults } from './retrieval/europePmc.js';
19
29
  export { diversify } from './rank/diversity.js';
30
+ export { createEmbeddingProvider, OllamaEmbeddingProvider, CachedEmbeddingProvider, type EmbeddingProvider, } from './rank/embeddings.js';
31
+ export { cosineSimilarity, candidateText, semanticScores, orderByScores, } from './rank/semantic.js';
32
+ export { createReranker, EmbeddingReranker, type Reranker, } from './rank/reranker.js';
33
+ export { parseOutcomes, createOutcomeAligner, buildAlignmentRequest, parseAlignmentResponse, OllamaOutcomeAligner, EmbeddingOutcomeAligner, MAX_ALIGN_RESOURCES, MAX_ALIGN_OUTCOMES, type OutcomeAligner, } from './align/outcomes.js';
34
+ export { buildAlignmentReasonPrompt, generateAlignmentReason, addAlignmentReasons, } from './align/reasons.js';
35
+ export { buildSystemOneRequest, parseSystemOneScores, balancedSubset, OllamaDecisionReranker, MAX_DECISION_CANDIDATES, } from './rank/decision.js';
20
36
  export { classifySource } from './enrich/sourceType.js';
21
37
  export { parsePageMeta, fetchPageMeta, type PageMeta } from './enrich/page.js';
22
- export { mapUrlStatus } from './verify/verify.js';
38
+ export { mapUrlStatus, verifyCandidate, verificationText, type VerificationOutcome, } from './verify/verify.js';
39
+ export { mapUnpaywallResponse, lookupUnpaywall } from './enrich/unpaywall.js';
23
40
  export { deriveQuery, heuristicKeywords, extractPhrases } from './retrieval/query.js';
24
41
  export { reconstructAbstract } from './retrieval/openalexTopical.js';
25
42
  export type { Candidate } from './retrieval/candidates.js';
package/dist/index.js CHANGED
@@ -10,15 +10,31 @@ export { suggestResources } from './pipeline.js';
10
10
  export { suggestBatch, toBatchMarkdown } from './batch.js';
11
11
  export { recheckResources, toRecheckMarkdown } from './recheck.js';
12
12
  export { deriveCounterQueries, heuristicCounterQueries } from './retrieval/counterpoint.js';
13
+ export { COLLECTION_KIND, COLLECTION_SCHEMA_VERSION, toCollectionFile, parseCollectionFile, resourcesFromSaved, } from './collection.js';
13
14
  export { configFromEnv } from './config.js';
15
+ export { compileBrief, applyConstraints, } from './brief.js';
16
+ export { buildRationalePrompt } from './annotate/ollama.js';
14
17
  export { toMarkdown } from './export/markdown.js';
15
18
  export { toCitations, formatApa, formatHarvard } from './export/citations.js';
16
19
  export { toLmsHtml } from './export/lmsHtml.js';
17
20
  export { mapOpenAlexLicensing } from './retrieval/openalexTopical.js';
21
+ export { createSearchProvider } from './retrieval/search/index.js';
22
+ export { mergePaperCandidates, normalizeDoi, normalizeTitle } from './retrieval/paperMerge.js';
23
+ export { parseArxivFeed, arxivEntriesToCandidates, buildArxivQuery } from './retrieval/arxiv.js';
24
+ export { getCachedJson, setCachedJson, clearJsonCache } from './retrieval/cache.js';
25
+ export { CircuitBreaker, defaultBreaker } from './retrieval/breaker.js';
26
+ export { parseEuropePmcResults } from './retrieval/europePmc.js';
18
27
  export { diversify } from './rank/diversity.js';
28
+ export { createEmbeddingProvider, OllamaEmbeddingProvider, CachedEmbeddingProvider, } from './rank/embeddings.js';
29
+ export { cosineSimilarity, candidateText, semanticScores, orderByScores, } from './rank/semantic.js';
30
+ export { createReranker, EmbeddingReranker, } from './rank/reranker.js';
31
+ export { parseOutcomes, createOutcomeAligner, buildAlignmentRequest, parseAlignmentResponse, OllamaOutcomeAligner, EmbeddingOutcomeAligner, MAX_ALIGN_RESOURCES, MAX_ALIGN_OUTCOMES, } from './align/outcomes.js';
32
+ export { buildAlignmentReasonPrompt, generateAlignmentReason, addAlignmentReasons, } from './align/reasons.js';
33
+ export { buildSystemOneRequest, parseSystemOneScores, balancedSubset, OllamaDecisionReranker, MAX_DECISION_CANDIDATES, } from './rank/decision.js';
19
34
  export { classifySource } from './enrich/sourceType.js';
20
35
  export { parsePageMeta, fetchPageMeta } from './enrich/page.js';
21
- export { mapUrlStatus } from './verify/verify.js';
36
+ export { mapUrlStatus, verifyCandidate, verificationText, } from './verify/verify.js';
37
+ export { mapUnpaywallResponse, lookupUnpaywall } from './enrich/unpaywall.js';
22
38
  export { deriveQuery, heuristicKeywords, extractPhrases } from './retrieval/query.js';
23
39
  export { reconstructAbstract } from './retrieval/openalexTopical.js';
24
40
  // Document input (PDF, DOCX, TXT, MD) comes straight from cite-sight-core.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAmB,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAqB,MAAM,cAAc,CAAC;AACtF,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAC5F,OAAO,EAAE,aAAa,EAAuB,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAiB,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAGrE,2EAA2E;AAC3E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAmB,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAqB,MAAM,cAAc,CAAC;AACtF,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAC5F,OAAO,EACL,eAAe,EACf,yBAAyB,EACzB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,GAEnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAuB,MAAM,aAAa,CAAC;AACjE,OAAO,EACL,YAAY,EACZ,gBAAgB,GAGjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAMnE,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC/F,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,GAExB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,aAAa,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,cAAc,EACd,iBAAiB,GAElB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,GAEnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAiB,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EACL,YAAY,EACZ,eAAe,EACf,gBAAgB,GAEjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAGrE,2EAA2E;AAC3E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { SuggestRequest, SuggestResult } from './types.js';
1
+ import type { ProgressListener, SuggestRequest, SuggestResult } from './types.js';
2
2
  import type { PipelineConfig } from './config.js';
3
3
  /**
4
4
  * List mode (spec §4): input goes in, a verified and annotated resource
@@ -7,4 +7,4 @@ import type { PipelineConfig } from './config.js';
7
7
  * (ADR-0011). Counterpoint mode adds a second retrieval pass that
8
8
  * deliberately hunts disagreeing material (spec §3 point 3).
9
9
  */
10
- export declare function suggestResources(request: SuggestRequest, config?: PipelineConfig): Promise<SuggestResult>;
10
+ export declare function suggestResources(request: SuggestRequest, config?: PipelineConfig, onProgress?: ProgressListener): Promise<SuggestResult>;