@steipete/summarize 0.1.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 (174) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/LICENSE +21 -0
  3. package/README.md +185 -0
  4. package/dist/cli.cjs +74333 -0
  5. package/dist/cli.cjs.map +7 -0
  6. package/dist/esm/cli-main.js +80 -0
  7. package/dist/esm/cli-main.js.map +1 -0
  8. package/dist/esm/cli.js +18 -0
  9. package/dist/esm/cli.js.map +1 -0
  10. package/dist/esm/config.js +33 -0
  11. package/dist/esm/config.js.map +1 -0
  12. package/dist/esm/content/asset.js +167 -0
  13. package/dist/esm/content/asset.js.map +1 -0
  14. package/dist/esm/content/index.js +4 -0
  15. package/dist/esm/content/index.js.map +1 -0
  16. package/dist/esm/content/link-preview/client.js +20 -0
  17. package/dist/esm/content/link-preview/client.js.map +1 -0
  18. package/dist/esm/content/link-preview/content/article.js +150 -0
  19. package/dist/esm/content/link-preview/content/article.js.map +1 -0
  20. package/dist/esm/content/link-preview/content/cleaner.js +55 -0
  21. package/dist/esm/content/link-preview/content/cleaner.js.map +1 -0
  22. package/dist/esm/content/link-preview/content/fetcher.js +120 -0
  23. package/dist/esm/content/link-preview/content/fetcher.js.map +1 -0
  24. package/dist/esm/content/link-preview/content/index.js +275 -0
  25. package/dist/esm/content/link-preview/content/index.js.map +1 -0
  26. package/dist/esm/content/link-preview/content/parsers.js +77 -0
  27. package/dist/esm/content/link-preview/content/parsers.js.map +1 -0
  28. package/dist/esm/content/link-preview/content/types.js +4 -0
  29. package/dist/esm/content/link-preview/content/types.js.map +1 -0
  30. package/dist/esm/content/link-preview/content/utils.js +127 -0
  31. package/dist/esm/content/link-preview/content/utils.js.map +1 -0
  32. package/dist/esm/content/link-preview/content/youtube.js +82 -0
  33. package/dist/esm/content/link-preview/content/youtube.js.map +1 -0
  34. package/dist/esm/content/link-preview/deps.js +2 -0
  35. package/dist/esm/content/link-preview/deps.js.map +1 -0
  36. package/dist/esm/content/link-preview/fetch-with-timeout.js +35 -0
  37. package/dist/esm/content/link-preview/fetch-with-timeout.js.map +1 -0
  38. package/dist/esm/content/link-preview/transcript/cache.js +73 -0
  39. package/dist/esm/content/link-preview/transcript/cache.js.map +1 -0
  40. package/dist/esm/content/link-preview/transcript/index.js +95 -0
  41. package/dist/esm/content/link-preview/transcript/index.js.map +1 -0
  42. package/dist/esm/content/link-preview/transcript/normalize.js +43 -0
  43. package/dist/esm/content/link-preview/transcript/normalize.js.map +1 -0
  44. package/dist/esm/content/link-preview/transcript/providers/generic.js +11 -0
  45. package/dist/esm/content/link-preview/transcript/providers/generic.js.map +1 -0
  46. package/dist/esm/content/link-preview/transcript/providers/podcast.js +12 -0
  47. package/dist/esm/content/link-preview/transcript/providers/podcast.js.map +1 -0
  48. package/dist/esm/content/link-preview/transcript/providers/twitter.js +12 -0
  49. package/dist/esm/content/link-preview/transcript/providers/twitter.js.map +1 -0
  50. package/dist/esm/content/link-preview/transcript/providers/youtube/api.js +257 -0
  51. package/dist/esm/content/link-preview/transcript/providers/youtube/api.js.map +1 -0
  52. package/dist/esm/content/link-preview/transcript/providers/youtube/apify.js +55 -0
  53. package/dist/esm/content/link-preview/transcript/providers/youtube/apify.js.map +1 -0
  54. package/dist/esm/content/link-preview/transcript/providers/youtube/captions.js +409 -0
  55. package/dist/esm/content/link-preview/transcript/providers/youtube/captions.js.map +1 -0
  56. package/dist/esm/content/link-preview/transcript/providers/youtube/ytdlp.js +114 -0
  57. package/dist/esm/content/link-preview/transcript/providers/youtube/ytdlp.js.map +1 -0
  58. package/dist/esm/content/link-preview/transcript/providers/youtube.js +74 -0
  59. package/dist/esm/content/link-preview/transcript/providers/youtube.js.map +1 -0
  60. package/dist/esm/content/link-preview/transcript/types.js +2 -0
  61. package/dist/esm/content/link-preview/transcript/types.js.map +1 -0
  62. package/dist/esm/content/link-preview/transcript/utils.js +193 -0
  63. package/dist/esm/content/link-preview/transcript/utils.js.map +1 -0
  64. package/dist/esm/content/link-preview/types.js +2 -0
  65. package/dist/esm/content/link-preview/types.js.map +1 -0
  66. package/dist/esm/costs.js +57 -0
  67. package/dist/esm/costs.js.map +1 -0
  68. package/dist/esm/firecrawl.js +54 -0
  69. package/dist/esm/firecrawl.js.map +1 -0
  70. package/dist/esm/flags.js +97 -0
  71. package/dist/esm/flags.js.map +1 -0
  72. package/dist/esm/index.js +4 -0
  73. package/dist/esm/index.js.map +1 -0
  74. package/dist/esm/llm/generate-text.js +296 -0
  75. package/dist/esm/llm/generate-text.js.map +1 -0
  76. package/dist/esm/llm/google-models.js +112 -0
  77. package/dist/esm/llm/google-models.js.map +1 -0
  78. package/dist/esm/llm/html-to-markdown.js +44 -0
  79. package/dist/esm/llm/html-to-markdown.js.map +1 -0
  80. package/dist/esm/llm/model-id.js +45 -0
  81. package/dist/esm/llm/model-id.js.map +1 -0
  82. package/dist/esm/pricing/litellm.js +25 -0
  83. package/dist/esm/pricing/litellm.js.map +1 -0
  84. package/dist/esm/prompts/file.js +14 -0
  85. package/dist/esm/prompts/file.js.map +1 -0
  86. package/dist/esm/prompts/index.js +3 -0
  87. package/dist/esm/prompts/index.js.map +1 -0
  88. package/dist/esm/prompts/link-summary.js +105 -0
  89. package/dist/esm/prompts/link-summary.js.map +1 -0
  90. package/dist/esm/run.js +1674 -0
  91. package/dist/esm/run.js.map +1 -0
  92. package/dist/esm/shared/contracts.js +2 -0
  93. package/dist/esm/shared/contracts.js.map +1 -0
  94. package/dist/esm/summarizeHome.js +20 -0
  95. package/dist/esm/summarizeHome.js.map +1 -0
  96. package/dist/esm/tty/live-markdown.js +52 -0
  97. package/dist/esm/tty/live-markdown.js.map +1 -0
  98. package/dist/esm/tty/osc-progress.js +8 -0
  99. package/dist/esm/tty/osc-progress.js.map +1 -0
  100. package/dist/esm/tty/spinner.js +33 -0
  101. package/dist/esm/tty/spinner.js.map +1 -0
  102. package/dist/esm/version.js +44 -0
  103. package/dist/esm/version.js.map +1 -0
  104. package/dist/types/cli-main.d.ts +11 -0
  105. package/dist/types/cli.d.ts +1 -0
  106. package/dist/types/config.d.ts +15 -0
  107. package/dist/types/content/asset.d.ts +44 -0
  108. package/dist/types/content/index.d.ts +4 -0
  109. package/dist/types/content/link-preview/client.d.ts +14 -0
  110. package/dist/types/content/link-preview/content/article.d.ts +4 -0
  111. package/dist/types/content/link-preview/content/cleaner.d.ts +12 -0
  112. package/dist/types/content/link-preview/content/fetcher.d.ts +16 -0
  113. package/dist/types/content/link-preview/content/index.d.ts +4 -0
  114. package/dist/types/content/link-preview/content/parsers.d.ts +7 -0
  115. package/dist/types/content/link-preview/content/types.d.ts +44 -0
  116. package/dist/types/content/link-preview/content/utils.d.ts +16 -0
  117. package/dist/types/content/link-preview/content/youtube.d.ts +1 -0
  118. package/dist/types/content/link-preview/deps.d.ts +70 -0
  119. package/dist/types/content/link-preview/fetch-with-timeout.d.ts +4 -0
  120. package/dist/types/content/link-preview/transcript/cache.d.ts +29 -0
  121. package/dist/types/content/link-preview/transcript/index.d.ts +9 -0
  122. package/dist/types/content/link-preview/transcript/normalize.d.ts +3 -0
  123. package/dist/types/content/link-preview/transcript/providers/generic.d.ts +3 -0
  124. package/dist/types/content/link-preview/transcript/providers/podcast.d.ts +3 -0
  125. package/dist/types/content/link-preview/transcript/providers/twitter.d.ts +3 -0
  126. package/dist/types/content/link-preview/transcript/providers/youtube/api.d.ts +26 -0
  127. package/dist/types/content/link-preview/transcript/providers/youtube/apify.d.ts +1 -0
  128. package/dist/types/content/link-preview/transcript/providers/youtube/captions.d.ts +7 -0
  129. package/dist/types/content/link-preview/transcript/providers/youtube/ytdlp.d.ts +3 -0
  130. package/dist/types/content/link-preview/transcript/providers/youtube.d.ts +3 -0
  131. package/dist/types/content/link-preview/transcript/types.d.ts +23 -0
  132. package/dist/types/content/link-preview/transcript/utils.d.ts +7 -0
  133. package/dist/types/content/link-preview/types.d.ts +36 -0
  134. package/dist/types/costs.d.ts +31 -0
  135. package/dist/types/firecrawl.d.ts +5 -0
  136. package/dist/types/flags.d.ts +23 -0
  137. package/dist/types/index.d.ts +4 -0
  138. package/dist/types/llm/generate-text.d.ts +43 -0
  139. package/dist/types/llm/google-models.d.ts +10 -0
  140. package/dist/types/llm/html-to-markdown.d.ts +15 -0
  141. package/dist/types/llm/model-id.d.ts +14 -0
  142. package/dist/types/pricing/litellm.d.ts +13 -0
  143. package/dist/types/prompts/file.d.ts +6 -0
  144. package/dist/types/prompts/index.d.ts +3 -0
  145. package/dist/types/prompts/link-summary.d.ts +27 -0
  146. package/dist/types/run.d.ts +8 -0
  147. package/dist/types/shared/contracts.d.ts +2 -0
  148. package/dist/types/summarizeHome.d.ts +6 -0
  149. package/dist/types/tty/live-markdown.d.ts +10 -0
  150. package/dist/types/tty/osc-progress.d.ts +3 -0
  151. package/dist/types/tty/spinner.d.ts +10 -0
  152. package/dist/types/version.d.ts +2 -0
  153. package/docs/README.md +11 -0
  154. package/docs/config.md +28 -0
  155. package/docs/extract-only.md +13 -0
  156. package/docs/firecrawl.md +17 -0
  157. package/docs/llm.md +33 -0
  158. package/docs/openai.md +18 -0
  159. package/docs/site/.nojekyll +1 -0
  160. package/docs/site/404.html +37 -0
  161. package/docs/site/assets/site.css +577 -0
  162. package/docs/site/assets/site.js +69 -0
  163. package/docs/site/docs/config.html +73 -0
  164. package/docs/site/docs/extract-only.html +79 -0
  165. package/docs/site/docs/firecrawl.html +72 -0
  166. package/docs/site/docs/index.html +89 -0
  167. package/docs/site/docs/llm.html +70 -0
  168. package/docs/site/docs/openai.html +66 -0
  169. package/docs/site/docs/website.html +70 -0
  170. package/docs/site/docs/youtube.html +62 -0
  171. package/docs/site/index.html +125 -0
  172. package/docs/website.md +27 -0
  173. package/docs/youtube.md +32 -0
  174. package/package.json +76 -0
@@ -0,0 +1,105 @@
1
+ const SUMMARY_LENGTH_DIRECTIVES = {
2
+ short: {
3
+ guidance: 'Write a tight paragraph (2–3 sentences) that delivers the primary claim plus one high-signal supporting detail.',
4
+ formatting: 'Output a single paragraph with normal sentences; avoid headings or bullet lists.',
5
+ },
6
+ medium: {
7
+ guidance: 'Write two short paragraphs covering the core claim in the first paragraph and the most important supporting evidence, data points, or implications in the second.',
8
+ formatting: 'Each paragraph should contain 2–3 sentences. Separate paragraphs with a blank line. Do not use bullet lists or headings.',
9
+ },
10
+ long: {
11
+ guidance: 'Write three paragraphs: (1) summarize the claim and scope, (2) walk through the major supporting arguments or events, (3) explain implications, risks, or recommended next steps.',
12
+ formatting: 'Keep paragraphs balanced (3–4 sentences each) and separate them with single blank lines. No bullet lists or headings.',
13
+ },
14
+ xl: {
15
+ guidance: 'Produce a structured Markdown outline with short section headings (“Overview”, “Key Evidence”, “Implications”, “Next Steps”) followed by 2–3 bullet points under each heading. Surface quantitative details, quotes, or contrasting views when available.',
16
+ formatting: 'Use level-3 Markdown headings (###) for each section followed by bullet lists. Bullets may span 1–2 sentences and can exceed 20 words when necessary.',
17
+ },
18
+ xxl: {
19
+ guidance: 'Produce a comprehensive Markdown report: start with a short executive summary paragraph, then add sections for Background, Detailed Findings, Implications, and Open Questions. Within sections, use bullet lists or short paragraphs to cover nuanced context, statistics, quotes, counterpoints, and recommended follow-up actions.',
20
+ formatting: 'Use Markdown headings (###) for each section, combine paragraphs and bullet lists as needed, and ensure the overall response is substantial (multiple paragraphs and bullets totalling several hundred words) while remaining factual.',
21
+ },
22
+ };
23
+ export const SUMMARY_LENGTH_TO_TOKENS = {
24
+ short: 768,
25
+ medium: 1536,
26
+ long: 3072,
27
+ xl: 6144,
28
+ xxl: 12288,
29
+ };
30
+ export function pickSummaryLengthForCharacters(maxCharacters) {
31
+ if (maxCharacters <= 1200)
32
+ return 'short';
33
+ if (maxCharacters <= 2500)
34
+ return 'medium';
35
+ if (maxCharacters <= 6000)
36
+ return 'long';
37
+ if (maxCharacters <= 14000)
38
+ return 'xl';
39
+ return 'xxl';
40
+ }
41
+ export function estimateMaxCompletionTokensForCharacters(maxCharacters) {
42
+ const estimate = Math.ceil(maxCharacters / 4);
43
+ return Math.max(256, estimate);
44
+ }
45
+ const resolveSummaryDirective = (length) =>
46
+ // SummaryLength is a contracts-enforced enum in all call sites; suppress generic injection warning.
47
+ // eslint-disable-next-line security/detect-object-injection
48
+ SUMMARY_LENGTH_DIRECTIVES[length];
49
+ const formatCount = (value) => value.toLocaleString();
50
+ export function buildLinkSummaryPrompt({ url, title, siteName, description, content, truncated, hasTranscript, summaryLength, shares, }) {
51
+ const contextLines = [`Source URL: ${url}`];
52
+ if (title) {
53
+ contextLines.push(`Title: ${title}`);
54
+ }
55
+ if (siteName) {
56
+ contextLines.push(`Site: ${siteName}`);
57
+ }
58
+ if (description) {
59
+ contextLines.push(`Page description: ${description}`);
60
+ }
61
+ if (truncated) {
62
+ contextLines.push('Note: Content truncated to the first portion available.');
63
+ }
64
+ const contextHeader = contextLines.join('\n');
65
+ const audienceLine = hasTranscript
66
+ ? 'You summarize online videos for curious Twitter users who want to know whether the clip is worth watching.'
67
+ : 'You summarize online articles for curious Twitter users who want the gist before deciding to dive in.';
68
+ const preset = typeof summaryLength === 'string'
69
+ ? summaryLength
70
+ : pickSummaryLengthForCharacters(summaryLength.maxCharacters);
71
+ const directive = resolveSummaryDirective(preset);
72
+ const maxCharactersLine = typeof summaryLength === 'string'
73
+ ? ''
74
+ : `Target length: around ${formatCount(summaryLength.maxCharacters)} characters total (including Markdown and whitespace). This is a soft guideline; prioritize clarity and completeness.`;
75
+ const shareLines = shares.map((share) => {
76
+ const handle = share.handle && share.handle.length > 0 ? `@${share.handle}` : share.author;
77
+ const metrics = [];
78
+ if (typeof share.likeCount === 'number' && share.likeCount > 0) {
79
+ metrics.push(`${formatCount(share.likeCount)} likes`);
80
+ }
81
+ if (typeof share.reshareCount === 'number' && share.reshareCount > 0) {
82
+ metrics.push(`${formatCount(share.reshareCount)} reshares`);
83
+ }
84
+ if (typeof share.replyCount === 'number' && share.replyCount > 0) {
85
+ metrics.push(`${formatCount(share.replyCount)} replies`);
86
+ }
87
+ const metricsSuffix = metrics.length > 0 ? ` [${metrics.join(', ')}]` : '';
88
+ const timestamp = share.timestamp ? ` (${share.timestamp})` : '';
89
+ return `- ${handle}${timestamp}${metricsSuffix}: ${share.text}`;
90
+ });
91
+ const shareGuidance = shares.length > 0
92
+ ? 'You are also given quotes from people who recently shared this link. When these quotes contain substantive commentary, append a brief subsection titled "What sharers are saying" with one or two bullet points summarizing the key reactions. If they are generic reshares with no commentary, omit that subsection.'
93
+ : 'You are not given any quotes from people who shared this link. Do not fabricate reactions or add a "What sharers are saying" subsection.';
94
+ const sharesBlock = shares.length > 0 ? `Tweets from sharers:\n${shareLines.join('\n')}\n\n` : '';
95
+ return `${audienceLine} ${directive.guidance} ${directive.formatting} ${maxCharactersLine} Keep the response compact by avoiding blank lines between sentences or list items; use only the single newlines required by the formatting instructions. Do not use emojis, disclaimers, or speculation. Write in direct, factual language. Format the answer in Markdown and obey the length-specific formatting above. Base everything strictly on the provided content and never invent details. ${shareGuidance}
96
+
97
+ ${contextHeader}
98
+
99
+ ${sharesBlock}Extracted content:
100
+ """
101
+ ${content}
102
+ """
103
+ `;
104
+ }
105
+ //# sourceMappingURL=link-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-summary.js","sourceRoot":"","sources":["../../../src/prompts/link-summary.ts"],"names":[],"mappings":"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"}