@askalf/deepdive 0.1.0 → 0.4.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 (72) hide show
  1. package/README.md +177 -52
  2. package/dist/agent.d.ts +48 -2
  3. package/dist/agent.d.ts.map +1 -1
  4. package/dist/agent.js +178 -65
  5. package/dist/agent.js.map +1 -1
  6. package/dist/cache.d.ts +16 -0
  7. package/dist/cache.d.ts.map +1 -0
  8. package/dist/cache.js +62 -0
  9. package/dist/cache.js.map +1 -0
  10. package/dist/cli.d.ts +1 -0
  11. package/dist/cli.d.ts.map +1 -1
  12. package/dist/cli.js +164 -18
  13. package/dist/cli.js.map +1 -1
  14. package/dist/concurrency.d.ts +2 -0
  15. package/dist/concurrency.d.ts.map +1 -0
  16. package/dist/concurrency.js +38 -0
  17. package/dist/concurrency.js.map +1 -0
  18. package/dist/config.d.ts +20 -0
  19. package/dist/config.d.ts.map +1 -1
  20. package/dist/config.js +64 -3
  21. package/dist/config.js.map +1 -1
  22. package/dist/doctor.d.ts +44 -0
  23. package/dist/doctor.d.ts.map +1 -0
  24. package/dist/doctor.js +533 -0
  25. package/dist/doctor.js.map +1 -0
  26. package/dist/index.d.ts +9 -3
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +9 -3
  29. package/dist/index.js.map +1 -1
  30. package/dist/llm-stream.d.ts +27 -0
  31. package/dist/llm-stream.d.ts.map +1 -0
  32. package/dist/llm-stream.js +173 -0
  33. package/dist/llm-stream.js.map +1 -0
  34. package/dist/llm.d.ts +10 -0
  35. package/dist/llm.d.ts.map +1 -1
  36. package/dist/llm.js +96 -20
  37. package/dist/llm.js.map +1 -1
  38. package/dist/plan.d.ts +7 -0
  39. package/dist/plan.d.ts.map +1 -1
  40. package/dist/plan.js +51 -0
  41. package/dist/plan.js.map +1 -1
  42. package/dist/retry.d.ts +18 -0
  43. package/dist/retry.d.ts.map +1 -0
  44. package/dist/retry.js +70 -0
  45. package/dist/retry.js.map +1 -0
  46. package/dist/robots.d.ts +26 -0
  47. package/dist/robots.d.ts.map +1 -0
  48. package/dist/robots.js +183 -0
  49. package/dist/robots.js.map +1 -0
  50. package/dist/search/duckduckgo.d.ts +2 -0
  51. package/dist/search/duckduckgo.d.ts.map +1 -1
  52. package/dist/search/duckduckgo.js +38 -13
  53. package/dist/search/duckduckgo.js.map +1 -1
  54. package/dist/search/exa.d.ts +17 -0
  55. package/dist/search/exa.d.ts.map +1 -0
  56. package/dist/search/exa.js +62 -0
  57. package/dist/search/exa.js.map +1 -0
  58. package/dist/search/searxng.d.ts.map +1 -1
  59. package/dist/search/searxng.js +2 -1
  60. package/dist/search/searxng.js.map +1 -1
  61. package/dist/search.d.ts.map +1 -1
  62. package/dist/search.js +9 -1
  63. package/dist/search.js.map +1 -1
  64. package/dist/synthesize.d.ts +1 -1
  65. package/dist/synthesize.d.ts.map +1 -1
  66. package/dist/synthesize.js +11 -2
  67. package/dist/synthesize.js.map +1 -1
  68. package/dist/url-util.d.ts +4 -0
  69. package/dist/url-util.d.ts.map +1 -0
  70. package/dist/url-util.js +24 -0
  71. package/dist/url-util.js.map +1 -0
  72. package/package.json +3 -2
package/dist/cli.js CHANGED
@@ -3,41 +3,63 @@
3
3
  //
4
4
  // deepdive "how does claude's rate limiter work"
5
5
  // deepdive "..." --model=claude-opus-4-7 --search=brave --out=report.md
6
+ // deepdive "..." --deep=2 --concurrency=6 --json
6
7
  // deepdive --help
7
8
  //
8
- // Prints the cited markdown report to stdout. Progress events go to stderr
9
- // when --verbose is set or DEEPDIVE_VERBOSE=1.
9
+ // Prints the cited markdown report to stdout (or JSON with --json). Progress
10
+ // events go to stderr when --verbose is set or DEEPDIVE_VERBOSE=1.
10
11
  import { writeFileSync } from "node:fs";
11
12
  import { resolve } from "node:path";
12
13
  import { fileURLToPath } from "node:url";
13
14
  import { resolveConfig } from "./config.js";
14
15
  import { resolveSearchAdapter } from "./search.js";
15
16
  import { runAgent } from "./agent.js";
17
+ import { createCache } from "./cache.js";
18
+ import { renderSourcesMarkdown } from "./citations.js";
19
+ import { runDoctor, renderDoctorText, renderDoctorJson, exitCodeFor, scrubPath, } from "./doctor.js";
16
20
  const USAGE = `deepdive — local research agent
17
21
 
18
22
  Usage:
19
- deepdive "<question>" [flags]
23
+ deepdive "<question>" [flags] Run the research agent
24
+ deepdive doctor [flags] Health check — paste the output when filing issues
25
+ deepdive --help Show this help
20
26
 
21
27
  Flags:
22
28
  --base-url=<url> LLM endpoint. Default: http://localhost:3456 (dario)
23
29
  --api-key=<key> LLM API key. Default: dario
24
30
  --model=<name> Model to use. Default: claude-sonnet-4-6
25
31
  --max-tokens=<n> Output max tokens per LLM call. Default: 4096
26
- --search=<adapter> Search adapter: duckduckgo | searxng | brave | tavily
32
+ --search=<adapter> Search adapter: duckduckgo | searxng | brave | tavily | exa
27
33
  Default: duckduckgo (no key required)
28
34
  --results-per-query=<n> Results per sub-query. Default: 5
29
35
  --max-sources=<n> Total sources to fetch. Default: 12
30
36
  --max-words-per-source=<n> Per-source content cap before synthesis. Default: 2000
31
- --timeout-ms=<ms> Per-fetch timeout. Default: 30000
32
- --out=<path> Write markdown to a file (also prints to stdout)
37
+ --timeout-ms=<ms> Per-fetch (browser) timeout. Default: 30000
38
+ --llm-timeout-ms=<ms> Per-LLM-call timeout. Default: 120000 (2 min)
39
+ --llm-attempts=<n> Max LLM attempts per call (with exponential
40
+ backoff on 5xx/429/network errors). Default: 3
41
+ --deep[=<n>] Iterative research: run N additional critic-driven
42
+ rounds after the first synthesis. Default when
43
+ bare: 2. No deep pass when flag absent.
44
+ --concurrency=<n> Parallel fetches. Default: 4
45
+ --no-cache Disable the on-disk page cache (default: enabled)
46
+ --cache-ttl-ms=<ms> Page cache TTL. Default: 3600000 (1 hour)
47
+ --ignore-robots Bypass robots.txt checks (default: respect them)
48
+ --json Emit a JSON result to stdout instead of markdown
49
+ --out=<path> Write the output (markdown or json) to a file too
33
50
  --verbose, -v Stream progress events to stderr
51
+ --no-stream Buffer the final answer instead of streaming
52
+ tokens to stdout (auto-off for --json, deep
53
+ mode, and non-TTY stdout)
34
54
  --help, -h Show this help
35
55
 
36
56
  Environment:
37
57
  DEEPDIVE_BASE_URL, DEEPDIVE_API_KEY, DEEPDIVE_MODEL, DEEPDIVE_SEARCH,
38
- DEEPDIVE_SEARXNG_URL, DEEPDIVE_BRAVE_KEY, DEEPDIVE_TAVILY_KEY,
58
+ DEEPDIVE_SEARXNG_URL, DEEPDIVE_BRAVE_KEY, DEEPDIVE_TAVILY_KEY, DEEPDIVE_EXA_KEY,
39
59
  DEEPDIVE_MAX_SOURCES, DEEPDIVE_FETCH_TIMEOUT_MS, DEEPDIVE_HEADED,
40
- DEEPDIVE_VERBOSE
60
+ DEEPDIVE_DEEP_ROUNDS, DEEPDIVE_CONCURRENCY, DEEPDIVE_NO_CACHE,
61
+ DEEPDIVE_CACHE_DIR, DEEPDIVE_CACHE_TTL_MS, DEEPDIVE_JSON, DEEPDIVE_VERBOSE,
62
+ DEEPDIVE_LLM_TIMEOUT_MS, DEEPDIVE_LLM_ATTEMPTS
41
63
  `;
42
64
  // Exported for unit tests.
43
65
  export function parseArgs(argv) {
@@ -54,6 +76,26 @@ export function parseArgs(argv) {
54
76
  flags.verbose = true;
55
77
  continue;
56
78
  }
79
+ if (a === "--no-cache") {
80
+ flags.noCache = true;
81
+ continue;
82
+ }
83
+ if (a === "--ignore-robots") {
84
+ flags.ignoreRobots = true;
85
+ continue;
86
+ }
87
+ if (a === "--json") {
88
+ flags.json = true;
89
+ continue;
90
+ }
91
+ if (a === "--no-stream") {
92
+ flags.noStream = true;
93
+ continue;
94
+ }
95
+ if (a === "--deep") {
96
+ flags.deepRounds = 2;
97
+ continue;
98
+ }
57
99
  const m = /^--([a-z0-9-]+)=(.*)$/.exec(a);
58
100
  if (m) {
59
101
  const [, key, rawValue] = m;
@@ -86,6 +128,21 @@ export function parseArgs(argv) {
86
128
  case "timeout-ms":
87
129
  flags.timeoutMs = parsePositiveInt(value);
88
130
  break;
131
+ case "llm-timeout-ms":
132
+ flags.llmTimeoutMs = parsePositiveInt(value);
133
+ break;
134
+ case "llm-attempts":
135
+ flags.llmAttempts = parsePositiveInt(value);
136
+ break;
137
+ case "deep":
138
+ flags.deepRounds = parseNonNegativeInt(value);
139
+ break;
140
+ case "concurrency":
141
+ flags.concurrency = parsePositiveInt(value);
142
+ break;
143
+ case "cache-ttl-ms":
144
+ flags.cacheTtlMs = parsePositiveInt(value);
145
+ break;
89
146
  case "out":
90
147
  outPath = value;
91
148
  break;
@@ -111,53 +168,104 @@ function parsePositiveInt(s) {
111
168
  const n = Number(s);
112
169
  return Number.isFinite(n) && n > 0 ? n : undefined;
113
170
  }
171
+ function parseNonNegativeInt(s) {
172
+ if (!/^\d+$/.test(s))
173
+ return undefined;
174
+ const n = Number(s);
175
+ return Number.isFinite(n) && n >= 0 ? n : undefined;
176
+ }
114
177
  function renderEvent(e) {
115
178
  switch (e.type) {
116
179
  case "plan.start":
117
180
  return ` plan planning sub-queries for: ${ellipsize(e.question, 60)}`;
118
181
  case "plan.done":
119
182
  return ` plan ${e.plan.queries.length} sub-queries`;
183
+ case "round.start":
184
+ return ` round ${e.round === 0 ? "initial" : "deep " + e.round} · ${e.queries.length} quer${e.queries.length === 1 ? "y" : "ies"}`;
120
185
  case "search.start":
121
186
  return ` search ${e.query}`;
122
187
  case "search.done":
123
188
  return ` ${e.count} result${e.count === 1 ? "" : "s"}`;
124
189
  case "fetch.start":
125
- return ` fetch ${e.url}`;
190
+ return ` fetch ${e.cached ? "(cached) " : ""}${e.url}`;
126
191
  case "fetch.done":
127
- return ` ${e.ok ? "OK " : "!! "}${e.status} · ${e.words} words`;
192
+ return ` ${e.ok ? "OK " : "!! "}${e.status} · ${e.words} words${e.cached ? " · cache" : ""}`;
193
+ case "fetch.skipped":
194
+ return ` fetch skipped (${e.reason}) ${e.url}`;
128
195
  case "synthesize.start":
129
- return ` synth synthesizing from ${e.sourceCount} source${e.sourceCount === 1 ? "" : "s"}`;
196
+ return ` synth round ${e.round} · ${e.sourceCount} source${e.sourceCount === 1 ? "" : "s"}`;
130
197
  case "synthesize.done":
131
- return ` synth done`;
198
+ return ` synth round ${e.round} done`;
199
+ case "critique.start":
200
+ return ` critic reviewing round ${e.round}`;
201
+ case "critique.done":
202
+ return e.critique.done
203
+ ? ` critic answer complete (${e.critique.reasoning || "no reasoning given"})`
204
+ : ` critic ${e.critique.queries.length} follow-up quer${e.critique.queries.length === 1 ? "y" : "ies"}`;
132
205
  }
133
206
  }
134
207
  function ellipsize(s, max) {
135
208
  return s.length <= max ? s : s.slice(0, max - 1) + "…";
136
209
  }
210
+ // Exported for unit tests. User-facing error rendering at the CLI boundary.
211
+ // Runs the error message through scrubPath so the user's home directory can
212
+ // never end up in a bug report.
213
+ export function safeErrorMessage(err) {
214
+ const raw = err instanceof Error ? err.message : String(err ?? "unknown error");
215
+ return scrubPath(raw);
216
+ }
217
+ // Matches the escaping used by renderAnswerMarkdown for the H1 heading — keep
218
+ // the streaming header identical to the buffered one so users can diff them.
219
+ function escapeHeader(s) {
220
+ return s.replace(/[\r\n]+/g, " ").replace(/\[/g, "(").replace(/\]/g, ")");
221
+ }
137
222
  async function main(argv) {
138
223
  let parsed;
139
224
  try {
140
225
  parsed = parseArgs(argv);
141
226
  }
142
227
  catch (err) {
143
- process.stderr.write(`deepdive: ${err.message}\n\n${USAGE}`);
228
+ process.stderr.write(`deepdive: ${safeErrorMessage(err)}\n\n${USAGE}`);
144
229
  return 2;
145
230
  }
146
231
  if (parsed.help) {
147
232
  process.stdout.write(USAGE);
148
233
  return 0;
149
234
  }
235
+ if (parsed.question === "doctor") {
236
+ const config = resolveConfig(parsed.flags, process.env);
237
+ const useColor = process.stdout.isTTY && !process.env.NO_COLOR;
238
+ const report = await runDoctor({ config, env: process.env });
239
+ const out = config.jsonOutput
240
+ ? renderDoctorJson(report)
241
+ : renderDoctorText(report, { color: useColor }) + "\n";
242
+ process.stdout.write(out);
243
+ return exitCodeFor(report);
244
+ }
150
245
  if (!parsed.question) {
151
246
  process.stderr.write(`deepdive: missing question.\n\n${USAGE}`);
152
247
  return 2;
153
248
  }
154
249
  const config = resolveConfig(parsed.flags, process.env);
155
250
  const search = await resolveSearchAdapter(config.searchAdapter, process.env);
251
+ const cache = config.cache.enabled
252
+ ? createCache({ dir: config.cache.dir, ttlMs: config.cache.ttlMs })
253
+ : undefined;
156
254
  const ac = new AbortController();
157
255
  const sigint = () => ac.abort();
158
256
  process.on("SIGINT", sigint);
159
257
  process.on("SIGTERM", sigint);
258
+ // Live-streaming requires an attached TTY: escape sequences, partial line
259
+ // writes, and interactive buffering behave weirdly when stdout is a pipe.
260
+ // Env-var-only: tests can set FORCE_TTY=1 to exercise the streaming path
261
+ // without a real terminal.
262
+ const streaming = config.streamEnabled &&
263
+ (process.stdout.isTTY || process.env.DEEPDIVE_FORCE_STREAM === "1");
264
+ let streamed = false;
160
265
  try {
266
+ if (streaming) {
267
+ process.stdout.write(`# ${escapeHeader(parsed.question)}\n\n`);
268
+ }
161
269
  const result = await runAgent(parsed.question, {
162
270
  llm: config.llm,
163
271
  search,
@@ -165,23 +273,61 @@ async function main(argv) {
165
273
  resultsPerQuery: config.resultsPerQuery,
166
274
  maxSources: config.maxSources,
167
275
  maxWordsPerSource: config.maxWordsPerSource,
276
+ deepRounds: config.deepRounds,
277
+ concurrency: config.concurrency,
278
+ cache,
279
+ respectRobots: config.respectRobots,
168
280
  onEvent: (e) => {
169
281
  if (config.verbose)
170
282
  process.stderr.write(renderEvent(e) + "\n");
171
283
  },
284
+ onSynthesizeToken: streaming
285
+ ? (chunk) => {
286
+ streamed = true;
287
+ process.stdout.write(chunk);
288
+ }
289
+ : undefined,
172
290
  }, ac.signal);
173
- process.stdout.write(result.markdown);
174
- if (!result.markdown.endsWith("\n"))
175
- process.stdout.write("\n");
291
+ if (streaming && streamed) {
292
+ // Streaming mode already wrote the header + answer tokens. Close with
293
+ // the sources block and (if requested) write the full markdown to the
294
+ // output file too.
295
+ const tail = "\n\n" + renderSourcesMarkdown(result.sources);
296
+ process.stdout.write(tail);
297
+ if (!tail.endsWith("\n"))
298
+ process.stdout.write("\n");
299
+ if (parsed.outPath) {
300
+ const path = resolve(parsed.outPath);
301
+ writeFileSync(path, result.markdown, "utf-8");
302
+ process.stderr.write(`\nwrote ${path}\n`);
303
+ }
304
+ return 0;
305
+ }
306
+ const output = config.jsonOutput
307
+ ? JSON.stringify({
308
+ question: result.question,
309
+ plan: result.plan,
310
+ rounds: result.rounds,
311
+ sources: result.sources.map((s) => ({
312
+ id: s.id,
313
+ url: s.url,
314
+ title: s.title,
315
+ fetchedAt: s.fetchedAt,
316
+ })),
317
+ answer: result.answer,
318
+ usage: result.usage,
319
+ }, null, 2) + "\n"
320
+ : result.markdown + (result.markdown.endsWith("\n") ? "" : "\n");
321
+ process.stdout.write(output);
176
322
  if (parsed.outPath) {
177
323
  const path = resolve(parsed.outPath);
178
- writeFileSync(path, result.markdown, "utf-8");
324
+ writeFileSync(path, output, "utf-8");
179
325
  process.stderr.write(`\nwrote ${path}\n`);
180
326
  }
181
327
  return 0;
182
328
  }
183
329
  catch (err) {
184
- process.stderr.write(`deepdive: ${err.message}\n`);
330
+ process.stderr.write(`deepdive: ${safeErrorMessage(err)}\n`);
185
331
  return 1;
186
332
  }
187
333
  finally {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runConcurrent<T, R>(items: T[], concurrency: number, fn: (item: T, index: number) => Promise<R>, signal?: AbortSignal): Promise<R[]>;
2
+ //# sourceMappingURL=concurrency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concurrency.d.ts","sourceRoot":"","sources":["../src/concurrency.ts"],"names":[],"mappings":"AAMA,wBAAsB,aAAa,CAAC,CAAC,EAAE,CAAC,EACtC,KAAK,EAAE,CAAC,EAAE,EACV,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAC1C,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,CAAC,EAAE,CAAC,CA6Bd"}
@@ -0,0 +1,38 @@
1
+ // Minimal worker-pool concurrency helper. Runs `fn` across `items` with at
2
+ // most `concurrency` in flight at once. Preserves input order in the result
3
+ // array. Aborts early if `signal` fires, rejecting with the abort reason.
4
+ //
5
+ // Kept separate from agent.ts so it's reusable and trivially testable.
6
+ export async function runConcurrent(items, concurrency, fn, signal) {
7
+ if (concurrency < 1)
8
+ throw new Error(`concurrency must be >= 1 (got ${concurrency})`);
9
+ if (items.length === 0)
10
+ return [];
11
+ const results = new Array(items.length);
12
+ let next = 0;
13
+ let aborted = false;
14
+ const abortCheck = () => {
15
+ if (signal?.aborted)
16
+ aborted = true;
17
+ };
18
+ async function worker() {
19
+ while (true) {
20
+ abortCheck();
21
+ if (aborted)
22
+ return;
23
+ const i = next++;
24
+ if (i >= items.length)
25
+ return;
26
+ results[i] = await fn(items[i], i);
27
+ }
28
+ }
29
+ const workers = [];
30
+ const n = Math.min(concurrency, items.length);
31
+ for (let i = 0; i < n; i++)
32
+ workers.push(worker());
33
+ await Promise.all(workers);
34
+ if (aborted)
35
+ throw new Error("aborted");
36
+ return results;
37
+ }
38
+ //# sourceMappingURL=concurrency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concurrency.js","sourceRoot":"","sources":["../src/concurrency.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,4EAA4E;AAC5E,0EAA0E;AAC1E,EAAE;AACF,uEAAuE;AAEvE,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAU,EACV,WAAmB,EACnB,EAA0C,EAC1C,MAAoB;IAEpB,IAAI,WAAW,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,WAAW,GAAG,CAAC,CAAC;IACtF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,MAAM,OAAO,GAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IAAI,MAAM,EAAE,OAAO;YAAE,OAAO,GAAG,IAAI,CAAC;IACtC,CAAC,CAAC;IAEF,KAAK,UAAU,MAAM;QACnB,OAAO,IAAI,EAAE,CAAC;YACZ,UAAU,EAAE,CAAC;YACb,IAAI,OAAO;gBAAE,OAAO;YACpB,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM;gBAAE,OAAO;YAC9B,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACnD,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAE3B,IAAI,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IACxC,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/dist/config.d.ts CHANGED
@@ -7,6 +7,16 @@ export interface RuntimeConfig {
7
7
  resultsPerQuery: number;
8
8
  maxSources: number;
9
9
  maxWordsPerSource: number;
10
+ deepRounds: number;
11
+ concurrency: number;
12
+ cache: {
13
+ enabled: boolean;
14
+ dir: string;
15
+ ttlMs: number;
16
+ };
17
+ respectRobots: boolean;
18
+ jsonOutput: boolean;
19
+ streamEnabled: boolean;
10
20
  verbose: boolean;
11
21
  }
12
22
  export interface CLIFlags {
@@ -19,8 +29,18 @@ export interface CLIFlags {
19
29
  maxSources?: number;
20
30
  maxWordsPerSource?: number;
21
31
  timeoutMs?: number;
32
+ llmTimeoutMs?: number;
33
+ llmAttempts?: number;
34
+ deepRounds?: number;
35
+ concurrency?: number;
36
+ noCache?: boolean;
37
+ cacheTtlMs?: number;
38
+ ignoreRobots?: boolean;
39
+ json?: boolean;
40
+ noStream?: boolean;
22
41
  verbose?: boolean;
23
42
  }
24
43
  export declare function resolveConfig(flags: CLIFlags, env: Record<string, string | undefined>): RuntimeConfig;
25
44
  export declare function parsePositiveInt(s: string | undefined): number | undefined;
45
+ export declare function parseNonNegativeInt(s: string | undefined): number | undefined;
26
46
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,SAAS,CAAC;IACf,OAAO,EAAE,cAAc,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAeD,wBAAgB,aAAa,CAC3B,KAAK,EAAE,QAAQ,EACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACtC,aAAa,CA+Cf;AAGD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAO1E"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,SAAS,CAAC;IACf,OAAO,EAAE,cAAc,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAoBD,wBAAgB,aAAa,CAC3B,KAAK,EAAE,QAAQ,EACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACtC,aAAa,CAyGf;AAGD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAO1E;AAGD,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAO7E"}
package/dist/config.js CHANGED
@@ -1,6 +1,7 @@
1
1
  // Config resolution — merges CLI flags, env vars, and defaults.
2
- // No config file in v0.1.0: keep the surface small. Env vars are prefixed
3
- // DEEPDIVE_* to avoid collisions with other tools in the user's shell.
2
+ // Env vars are prefixed DEEPDIVE_* to avoid collisions in the user's shell.
3
+ import { homedir } from "node:os";
4
+ import { join } from "node:path";
4
5
  const DEFAULTS = {
5
6
  baseUrl: "http://localhost:3456",
6
7
  apiKey: "dario",
@@ -12,6 +13,11 @@ const DEFAULTS = {
12
13
  maxWordsPerSource: 2000,
13
14
  timeoutMs: 30000,
14
15
  maxBytesPerFetch: 2_000_000,
16
+ deepRounds: 0,
17
+ concurrency: 4,
18
+ cacheTtlMs: 60 * 60 * 1000, // 1 hour
19
+ llmTimeoutMs: 120_000, // 2 minutes per LLM call
20
+ llmAttempts: 3,
15
21
  };
16
22
  export function resolveConfig(flags, env) {
17
23
  const baseUrl = flags.baseUrl ?? env.DEEPDIVE_BASE_URL ?? DEFAULTS.baseUrl;
@@ -33,9 +39,46 @@ export function resolveConfig(flags, env) {
33
39
  const timeoutMs = flags.timeoutMs ??
34
40
  parsePositiveInt(env.DEEPDIVE_FETCH_TIMEOUT_MS) ??
35
41
  DEFAULTS.timeoutMs;
42
+ const llmTimeoutMs = flags.llmTimeoutMs ??
43
+ parsePositiveInt(env.DEEPDIVE_LLM_TIMEOUT_MS) ??
44
+ DEFAULTS.llmTimeoutMs;
45
+ const llmAttempts = flags.llmAttempts ??
46
+ parsePositiveInt(env.DEEPDIVE_LLM_ATTEMPTS) ??
47
+ DEFAULTS.llmAttempts;
48
+ const deepRounds = flags.deepRounds ??
49
+ parseNonNegativeInt(env.DEEPDIVE_DEEP_ROUNDS) ??
50
+ DEFAULTS.deepRounds;
51
+ const concurrency = flags.concurrency ??
52
+ parsePositiveInt(env.DEEPDIVE_CONCURRENCY) ??
53
+ DEFAULTS.concurrency;
54
+ const cacheEnabled = flags.noCache === true
55
+ ? false
56
+ : env.DEEPDIVE_NO_CACHE === "1"
57
+ ? false
58
+ : true;
59
+ const cacheDir = env.DEEPDIVE_CACHE_DIR ?? join(homedir(), ".deepdive", "cache");
60
+ const cacheTtlMs = flags.cacheTtlMs ??
61
+ parsePositiveInt(env.DEEPDIVE_CACHE_TTL_MS) ??
62
+ DEFAULTS.cacheTtlMs;
63
+ const respectRobots = !(flags.ignoreRobots ?? env.DEEPDIVE_IGNORE_ROBOTS === "1");
64
+ const jsonOutput = flags.json ?? env.DEEPDIVE_JSON === "1";
65
+ const streamOptOut = flags.noStream ?? env.DEEPDIVE_NO_STREAM === "1";
66
+ // Streaming is on by default but gets auto-disabled for:
67
+ // - JSON output (we buffer into the JSON envelope)
68
+ // - Deep mode (intermediate rounds would print multiple full drafts back-to-back)
69
+ // - Explicit --no-stream
70
+ // CLI can further require stdout.isTTY before enabling.
71
+ const streamEnabled = !streamOptOut && !jsonOutput && deepRounds === 0;
36
72
  const verbose = flags.verbose ?? env.DEEPDIVE_VERBOSE === "1";
37
73
  return {
38
- llm: { baseUrl, apiKey, model, maxTokens },
74
+ llm: {
75
+ baseUrl,
76
+ apiKey,
77
+ model,
78
+ maxTokens,
79
+ timeoutMs: llmTimeoutMs,
80
+ maxAttempts: llmAttempts,
81
+ },
39
82
  browser: {
40
83
  headless: env.DEEPDIVE_HEADED === "1" ? false : true,
41
84
  timeoutMs,
@@ -45,6 +88,12 @@ export function resolveConfig(flags, env) {
45
88
  resultsPerQuery,
46
89
  maxSources,
47
90
  maxWordsPerSource,
91
+ deepRounds,
92
+ concurrency,
93
+ cache: { enabled: cacheEnabled, dir: cacheDir, ttlMs: cacheTtlMs },
94
+ respectRobots,
95
+ jsonOutput,
96
+ streamEnabled,
48
97
  verbose,
49
98
  };
50
99
  }
@@ -60,4 +109,16 @@ export function parsePositiveInt(s) {
60
109
  return undefined;
61
110
  return n;
62
111
  }
112
+ // Exported for unit tests.
113
+ export function parseNonNegativeInt(s) {
114
+ if (!s)
115
+ return undefined;
116
+ const trimmed = s.trim();
117
+ if (!/^\d+$/.test(trimmed))
118
+ return undefined;
119
+ const n = Number(trimmed);
120
+ if (!Number.isFinite(n) || n < 0)
121
+ return undefined;
122
+ return n;
123
+ }
63
124
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,0EAA0E;AAC1E,uEAAuE;AA4BvE,MAAM,QAAQ,GAAG;IACf,OAAO,EAAE,uBAAuB;IAChC,MAAM,EAAE,OAAO;IACf,KAAK,EAAE,mBAAmB;IAC1B,SAAS,EAAE,IAAI;IACf,aAAa,EAAE,YAAY;IAC3B,eAAe,EAAE,CAAC;IAClB,UAAU,EAAE,EAAE;IACd,iBAAiB,EAAE,IAAI;IACvB,SAAS,EAAE,KAAK;IAChB,gBAAgB,EAAE,SAAS;CAC5B,CAAC;AAEF,MAAM,UAAU,aAAa,CAC3B,KAAe,EACf,GAAuC;IAEvC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,GAAG,CAAC,iBAAiB,IAAI,QAAQ,CAAC,OAAO,CAAC;IAC3E,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,gBAAgB,IAAI,QAAQ,CAAC,MAAM,CAAC;IACvE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC,cAAc,IAAI,QAAQ,CAAC,KAAK,CAAC;IAClE,MAAM,SAAS,GACb,KAAK,CAAC,SAAS;QACf,gBAAgB,CAAC,GAAG,CAAC,mBAAmB,CAAC;QACzC,QAAQ,CAAC,SAAS,CAAC;IAErB,MAAM,aAAa,GACjB,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,eAAe,IAAI,QAAQ,CAAC,aAAa,CAAC;IAEhE,MAAM,eAAe,GACnB,KAAK,CAAC,eAAe;QACrB,gBAAgB,CAAC,GAAG,CAAC,0BAA0B,CAAC;QAChD,QAAQ,CAAC,eAAe,CAAC;IAE3B,MAAM,UAAU,GACd,KAAK,CAAC,UAAU;QAChB,gBAAgB,CAAC,GAAG,CAAC,oBAAoB,CAAC;QAC1C,QAAQ,CAAC,UAAU,CAAC;IAEtB,MAAM,iBAAiB,GACrB,KAAK,CAAC,iBAAiB;QACvB,gBAAgB,CAAC,GAAG,CAAC,6BAA6B,CAAC;QACnD,QAAQ,CAAC,iBAAiB,CAAC;IAE7B,MAAM,SAAS,GACb,KAAK,CAAC,SAAS;QACf,gBAAgB,CAAC,GAAG,CAAC,yBAAyB,CAAC;QAC/C,QAAQ,CAAC,SAAS,CAAC;IAErB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,GAAG,CAAC,gBAAgB,KAAK,GAAG,CAAC;IAE9D,OAAO;QACL,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE;QAC1C,OAAO,EAAE;YACP,QAAQ,EAAE,GAAG,CAAC,eAAe,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;YACpD,SAAS;YACT,QAAQ,EAAE,QAAQ,CAAC,gBAAgB;SACpC;QACD,aAAa;QACb,eAAe;QACf,UAAU;QACV,iBAAiB;QACjB,OAAO;KACR,CAAC;AACJ,CAAC;AAED,2BAA2B;AAC3B,MAAM,UAAU,gBAAgB,CAAC,CAAqB;IACpD,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7C,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACpD,OAAO,CAAC,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { RuntimeConfig } from "./config.js";
2
+ export type CheckStatus = "ok" | "warn" | "fail" | "info";
3
+ export interface CheckResult {
4
+ id: string;
5
+ category: string;
6
+ status: CheckStatus;
7
+ label: string;
8
+ detail: string;
9
+ durationMs?: number;
10
+ }
11
+ export interface DoctorReport {
12
+ version: string;
13
+ generatedAt: number;
14
+ checks: CheckResult[];
15
+ summary: {
16
+ total: number;
17
+ ok: number;
18
+ warn: number;
19
+ fail: number;
20
+ info: number;
21
+ };
22
+ }
23
+ export interface DoctorOptions {
24
+ config: RuntimeConfig;
25
+ env: Record<string, string | undefined>;
26
+ skipLLM?: boolean;
27
+ skipSearch?: boolean;
28
+ skipBrowser?: boolean;
29
+ skipCache?: boolean;
30
+ fetchImpl?: typeof fetch;
31
+ now?: () => number;
32
+ }
33
+ export declare function runDoctor(opts: DoctorOptions): Promise<DoctorReport>;
34
+ export declare function renderDoctorText(report: DoctorReport, opts?: {
35
+ color?: boolean;
36
+ }): string;
37
+ export declare function renderDoctorJson(report: DoctorReport): string;
38
+ export declare function exitCodeFor(report: DoctorReport): number;
39
+ export declare function nodeMeetsMinimum(versionString: string): boolean;
40
+ export declare function formatBytes(n: number): string;
41
+ export declare function formatDuration(ms: number): string;
42
+ export declare function classifyFetchError(err: unknown): string;
43
+ export declare function scrubPath(s: string): string;
44
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKjD,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1D,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAClF;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,aAAa,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAqB1E;AAyTD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,CA+B7F;AAGD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAE7D;AAGD,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAExD;AAcD,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAI/D;AA+CD,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK7C;AAGD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CASjD;AAGD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAUvD;AAID,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ3C"}