@askalf/deepdive 0.6.0 → 0.8.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 (55) hide show
  1. package/README.md +78 -0
  2. package/dist/agent.d.ts +9 -1
  3. package/dist/agent.d.ts.map +1 -1
  4. package/dist/agent.js +109 -11
  5. package/dist/agent.js.map +1 -1
  6. package/dist/browser.d.ts +4 -0
  7. package/dist/browser.d.ts.map +1 -1
  8. package/dist/browser.js +54 -0
  9. package/dist/browser.js.map +1 -1
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +48 -1
  12. package/dist/cli.js.map +1 -1
  13. package/dist/config.d.ts +10 -0
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +23 -0
  16. package/dist/config.js.map +1 -1
  17. package/dist/doctor.d.ts.map +1 -1
  18. package/dist/doctor.js +41 -1
  19. package/dist/doctor.js.map +1 -1
  20. package/dist/domain-filter.d.ts +10 -0
  21. package/dist/domain-filter.d.ts.map +1 -0
  22. package/dist/domain-filter.js +71 -0
  23. package/dist/domain-filter.js.map +1 -0
  24. package/dist/index.d.ts +5 -1
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +5 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/llm-format.d.ts +81 -0
  29. package/dist/llm-format.d.ts.map +1 -0
  30. package/dist/llm-format.js +129 -0
  31. package/dist/llm-format.js.map +1 -0
  32. package/dist/llm-stream.d.ts.map +1 -1
  33. package/dist/llm-stream.js +19 -9
  34. package/dist/llm-stream.js.map +1 -1
  35. package/dist/llm.d.ts +2 -0
  36. package/dist/llm.d.ts.map +1 -1
  37. package/dist/llm.js +11 -8
  38. package/dist/llm.js.map +1 -1
  39. package/dist/local.d.ts +16 -0
  40. package/dist/local.d.ts.map +1 -0
  41. package/dist/local.js +160 -0
  42. package/dist/local.js.map +1 -0
  43. package/dist/pdf.d.ts +28 -0
  44. package/dist/pdf.d.ts.map +1 -0
  45. package/dist/pdf.js +195 -0
  46. package/dist/pdf.js.map +1 -0
  47. package/dist/plan.d.ts +5 -1
  48. package/dist/plan.d.ts.map +1 -1
  49. package/dist/plan.js +14 -1
  50. package/dist/plan.js.map +1 -1
  51. package/dist/pricing.d.ts +3 -0
  52. package/dist/pricing.d.ts.map +1 -1
  53. package/dist/pricing.js +20 -0
  54. package/dist/pricing.js.map +1 -1
  55. package/package.json +2 -1
@@ -0,0 +1,129 @@
1
+ // API format adapters — translate between the Anthropic Messages shape
2
+ // (deepdive's canonical wire format) and the OpenAI Chat Completions
3
+ // shape exposed by OpenAI itself, vLLM, Ollama, LiteLLM in OpenAI mode,
4
+ // and many other tools.
5
+ //
6
+ // deepdive's pipeline is built around the Anthropic shape because that's
7
+ // dario's native protocol. To talk to an OpenAI-compat endpoint we
8
+ // re-wrap the request before sending and re-shape the response on the
9
+ // way back. Streaming gets the same treatment via parseSSE adapters.
10
+ //
11
+ // This module is pure: no network. Tested in isolation.
12
+ // Auto-detect from base URL. Honors known patterns; defaults to anthropic.
13
+ // Exported for unit tests.
14
+ //
15
+ // We parse the URL properly and inspect the hostname / port rather than
16
+ // substring-matching the raw string. CodeQL flagged the substring form
17
+ // as an incomplete-URL-sanitization risk: a string like
18
+ // "http://evil.example/?api.openai.com" would have matched.
19
+ export function detectApiFormat(baseUrl) {
20
+ let host;
21
+ let port;
22
+ try {
23
+ const u = new URL(baseUrl);
24
+ host = u.hostname.toLowerCase();
25
+ port = u.port;
26
+ }
27
+ catch {
28
+ return "anthropic";
29
+ }
30
+ // OpenAI's official API — exact host or any subdomain of openai.com.
31
+ if (host === "api.openai.com" || host.endsWith(".openai.com")) {
32
+ return "openai";
33
+ }
34
+ // Ollama default — exposes OpenAI-compat at /v1.
35
+ if (port === "11434")
36
+ return "openai";
37
+ // Common vLLM port.
38
+ if (port === "8000")
39
+ return "openai";
40
+ // LiteLLM proxies — convention is :4000 in their docs but it's not
41
+ // dispositive. Default to anthropic to avoid false positives; users
42
+ // can pass --api-format=openai explicitly.
43
+ return "anthropic";
44
+ }
45
+ // Translate an Anthropic Messages request body into an OpenAI Chat
46
+ // Completions request body. The system prompt becomes the first message
47
+ // with role=system. Empty system prompts are dropped.
48
+ export function toOpenAIRequest(body) {
49
+ const messages = [];
50
+ if (body.system && body.system.trim().length > 0) {
51
+ messages.push({ role: "system", content: body.system });
52
+ }
53
+ for (const m of body.messages) {
54
+ messages.push({ role: m.role, content: m.content });
55
+ }
56
+ const out = {
57
+ model: body.model,
58
+ max_tokens: body.max_tokens,
59
+ messages,
60
+ };
61
+ if (body.stream)
62
+ out.stream = true;
63
+ return out;
64
+ }
65
+ // Translate an OpenAI Chat Completions response into the Anthropic
66
+ // shape deepdive uses internally (just `content[].text` and `usage`).
67
+ export function fromOpenAIResponse(json) {
68
+ const text = (json.choices ?? [])
69
+ .map((c) => c.message?.content ?? c.delta?.content ?? "")
70
+ .join("");
71
+ const u = json.usage ?? {};
72
+ const input = u.prompt_tokens ?? u.input_tokens ?? 0;
73
+ const output = u.completion_tokens ?? u.output_tokens ?? 0;
74
+ return {
75
+ content: [{ type: "text", text }],
76
+ usage: { input_tokens: input, output_tokens: output },
77
+ };
78
+ }
79
+ // Headers required to authenticate against each format. For OpenAI: a
80
+ // Bearer token. For Anthropic: an x-api-key + version pin.
81
+ export function authHeadersFor(format, apiKey) {
82
+ if (format === "openai") {
83
+ return {
84
+ "content-type": "application/json",
85
+ authorization: `Bearer ${apiKey}`,
86
+ };
87
+ }
88
+ return {
89
+ "content-type": "application/json",
90
+ "anthropic-version": "2023-06-01",
91
+ "x-api-key": apiKey,
92
+ };
93
+ }
94
+ // The HTTP path each format expects. Both are stable industry conventions.
95
+ export function pathFor(format) {
96
+ return format === "openai" ? "/v1/chat/completions" : "/v1/messages";
97
+ }
98
+ // Translate one streaming-event JSON payload from OpenAI's SSE shape
99
+ // into the Anthropic SSE event shape that callLLMStream's parser
100
+ // already understands. Only `choices[].delta.content` and final `usage`
101
+ // are translated; everything else passes through as a no-op event.
102
+ //
103
+ // The Anthropic stream uses these event types:
104
+ // - message_start { message: { usage } }
105
+ // - content_block_delta { delta: { type: "text_delta", text } }
106
+ // - message_delta { usage: { input_tokens, output_tokens } }
107
+ export function openaiSSEToAnthropic(json) {
108
+ if (typeof json !== "object" || json === null)
109
+ return null;
110
+ const choice = (json.choices ?? [])[0];
111
+ const text = choice?.delta?.content;
112
+ if (typeof text === "string" && text.length > 0) {
113
+ return {
114
+ type: "content_block_delta",
115
+ delta: { type: "text_delta", text },
116
+ };
117
+ }
118
+ if (json.usage) {
119
+ return {
120
+ type: "message_delta",
121
+ usage: {
122
+ input_tokens: json.usage.prompt_tokens ?? json.usage.input_tokens ?? 0,
123
+ output_tokens: json.usage.completion_tokens ?? json.usage.output_tokens ?? 0,
124
+ },
125
+ };
126
+ }
127
+ return null;
128
+ }
129
+ //# sourceMappingURL=llm-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-format.js","sourceRoot":"","sources":["../src/llm-format.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"llm-stream.d.ts","sourceRoot":"","sources":["../src/llm-stream.ts"],"names":[],"mappings":"AASA,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,UAAU,CAAC;AAElB,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,UAAU,EAAE,EACtB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,IAAI,GAAE,aAAkB,EACxB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,SAAS,CAAC,CAiFpB;AAED,UAAU,QAAQ;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE;YAAE,YAAY,CAAC,EAAE,MAAM,CAAC;YAAC,aAAa,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IACxE,KAAK,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAGD,wBAAuB,QAAQ,CAC7B,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,EAClC,MAAM,CAAC,EAAE,WAAW,GACnB,cAAc,CAAC,QAAQ,CAAC,CA8B1B;AAaD,wBAAiB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAmB/D"}
1
+ {"version":3,"file":"llm-stream.d.ts","sourceRoot":"","sources":["../src/llm-stream.ts"],"names":[],"mappings":"AASA,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,UAAU,CAAC;AASlB,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,UAAU,EAAE,EACtB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,IAAI,GAAE,aAAkB,EACxB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,SAAS,CAAC,CA4FpB;AAED,UAAU,QAAQ;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE;YAAE,YAAY,CAAC,EAAE,MAAM,CAAC;YAAC,aAAa,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IACxE,KAAK,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAGD,wBAAuB,QAAQ,CAC7B,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,EAClC,MAAM,CAAC,EAAE,WAAW,GACnB,cAAc,CAAC,QAAQ,CAAC,CA8B1B;AAaD,wBAAiB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAmB/D"}
@@ -7,15 +7,29 @@
7
7
  import { trimTrailingSlashes } from "./url-util.js";
8
8
  import { retry } from "./retry.js";
9
9
  import { LLMError, DEFAULT_LLM_TIMEOUT_MS, DEFAULT_LLM_ATTEMPTS, } from "./llm.js";
10
+ import { authHeadersFor, detectApiFormat, openaiSSEToAnthropic, pathFor, toOpenAIRequest, } from "./llm-format.js";
10
11
  export async function callLLMStream(messages, system, config, opts = {}, signal) {
11
- const url = `${trimTrailingSlashes(config.baseUrl)}/v1/messages`;
12
- const body = {
12
+ const format = config.apiFormat ?? detectApiFormat(config.baseUrl);
13
+ const url = `${trimTrailingSlashes(config.baseUrl)}${pathFor(format)}`;
14
+ const anthropicBody = {
13
15
  model: config.model,
14
16
  max_tokens: config.maxTokens,
15
17
  system,
16
18
  messages,
17
19
  stream: true,
18
20
  };
21
+ const body = format === "openai" ? toOpenAIRequest(anthropicBody) : anthropicBody;
22
+ // OpenAI's streaming endpoint requires `stream_options.include_usage`
23
+ // to report token counts in the final SSE event.
24
+ if (format === "openai") {
25
+ body.stream_options = {
26
+ include_usage: true,
27
+ };
28
+ }
29
+ const headers = {
30
+ ...authHeadersFor(format, config.apiKey),
31
+ accept: "text/event-stream",
32
+ };
19
33
  const timeoutMs = config.timeoutMs ?? DEFAULT_LLM_TIMEOUT_MS;
20
34
  const attempts = Math.max(1, config.maxAttempts ?? DEFAULT_LLM_ATTEMPTS);
21
35
  // Retry wraps the initial connect only. Once we start emitting tokens
@@ -25,12 +39,7 @@ export async function callLLMStream(messages, system, config, opts = {}, signal)
25
39
  const combined = makeTimeoutSignal(timeoutMs, signal);
26
40
  const r = await fetch(url, {
27
41
  method: "POST",
28
- headers: {
29
- "content-type": "application/json",
30
- "anthropic-version": "2023-06-01",
31
- "x-api-key": config.apiKey,
32
- accept: "text/event-stream",
33
- },
42
+ headers,
34
43
  body: JSON.stringify(body),
35
44
  signal: combined,
36
45
  });
@@ -58,7 +67,8 @@ export async function callLLMStream(messages, system, config, opts = {}, signal)
58
67
  }
59
68
  let text = "";
60
69
  let usage;
61
- for await (const event of parseSSE(res.body, signal)) {
70
+ for await (const raw of parseSSE(res.body, signal)) {
71
+ const event = format === "openai" ? openaiSSEToAnthropic(raw) ?? raw : raw;
62
72
  const type = event.type;
63
73
  if (type === "content_block_delta" && event.delta?.type === "text_delta") {
64
74
  const chunk = event.delta.text ?? "";
@@ -1 +1 @@
1
- {"version":3,"file":"llm-stream.js","sourceRoot":"","sources":["../src/llm-stream.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"llm-stream.js","sourceRoot":"","sources":["../src/llm-stream.ts"],"names":[],"mappings":"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"}
package/dist/llm.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { type ApiFormat } from "./llm-format.js";
1
2
  export interface LLMConfig {
2
3
  baseUrl: string;
3
4
  apiKey: string;
@@ -5,6 +6,7 @@ export interface LLMConfig {
5
6
  maxTokens: number;
6
7
  timeoutMs?: number;
7
8
  maxAttempts?: number;
9
+ apiFormat?: ApiFormat;
8
10
  }
9
11
  export interface LLMMessage {
10
12
  role: "user" | "assistant";
package/dist/llm.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;CACzD;AAED,qBAAa,QAAS,SAAQ,KAAK;aAEf,MAAM,EAAE,MAAM;aAEd,MAAM,EAAE,MAAM;gBAFd,MAAM,EAAE,MAAM,EAC9B,OAAO,EAAE,MAAM,EACC,MAAM,GAAE,MAAW;IAKrC,IAAI,SAAS,IAAI,OAAO,CAEvB;CACF;AAED,eAAO,MAAM,sBAAsB,SAAU,CAAC;AAC9C,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,UAAU,EAAE,EACtB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,SAAS,CAAC,CAoEpB"}
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"AAaA,OAAO,EAML,KAAK,SAAS,EAEf,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IAIrB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;CACzD;AAED,qBAAa,QAAS,SAAQ,KAAK;aAEf,MAAM,EAAE,MAAM;aAEd,MAAM,EAAE,MAAM;gBAFd,MAAM,EAAE,MAAM,EAC9B,OAAO,EAAE,MAAM,EACC,MAAM,GAAE,MAAW;IAKrC,IAAI,SAAS,IAAI,OAAO,CAEvB;CACF;AAED,eAAO,MAAM,sBAAsB,SAAU,CAAC;AAC9C,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,UAAU,EAAE,EACtB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,SAAS,CAAC,CAwEpB"}
package/dist/llm.js CHANGED
@@ -10,6 +10,7 @@
10
10
  // indicate malformed requests, not transient failures.
11
11
  import { trimTrailingSlashes } from "./url-util.js";
12
12
  import { retry } from "./retry.js";
13
+ import { authHeadersFor, detectApiFormat, fromOpenAIResponse, pathFor, toOpenAIRequest, } from "./llm-format.js";
13
14
  export class LLMError extends Error {
14
15
  status;
15
16
  detail;
@@ -26,13 +27,16 @@ export class LLMError extends Error {
26
27
  export const DEFAULT_LLM_TIMEOUT_MS = 120_000;
27
28
  export const DEFAULT_LLM_ATTEMPTS = 3;
28
29
  export async function callLLM(messages, system, config, signal) {
29
- const url = `${trimTrailingSlashes(config.baseUrl)}/v1/messages`;
30
- const body = {
30
+ const format = config.apiFormat ?? detectApiFormat(config.baseUrl);
31
+ const url = `${trimTrailingSlashes(config.baseUrl)}${pathFor(format)}`;
32
+ const anthropicBody = {
31
33
  model: config.model,
32
34
  max_tokens: config.maxTokens,
33
35
  system,
34
36
  messages,
35
37
  };
38
+ const body = format === "openai" ? toOpenAIRequest(anthropicBody) : anthropicBody;
39
+ const headers = authHeadersFor(format, config.apiKey);
36
40
  const timeoutMs = config.timeoutMs ?? DEFAULT_LLM_TIMEOUT_MS;
37
41
  const attempts = Math.max(1, config.maxAttempts ?? DEFAULT_LLM_ATTEMPTS);
38
42
  return retry(async () => {
@@ -41,11 +45,7 @@ export async function callLLM(messages, system, config, signal) {
41
45
  try {
42
46
  res = await fetch(url, {
43
47
  method: "POST",
44
- headers: {
45
- "content-type": "application/json",
46
- "anthropic-version": "2023-06-01",
47
- "x-api-key": config.apiKey,
48
- },
48
+ headers,
49
49
  body: JSON.stringify(body),
50
50
  signal: combined,
51
51
  });
@@ -58,7 +58,10 @@ export async function callLLM(messages, system, config, signal) {
58
58
  const detail = await safeReadText(res);
59
59
  throw new LLMError(res.status, `LLM ${res.status} ${res.statusText}: ${clip(detail, 500)}`, detail);
60
60
  }
61
- const json = (await res.json());
61
+ const raw = await res.json();
62
+ const json = format === "openai"
63
+ ? fromOpenAIResponse(raw)
64
+ : raw;
62
65
  const text = json.content
63
66
  .filter((b) => b.type === "text" && typeof b.text === "string")
64
67
  .map((b) => b.text)
package/dist/llm.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"llm.js","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { SourceWithContent } from "./synthesize.js";
2
+ export interface LocalIngestOptions {
3
+ pdfMaxPages?: number;
4
+ maxWordsPerSource: number;
5
+ }
6
+ export interface LocalIngestResult {
7
+ sources: Omit<SourceWithContent, "id">[];
8
+ skipped: {
9
+ path: string;
10
+ reason: string;
11
+ }[];
12
+ }
13
+ export declare function ingestLocalPaths(inputs: string[], opts: LocalIngestOptions): Promise<LocalIngestResult>;
14
+ export declare function expandPaths(inputs: string[]): Promise<string[]>;
15
+ export declare function stripTags(html: string): string;
16
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../src/local.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,WAAW,kBAAkB;IAEjC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,EAAE,CAAC;IAGzC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7C;AASD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EAAE,EAChB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,iBAAiB,CAAC,CA6B5B;AA4BD,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAwCrE;AAMD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkB9C"}
package/dist/local.js ADDED
@@ -0,0 +1,160 @@
1
+ // Local file source ingestion — `--include=<path>` injects files and
2
+ // directories as pre-fetched sources alongside whatever the search /
3
+ // browser pipeline finds on the web.
4
+ //
5
+ // Supports:
6
+ // .pdf — extracted via src/pdf.ts (requires pdfjs-dist)
7
+ // .md, .txt — read as plain text
8
+ // .html, .htm — stripped of tags, then treated as text
9
+ //
10
+ // A local source's URL is the canonical `file://` URI for its absolute
11
+ // path; the synthesizer treats them like any other source and the
12
+ // citation footer renders a clickable file:// link.
13
+ import { promises as fs } from "node:fs";
14
+ import { resolve, basename, extname, sep } from "node:path";
15
+ import { pathToFileURL } from "node:url";
16
+ import { extractPdfText, PdfExtractorMissingError, } from "./pdf.js";
17
+ const TEXT_EXTS = new Set([".md", ".markdown", ".txt", ".text"]);
18
+ const HTML_EXTS = new Set([".html", ".htm"]);
19
+ const PDF_EXTS = new Set([".pdf"]);
20
+ // Public entry point. Walks every input path (file or directory), collects
21
+ // supported files, and extracts content. Errors on a single file are
22
+ // recorded in `skipped`; the rest of the batch still ingests.
23
+ export async function ingestLocalPaths(inputs, opts) {
24
+ const sources = [];
25
+ const skipped = [];
26
+ const files = await expandPaths(inputs);
27
+ for (const abs of files) {
28
+ const ext = extname(abs).toLowerCase();
29
+ try {
30
+ const content = await readAndExtract(abs, ext, opts);
31
+ if (content === null) {
32
+ skipped.push({ path: abs, reason: `unsupported extension: ${ext}` });
33
+ continue;
34
+ }
35
+ sources.push({
36
+ url: pathToFileURL(abs).href,
37
+ title: basename(abs),
38
+ fetchedAt: Date.now(),
39
+ content: clampWords(content, opts.maxWordsPerSource),
40
+ });
41
+ }
42
+ catch (err) {
43
+ const reason = err instanceof PdfExtractorMissingError
44
+ ? "pdfjs-dist not installed"
45
+ : err.message ?? "extraction failed";
46
+ skipped.push({ path: abs, reason });
47
+ }
48
+ }
49
+ return { sources, skipped };
50
+ }
51
+ async function readAndExtract(abs, ext, opts) {
52
+ if (TEXT_EXTS.has(ext)) {
53
+ return await fs.readFile(abs, "utf-8");
54
+ }
55
+ if (HTML_EXTS.has(ext)) {
56
+ const html = await fs.readFile(abs, "utf-8");
57
+ return stripTags(html);
58
+ }
59
+ if (PDF_EXTS.has(ext)) {
60
+ const buf = await fs.readFile(abs);
61
+ const pdfOpts = { maxPages: opts.pdfMaxPages };
62
+ const result = await extractPdfText(new Uint8Array(buf), pdfOpts);
63
+ return result.text;
64
+ }
65
+ return null;
66
+ }
67
+ // Walks a list of files / dirs / globs into an ordered list of absolute
68
+ // file paths. Directories are walked one level deep by default — recursing
69
+ // into arbitrary trees is opt-in to avoid surprising users with a
70
+ // thousand-file ingestion when they pointed at their home directory.
71
+ // Exported for unit tests.
72
+ export async function expandPaths(inputs) {
73
+ const out = [];
74
+ const seen = new Set();
75
+ for (const raw of inputs) {
76
+ const abs = resolve(raw);
77
+ let stat;
78
+ try {
79
+ stat = await fs.stat(abs);
80
+ }
81
+ catch {
82
+ continue; // Missing path — skip silently; caller handles via no-results.
83
+ }
84
+ if (stat.isFile()) {
85
+ if (!seen.has(abs)) {
86
+ seen.add(abs);
87
+ out.push(abs);
88
+ }
89
+ continue;
90
+ }
91
+ if (stat.isDirectory()) {
92
+ const entries = await fs.readdir(abs, { withFileTypes: true });
93
+ for (const e of entries) {
94
+ if (!e.isFile())
95
+ continue;
96
+ const ext = extname(e.name).toLowerCase();
97
+ if (!TEXT_EXTS.has(ext) &&
98
+ !HTML_EXTS.has(ext) &&
99
+ !PDF_EXTS.has(ext)) {
100
+ continue;
101
+ }
102
+ const full = abs + sep + e.name;
103
+ if (!seen.has(full)) {
104
+ seen.add(full);
105
+ out.push(full);
106
+ }
107
+ }
108
+ }
109
+ }
110
+ return out;
111
+ }
112
+ // Exported for unit tests. Minimal HTML→text — drops <script>/<style>
113
+ // and tags, decodes a small set of entities. The browser's text
114
+ // extraction is far better; this is for offline files only (not for
115
+ // sanitizing untrusted input).
116
+ export function stripTags(html) {
117
+ return html
118
+ // Lazy match with `\b[^>]*>` to tolerate whitespace, attributes, or
119
+ // other junk between the tag name and the closing `>` — browsers
120
+ // accept </script foo>, </script\t\n bar>, </style xx>, etc., so a
121
+ // strict </script\s*> check would let those slip through. Bounded
122
+ // ([^>]* with no nested quantifier) so no polynomial-backtracking
123
+ // risk. Scope is offline-trusted input — not a security sanitizer.
124
+ .replace(/<script\b[\s\S]*?<\/script\b[^>]*>/gi, " ")
125
+ .replace(/<style\b[\s\S]*?<\/style\b[^>]*>/gi, " ")
126
+ .replace(/<!--[\s\S]*?-->/g, " ")
127
+ .replace(/<[^>]+>/g, " ")
128
+ // Single-pass entity decode. Sequential .replace() calls would
129
+ // double-unescape "&amp;lt;" to "<"; one pass over the original
130
+ // string preserves the literal that the author wrote.
131
+ .replace(/&(?:amp|lt|gt|quot|nbsp|#39);/gi, decodeEntity)
132
+ .replace(/\s+/g, " ")
133
+ .trim();
134
+ }
135
+ function decodeEntity(match) {
136
+ switch (match.toLowerCase()) {
137
+ case "&amp;":
138
+ return "&";
139
+ case "&lt;":
140
+ return "<";
141
+ case "&gt;":
142
+ return ">";
143
+ case "&quot;":
144
+ return '"';
145
+ case "&nbsp;":
146
+ return " ";
147
+ case "&#39;":
148
+ return "'";
149
+ default:
150
+ return match;
151
+ }
152
+ }
153
+ // Word-cap, mirrors what extract.ts does for web sources.
154
+ function clampWords(text, maxWords) {
155
+ const words = text.split(/\s+/).filter(Boolean);
156
+ if (words.length <= maxWords)
157
+ return text.trim();
158
+ return words.slice(0, maxWords).join(" ") + " …";
159
+ }
160
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../src/local.ts"],"names":[],"mappings":"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"}
package/dist/pdf.d.ts ADDED
@@ -0,0 +1,28 @@
1
+ export interface PdfExtractOptions {
2
+ maxPages?: number;
3
+ }
4
+ export interface PdfExtractResult {
5
+ text: string;
6
+ pageCount: number;
7
+ parsedPages: number;
8
+ truncated: boolean;
9
+ }
10
+ export declare class PdfExtractorMissingError extends Error {
11
+ constructor();
12
+ }
13
+ export declare function isPdfExtractorAvailable(): Promise<boolean>;
14
+ export declare function _resetPdfjsCache(): void;
15
+ export declare function extractPdfText(bytes: Uint8Array, opts?: PdfExtractOptions): Promise<PdfExtractResult>;
16
+ interface PdfTextItem {
17
+ str?: string;
18
+ hasEOL?: boolean;
19
+ }
20
+ export declare function joinTextItems(items: PdfTextItem[]): string;
21
+ export declare function dedupeRunningHeadersFooters(pages: string[]): string[];
22
+ export declare function looksLikePdf(args: {
23
+ url?: string;
24
+ finalUrl?: string;
25
+ contentType?: string;
26
+ }): boolean;
27
+ export {};
28
+ //# sourceMappingURL=pdf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../src/pdf.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,iBAAiB;IAGhC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,wBAAyB,SAAQ,KAAK;;CAOlD;AAwBD,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC,CAEhE;AAGD,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,UAAU,EACjB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CA+D3B;AAUD,UAAU,WAAW;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAKD,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAc1D;AAKD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAyBrE;AAgCD,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CASV"}