@steipete/summarize 0.4.0 → 0.5.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 (82) hide show
  1. package/CHANGELOG.md +73 -5
  2. package/README.md +116 -18
  3. package/dist/cli.cjs +8136 -4368
  4. package/dist/cli.cjs.map +4 -4
  5. package/dist/esm/cli-main.js +47 -2
  6. package/dist/esm/cli-main.js.map +1 -1
  7. package/dist/esm/config.js +368 -3
  8. package/dist/esm/config.js.map +1 -1
  9. package/dist/esm/content/link-preview/content/index.js +13 -0
  10. package/dist/esm/content/link-preview/content/index.js.map +1 -1
  11. package/dist/esm/content/link-preview/content/utils.js +3 -1
  12. package/dist/esm/content/link-preview/content/utils.js.map +1 -1
  13. package/dist/esm/content/link-preview/content/video.js +96 -0
  14. package/dist/esm/content/link-preview/content/video.js.map +1 -0
  15. package/dist/esm/content/link-preview/transcript/providers/youtube/captions.js +21 -21
  16. package/dist/esm/content/link-preview/transcript/providers/youtube/captions.js.map +1 -1
  17. package/dist/esm/costs.js.map +1 -1
  18. package/dist/esm/flags.js +23 -0
  19. package/dist/esm/flags.js.map +1 -1
  20. package/dist/esm/generate-free.js +616 -0
  21. package/dist/esm/generate-free.js.map +1 -0
  22. package/dist/esm/llm/cli.js +290 -0
  23. package/dist/esm/llm/cli.js.map +1 -0
  24. package/dist/esm/llm/generate-text.js +159 -105
  25. package/dist/esm/llm/generate-text.js.map +1 -1
  26. package/dist/esm/llm/html-to-markdown.js +4 -2
  27. package/dist/esm/llm/html-to-markdown.js.map +1 -1
  28. package/dist/esm/model-auto.js +353 -0
  29. package/dist/esm/model-auto.js.map +1 -0
  30. package/dist/esm/model-spec.js +82 -0
  31. package/dist/esm/model-spec.js.map +1 -0
  32. package/dist/esm/prompts/cli.js +18 -0
  33. package/dist/esm/prompts/cli.js.map +1 -0
  34. package/dist/esm/prompts/file.js +4 -4
  35. package/dist/esm/prompts/file.js.map +1 -1
  36. package/dist/esm/prompts/index.js +1 -0
  37. package/dist/esm/prompts/index.js.map +1 -1
  38. package/dist/esm/prompts/link-summary.js +3 -8
  39. package/dist/esm/prompts/link-summary.js.map +1 -1
  40. package/dist/esm/refresh-free.js +667 -0
  41. package/dist/esm/refresh-free.js.map +1 -0
  42. package/dist/esm/run.js +1384 -532
  43. package/dist/esm/run.js.map +1 -1
  44. package/dist/esm/version.js +1 -1
  45. package/dist/types/config.d.ts +58 -5
  46. package/dist/types/content/link-preview/content/types.d.ts +10 -0
  47. package/dist/types/content/link-preview/content/utils.d.ts +1 -1
  48. package/dist/types/content/link-preview/content/video.d.ts +5 -0
  49. package/dist/types/costs.d.ts +2 -1
  50. package/dist/types/flags.d.ts +3 -0
  51. package/dist/types/generate-free.d.ts +17 -0
  52. package/dist/types/llm/cli.d.ts +24 -0
  53. package/dist/types/llm/generate-text.d.ts +13 -4
  54. package/dist/types/llm/html-to-markdown.d.ts +9 -3
  55. package/dist/types/model-auto.d.ts +23 -0
  56. package/dist/types/model-spec.d.ts +33 -0
  57. package/dist/types/prompts/cli.d.ts +8 -0
  58. package/dist/types/prompts/index.d.ts +1 -0
  59. package/dist/types/refresh-free.d.ts +19 -0
  60. package/dist/types/version.d.ts +1 -1
  61. package/docs/README.md +3 -0
  62. package/docs/cli.md +95 -0
  63. package/docs/config.md +123 -1
  64. package/docs/llm.md +24 -4
  65. package/docs/manual-tests.md +40 -0
  66. package/docs/model-auto.md +92 -0
  67. package/docs/site/assets/site.js +20 -17
  68. package/docs/smoketest.md +58 -0
  69. package/docs/website.md +3 -1
  70. package/package.json +8 -4
  71. package/dist/esm/content/link-preview/transcript/providers/twitter.js +0 -12
  72. package/dist/esm/content/link-preview/transcript/providers/twitter.js.map +0 -1
  73. package/dist/esm/content/link-preview/transcript/providers/youtube/ytdlp.js +0 -114
  74. package/dist/esm/content/link-preview/transcript/providers/youtube/ytdlp.js.map +0 -1
  75. package/dist/esm/summarizeHome.js +0 -20
  76. package/dist/esm/summarizeHome.js.map +0 -1
  77. package/dist/esm/tty/live-markdown.js +0 -52
  78. package/dist/esm/tty/live-markdown.js.map +0 -1
  79. package/dist/types/content/link-preview/transcript/providers/twitter.d.ts +0 -3
  80. package/dist/types/content/link-preview/transcript/providers/youtube/ytdlp.d.ts +0 -3
  81. package/dist/types/summarizeHome.d.ts +0 -6
  82. package/dist/types/tty/live-markdown.d.ts +0 -10
@@ -0,0 +1,290 @@
1
+ import { execFile } from 'node:child_process';
2
+ import fs from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import path from 'node:path';
5
+ const DEFAULT_BINARIES = {
6
+ claude: 'claude',
7
+ codex: 'codex',
8
+ gemini: 'gemini',
9
+ };
10
+ const isNonEmptyString = (value) => typeof value === 'string' && value.trim().length > 0;
11
+ export function isCliDisabled(provider, config) {
12
+ if (!config)
13
+ return false;
14
+ if (Array.isArray(config.enabled) && !config.enabled.includes(provider))
15
+ return true;
16
+ return false;
17
+ }
18
+ export function resolveCliBinary(provider, config, env) {
19
+ const providerConfig = provider === 'claude' ? config?.claude : provider === 'codex' ? config?.codex : config?.gemini;
20
+ if (isNonEmptyString(providerConfig?.binary))
21
+ return providerConfig.binary.trim();
22
+ const envKey = `SUMMARIZE_CLI_${provider.toUpperCase()}`;
23
+ if (isNonEmptyString(env[envKey]))
24
+ return env[envKey].trim();
25
+ return DEFAULT_BINARIES[provider];
26
+ }
27
+ async function execCliWithInput({ execFileImpl, cmd, args, input, timeoutMs, env, cwd, }) {
28
+ return await new Promise((resolve, reject) => {
29
+ const child = execFileImpl(cmd, args, {
30
+ timeout: timeoutMs,
31
+ env: { ...process.env, ...env },
32
+ cwd,
33
+ maxBuffer: 50 * 1024 * 1024,
34
+ }, (error, stdout, stderr) => {
35
+ if (error) {
36
+ const stderrText = typeof stderr === 'string' ? stderr : stderr.toString('utf8');
37
+ const message = stderrText.trim()
38
+ ? `${error.message}: ${stderrText.trim()}`
39
+ : error.message;
40
+ reject(new Error(message, { cause: error }));
41
+ return;
42
+ }
43
+ const stdoutText = typeof stdout === 'string' ? stdout : stdout.toString('utf8');
44
+ const stderrText = typeof stderr === 'string' ? stderr : stderr.toString('utf8');
45
+ resolve({ stdout: stdoutText, stderr: stderrText });
46
+ });
47
+ if (child.stdin) {
48
+ child.stdin.write(input);
49
+ child.stdin.end();
50
+ }
51
+ });
52
+ }
53
+ const parseJsonFromOutput = (output) => {
54
+ const trimmed = output.trim();
55
+ if (!trimmed)
56
+ return null;
57
+ if (trimmed.startsWith('{')) {
58
+ try {
59
+ return JSON.parse(trimmed);
60
+ }
61
+ catch {
62
+ // fall through
63
+ }
64
+ }
65
+ const lastBraceIndex = trimmed.lastIndexOf('\n{');
66
+ if (lastBraceIndex >= 0) {
67
+ const candidate = trimmed.slice(lastBraceIndex + 1).trim();
68
+ try {
69
+ return JSON.parse(candidate);
70
+ }
71
+ catch {
72
+ return null;
73
+ }
74
+ }
75
+ return null;
76
+ };
77
+ const toNumber = (value) => {
78
+ if (typeof value !== 'number' || !Number.isFinite(value))
79
+ return null;
80
+ return value;
81
+ };
82
+ const parseClaudeUsage = (payload) => {
83
+ const usage = payload.usage;
84
+ if (!usage || typeof usage !== 'object')
85
+ return null;
86
+ const usageRecord = usage;
87
+ const inputTokens = toNumber(usageRecord.input_tokens);
88
+ const cacheCreationTokens = toNumber(usageRecord.cache_creation_input_tokens) ?? 0;
89
+ const cacheReadTokens = toNumber(usageRecord.cache_read_input_tokens) ?? 0;
90
+ const outputTokens = toNumber(usageRecord.output_tokens);
91
+ if (inputTokens === null && outputTokens === null)
92
+ return null;
93
+ const promptTokens = inputTokens !== null ? inputTokens + cacheCreationTokens + cacheReadTokens : null;
94
+ const completionTokens = outputTokens;
95
+ const totalTokens = typeof promptTokens === 'number' && typeof completionTokens === 'number'
96
+ ? promptTokens + completionTokens
97
+ : null;
98
+ return {
99
+ promptTokens,
100
+ completionTokens,
101
+ totalTokens,
102
+ };
103
+ };
104
+ const parseGeminiUsage = (payload) => {
105
+ const stats = payload.stats;
106
+ if (!stats || typeof stats !== 'object')
107
+ return null;
108
+ const models = stats.models;
109
+ if (!models || typeof models !== 'object')
110
+ return null;
111
+ let promptSum = 0;
112
+ let completionSum = 0;
113
+ let totalSum = 0;
114
+ let hasPrompt = false;
115
+ let hasCompletion = false;
116
+ let hasTotal = false;
117
+ for (const entry of Object.values(models)) {
118
+ if (!entry || typeof entry !== 'object')
119
+ continue;
120
+ const tokens = entry.tokens;
121
+ if (!tokens || typeof tokens !== 'object')
122
+ continue;
123
+ const prompt = toNumber(tokens.prompt);
124
+ const candidates = toNumber(tokens.candidates);
125
+ const total = toNumber(tokens.total);
126
+ if (typeof prompt === 'number') {
127
+ promptSum += prompt;
128
+ hasPrompt = true;
129
+ }
130
+ if (typeof candidates === 'number') {
131
+ completionSum += candidates;
132
+ hasCompletion = true;
133
+ }
134
+ if (typeof total === 'number') {
135
+ totalSum += total;
136
+ hasTotal = true;
137
+ }
138
+ }
139
+ if (!hasPrompt && !hasCompletion && !hasTotal)
140
+ return null;
141
+ const promptTokens = hasPrompt ? promptSum : null;
142
+ const completionTokens = hasCompletion ? completionSum : null;
143
+ const totalTokens = hasTotal && totalSum > 0
144
+ ? totalSum
145
+ : typeof promptTokens === 'number' && typeof completionTokens === 'number'
146
+ ? promptTokens + completionTokens
147
+ : null;
148
+ return { promptTokens, completionTokens, totalTokens };
149
+ };
150
+ const parseCodexUsageFromJsonl = (output) => {
151
+ const lines = output
152
+ .split(/\r?\n/)
153
+ .map((line) => line.trim())
154
+ .filter((line) => line.length > 0);
155
+ let usage = null;
156
+ let costUsd = null;
157
+ for (const line of lines) {
158
+ if (!line.startsWith('{'))
159
+ continue;
160
+ try {
161
+ const parsed = JSON.parse(line);
162
+ const candidates = [
163
+ parsed.usage,
164
+ parsed.response?.usage,
165
+ parsed.metrics?.usage,
166
+ ].filter(Boolean);
167
+ for (const candidate of candidates) {
168
+ const input = toNumber(candidate.input_tokens) ??
169
+ toNumber(candidate.prompt_tokens) ??
170
+ toNumber(candidate.inputTokens) ??
171
+ null;
172
+ const outputTokens = toNumber(candidate.output_tokens) ??
173
+ toNumber(candidate.completion_tokens) ??
174
+ toNumber(candidate.outputTokens) ??
175
+ null;
176
+ const totalTokens = toNumber(candidate.total_tokens) ??
177
+ toNumber(candidate.totalTokens) ??
178
+ (typeof input === 'number' && typeof outputTokens === 'number'
179
+ ? input + outputTokens
180
+ : null);
181
+ if (input !== null || outputTokens !== null || totalTokens !== null) {
182
+ usage = { promptTokens: input, completionTokens: outputTokens, totalTokens };
183
+ }
184
+ }
185
+ if (costUsd === null) {
186
+ const costValue = toNumber(parsed.cost_usd) ??
187
+ toNumber(parsed.usage?.cost_usd) ??
188
+ null;
189
+ if (typeof costValue === 'number')
190
+ costUsd = costValue;
191
+ }
192
+ }
193
+ catch {
194
+ // ignore malformed JSON lines
195
+ }
196
+ }
197
+ return { usage, costUsd };
198
+ };
199
+ export async function runCliModel({ provider, prompt, model, allowTools, timeoutMs, env, execFileImpl, config, cwd, extraArgs, }) {
200
+ const execFileFn = execFileImpl ?? execFile;
201
+ const binary = resolveCliBinary(provider, config, env);
202
+ const args = [];
203
+ const effectiveEnv = provider === 'gemini' && !isNonEmptyString(env.GEMINI_CLI_NO_RELAUNCH)
204
+ ? { ...env, GEMINI_CLI_NO_RELAUNCH: 'true' }
205
+ : env;
206
+ const providerConfig = provider === 'claude' ? config?.claude : provider === 'codex' ? config?.codex : config?.gemini;
207
+ if (providerConfig?.extraArgs?.length) {
208
+ args.push(...providerConfig.extraArgs);
209
+ }
210
+ if (extraArgs?.length) {
211
+ args.push(...extraArgs);
212
+ }
213
+ if (provider === 'codex') {
214
+ const outputDir = await fs.mkdtemp(path.join(tmpdir(), 'summarize-codex-'));
215
+ const outputPath = path.join(outputDir, 'last-message.txt');
216
+ args.push('exec', '--output-last-message', outputPath, '--skip-git-repo-check', '--json');
217
+ if (model && model.trim().length > 0) {
218
+ args.push('-m', model.trim());
219
+ }
220
+ const hasVerbosityOverride = args.some((arg) => arg.includes('text.verbosity'));
221
+ if (!hasVerbosityOverride) {
222
+ args.push('-c', 'text.verbosity="medium"');
223
+ }
224
+ const { stdout } = await execCliWithInput({
225
+ execFileImpl: execFileFn,
226
+ cmd: binary,
227
+ args,
228
+ input: prompt,
229
+ timeoutMs,
230
+ env: effectiveEnv,
231
+ cwd,
232
+ });
233
+ const { usage, costUsd } = parseCodexUsageFromJsonl(stdout);
234
+ let fileText = '';
235
+ try {
236
+ fileText = (await fs.readFile(outputPath, 'utf8')).trim();
237
+ }
238
+ catch {
239
+ fileText = '';
240
+ }
241
+ if (fileText) {
242
+ return { text: fileText, usage, costUsd };
243
+ }
244
+ const stdoutText = stdout.trim();
245
+ if (stdoutText) {
246
+ return { text: stdoutText, usage, costUsd };
247
+ }
248
+ throw new Error('CLI returned empty output');
249
+ }
250
+ if (model && model.trim().length > 0) {
251
+ args.push('--model', model.trim());
252
+ }
253
+ if (provider === 'claude') {
254
+ args.push('--print');
255
+ }
256
+ args.push('--output-format', 'json');
257
+ if (allowTools) {
258
+ if (provider === 'claude') {
259
+ args.push('--tools', 'Read', '--dangerously-skip-permissions');
260
+ }
261
+ if (provider === 'gemini') {
262
+ args.push('--yolo');
263
+ }
264
+ }
265
+ const { stdout } = await execCliWithInput({
266
+ execFileImpl: execFileFn,
267
+ cmd: binary,
268
+ args,
269
+ input: prompt,
270
+ timeoutMs,
271
+ env: effectiveEnv,
272
+ cwd,
273
+ });
274
+ const trimmed = stdout.trim();
275
+ if (!trimmed) {
276
+ throw new Error('CLI returned empty output');
277
+ }
278
+ const parsed = parseJsonFromOutput(trimmed);
279
+ if (parsed && typeof parsed === 'object') {
280
+ const payload = parsed;
281
+ const resultText = payload.result ?? payload.response;
282
+ if (typeof resultText === 'string' && resultText.trim().length > 0) {
283
+ const usage = provider === 'claude' ? parseClaudeUsage(payload) : parseGeminiUsage(payload);
284
+ const costUsd = provider === 'claude' ? (toNumber(payload.total_cost_usd) ?? null) : null;
285
+ return { text: resultText.trim(), usage, costUsd };
286
+ }
287
+ }
288
+ return { text: trimmed, usage: null, costUsd: null };
289
+ }
290
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/llm/cli.ts"],"names":[],"mappings":"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"}