@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/types.d.ts CHANGED
@@ -6,6 +6,15 @@ export type ResourceFormat = 'video' | 'website' | 'podcast' | 'paper' | 'white-
6
6
  * resource is gone). Unverifiable resources are flagged, never hidden.
7
7
  */
8
8
  export type VerificationStatus = 'verified' | 'paywalled' | 'blocked' | 'dead' | 'unverified';
9
+ /**
10
+ * How verification was established. `database` means the record came out of a
11
+ * database seconds earlier (existence attested); `url-check` means a live HTTP
12
+ * probe ran; `none` means neither could be done. The distinction matters: a
13
+ * database record can still sit behind a paywall.
14
+ */
15
+ export type VerificationBasis = 'database' | 'url-check' | 'none';
16
+ /** Access status for a paper: freely readable, subscription, or unknown. */
17
+ export type AccessStatus = 'open' | 'subscription' | 'unknown';
9
18
  export type LicensingStatus = 'oer' | 'creative-commons' | 'library-subscription' | 'link-only' | 'unknown';
10
19
  /**
11
20
  * Which rung of the annotation ladder produced the text (ADR-0011):
@@ -25,6 +34,37 @@ export interface Annotation {
25
34
  * retrieved to challenge it (counterpoint mode, spec §3 point 3).
26
35
  */
27
36
  export type Stance = 'supporting' | 'counterpoint';
37
+ /** Optional constraints from the interview brief (ADR-0018). */
38
+ export interface SearchConstraints {
39
+ /** Prefer freely readable papers; known subscription records are dropped. */
40
+ openAccessOnly?: boolean;
41
+ /** Formats to omit entirely (e.g. video). */
42
+ excludeFormats?: ResourceFormat[];
43
+ /** Drop resources with a known year older than this. */
44
+ minYear?: number;
45
+ }
46
+ /** A unit learning outcome, used for optional alignment (ADR-0017). */
47
+ export interface Outcome {
48
+ id: string;
49
+ text: string;
50
+ }
51
+ export type AlignmentConfidence = 'high' | 'medium' | 'low';
52
+ /**
53
+ * A proposed link between a resource and an outcome. The model proposes; the
54
+ * human confirms. Only confirmed alignments are exported.
55
+ */
56
+ export interface Alignment {
57
+ outcomeId: string;
58
+ /** Copied so collections and exports are self-contained. */
59
+ outcomeText: string;
60
+ /** Choice probability or embedding similarity, 0..1. */
61
+ score: number;
62
+ confidence: AlignmentConfidence;
63
+ proposedBy: 'decision' | 'embeddings';
64
+ /** One-line "why this outcome" from the local LLM, when available. */
65
+ reason?: string;
66
+ confirmed: boolean;
67
+ }
28
68
  export interface Resource {
29
69
  stance: Stance;
30
70
  title: string;
@@ -36,6 +76,10 @@ export interface Resource {
36
76
  /** Journal, publisher or channel, when known. */
37
77
  venue: string | null;
38
78
  verification: VerificationStatus;
79
+ /** How that verification was established (database vs URL probe). */
80
+ verificationBasis: VerificationBasis;
81
+ /** Paper access status; 'unknown' for non-papers or when no signal exists. */
82
+ access: AccessStatus;
39
83
  /** Consultant reports are marketing artefacts as often as evidence. */
40
84
  commerciallyInterested: boolean;
41
85
  licensing: LicensingStatus;
@@ -44,6 +88,8 @@ export interface Resource {
44
88
  /** oEmbed or og:image URL; null when unavailable (ADR-0005). */
45
89
  thumbnailUrl: string | null;
46
90
  accessibilityNotes: string[];
91
+ /** Proposed outcome alignment, if the request supplied outcomes (ADR-0017). */
92
+ alignment: Alignment | null;
47
93
  }
48
94
  export interface SuggestRequest {
49
95
  /** A topic string, or extracted text from an uploaded document. */
@@ -54,8 +100,24 @@ export interface SuggestRequest {
54
100
  * or complicates the input's framing, clearly labelled (spec §3).
55
101
  */
56
102
  counterpoint?: boolean;
103
+ /** Optional unit outcomes; when present the pipeline proposes alignments. */
104
+ outcomes?: Outcome[];
105
+ /** Interview brief constraints (ADR-0018). */
106
+ constraints?: SearchConstraints;
107
+ /** Teaching context from the interview; used to frame rationales. */
108
+ context?: string;
57
109
  }
58
110
  export type ComponentState = 'ok' | 'degraded' | 'unavailable';
111
+ /** Stages reported by the pipeline while a suggestion is running. */
112
+ export type PipelineStage = 'query' | 'retrieve' | 'verify' | 'rank' | 'annotate' | 'align' | 'done';
113
+ export interface ProgressEvent {
114
+ stage: PipelineStage;
115
+ /** Optional detail, e.g. "counterpoints" or the resource being annotated. */
116
+ detail?: string;
117
+ current?: number;
118
+ total?: number;
119
+ }
120
+ export type ProgressListener = (event: ProgressEvent) => void;
59
121
  export interface SuggestResult {
60
122
  resources: Resource[];
61
123
  /** Health of each enrichment component for this request (ADR-0006). */
package/dist/types.js CHANGED
File without changes
package/dist/types.js.map CHANGED
File without changes
@@ -1,9 +1,18 @@
1
- import type { VerificationStatus } from '../types.js';
1
+ import type { VerificationBasis, VerificationStatus } from '../types.js';
2
2
  import type { Candidate } from '../retrieval/candidates.js';
3
+ export interface VerificationOutcome {
4
+ status: VerificationStatus;
5
+ basis: VerificationBasis;
6
+ }
3
7
  /**
4
8
  * Map cite-sight-core's UrlStatus onto Honeyguide's VerificationStatus.
5
9
  * `unverified` means the check could not run or was inconclusive — never
6
10
  * silently upgraded (ADR-0006).
7
11
  */
8
12
  export declare function mapUrlStatus(status: string): VerificationStatus;
9
- export declare function verifyCandidate(candidate: Candidate): Promise<VerificationStatus>;
13
+ /**
14
+ * Human label that keeps the two verification bases distinct: a database
15
+ * record is not the same claim as a live link.
16
+ */
17
+ export declare function verificationText(status: VerificationStatus, basis: VerificationBasis): string;
18
+ export declare function verifyCandidate(candidate: Candidate): Promise<VerificationOutcome>;
@@ -17,19 +17,28 @@ export function mapUrlStatus(status) {
17
17
  return 'unverified';
18
18
  }
19
19
  }
20
+ /**
21
+ * Human label that keeps the two verification bases distinct: a database
22
+ * record is not the same claim as a live link.
23
+ */
24
+ export function verificationText(status, basis) {
25
+ if (status !== 'verified')
26
+ return status;
27
+ return basis === 'database' ? 'record found' : 'link live';
28
+ }
20
29
  export async function verifyCandidate(candidate) {
21
30
  // Academic-database results are existence-attested by retrieval itself:
22
31
  // the DOI/entry came out of Crossref/OpenAlex/iTunes/Open Library seconds
23
32
  // ago. Probing doi.org links additionally hits publisher bot-walls and
24
- // reports false "blocked".
33
+ // reports false "blocked". The basis records that distinction.
25
34
  if (candidate.databaseAttested)
26
- return 'verified';
35
+ return { status: 'verified', basis: 'database' };
27
36
  try {
28
37
  const result = await checkUrl(candidate.url);
29
- return mapUrlStatus(result.status);
38
+ return { status: mapUrlStatus(result.status), basis: 'url-check' };
30
39
  }
31
40
  catch {
32
- return 'unverified';
41
+ return { status: 'unverified', basis: 'none' };
33
42
  }
34
43
  }
35
44
  //# sourceMappingURL=verify.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/verify/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAIzD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU;YACb,OAAO,UAAU,CAAC;QACpB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,YAAY,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAoB;IACxD,wEAAwE;IACxE,0EAA0E;IAC1E,uEAAuE;IACvE,2BAA2B;IAC3B,IAAI,SAAS,CAAC,gBAAgB;QAAE,OAAO,UAAU,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7C,OAAO,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,YAAY,CAAC;IACtB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/verify/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AASzD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU;YACb,OAAO,UAAU,CAAC;QACpB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,YAAY,CAAC;IACxB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAA0B,EAC1B,KAAwB;IAExB,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,MAAM,CAAC;IACzC,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAoB;IACxD,wEAAwE;IACxE,0EAA0E;IAC1E,uEAAuE;IACvE,+DAA+D;IAC/D,IAAI,SAAS,CAAC,gBAAgB;QAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IACjF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7C,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACjD,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@michaelborck/honeyguide-core",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "Honeyguide core: retrieval, verification, ranking and rationale. No UI assumptions.",
5
5
  "license": "MIT",
6
6
  "author": "Michael Borck",