@askalf/deepdive
Advanced tools
@@ -24,5 +24,5 @@ import { type LLMConfig, type LLMMessage, type LLMResult } from "./llm.js"; | ||
| } | ||
| export declare function parseSSE(stream: ReadableStream<Uint8Array>, signal?: AbortSignal): AsyncGenerator<SSEEvent>; | ||
| export declare function parseSSE(stream: ReadableStream<Uint8Array>, signal?: AbortSignal, idleMs?: number): AsyncGenerator<SSEEvent>; | ||
| export declare function parseBlocks(block: string): Generator<SSEEvent>; | ||
| export {}; | ||
| //# sourceMappingURL=llm-stream.d.ts.map |
@@ -1,1 +0,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"} | ||
| {"version":3,"file":"llm-stream.d.ts","sourceRoot":"","sources":["../src/llm-stream.ts"],"names":[],"mappings":"AAUA,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,CAiGpB;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;AAKD,wBAAuB,QAAQ,CAC7B,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,EAClC,MAAM,CAAC,EAAE,WAAW,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,cAAc,CAAC,QAAQ,CAAC,CA8B1B;AA8CD,wBAAiB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAmB/D"} |
+46
-9
@@ -5,4 +5,5 @@ // Streaming Anthropic Messages client. | ||
| // instead of making the user stare at a blank terminal for 30+ seconds on a | ||
| // deep query. Retry applies to the initial connect only — mid-stream | ||
| // failures propagate because we've already emitted bytes to the caller. | ||
| // deep query. Retry wraps the initial connect only; once the stream flows a | ||
| // failure surfaces to the caller. The stream is bounded by an idle-token | ||
| // deadline so a stalled response fails fast instead of hanging. | ||
| import { trimTrailingSlashes } from "./url-util.js"; | ||
@@ -36,5 +37,6 @@ import { retry } from "./retry.js"; | ||
| const attempts = Math.max(1, config.maxAttempts ?? DEFAULT_LLM_ATTEMPTS); | ||
| // Retry wraps the initial connect only. Once we start emitting tokens | ||
| // through onToken, a mid-stream failure can't be undone, so we let it | ||
| // surface to the caller instead of silently retrying. | ||
| // Retry wraps the initial connect only. Once the stream is flowing we don't | ||
| // retry: a mid-stream failure on this synthesis is (empirically, #104) a | ||
| // persistent upstream stall, so re-issuing the request just burns the same | ||
| // wall-clock again; the idle-token deadline below fails it fast instead. | ||
| const res = await retry(async () => { | ||
@@ -72,3 +74,7 @@ const combined = makeTimeoutSignal(timeoutMs, signal); | ||
| let usage; | ||
| for await (const raw of parseSSE(res.body, signal)) { | ||
| // Bound the stream by an idle-token deadline (#104). A healthy long | ||
| // generation never idles between tokens, so it streams to completion even | ||
| // past `timeoutMs`; a genuine stall (no token for `timeoutMs`) aborts here | ||
| // instead of hanging until the global --max-runtime (or forever, if unset). | ||
| for await (const raw of parseSSE(res.body, signal, timeoutMs)) { | ||
| const event = format === "openai" ? openaiSSEToAnthropic(raw) ?? raw : raw; | ||
@@ -97,4 +103,6 @@ const type = event.type; | ||
| } | ||
| // Exported for unit tests. | ||
| export async function* parseSSE(stream, signal) { | ||
| // Exported for unit tests. `idleMs`, when set, bounds the gap between chunks: | ||
| // if no data arrives for that long the underlying stream is cancelled and the | ||
| // generator throws a TimeoutError, so a stalled response can't hang forever. | ||
| export async function* parseSSE(stream, signal, idleMs) { | ||
| const reader = stream.getReader(); | ||
@@ -107,3 +115,3 @@ const decoder = new TextDecoder(); | ||
| throw new Error("aborted"); | ||
| const { done, value } = await reader.read(); | ||
| const { done, value } = await readChunk(reader, idleMs); | ||
| if (done) { | ||
@@ -137,2 +145,31 @@ // Flush any trailing event without blank-line terminator. | ||
| } | ||
| // Race a single read against an idle deadline. On timeout, cancel the stream | ||
| // so the pending read settles (a locked reader with a pending read can't | ||
| // releaseLock cleanly) and surface a TimeoutError to the generator. | ||
| async function readChunk(reader, idleMs) { | ||
| if (!idleMs) | ||
| return reader.read(); | ||
| const read = reader.read(); | ||
| let timer; | ||
| const idle = new Promise((_, reject) => { | ||
| // NOT unref'd: while a stream is in flight this timer represents real | ||
| // pending work (we want the loop kept alive to await the next token). It | ||
| // is always cleared on a chunk or fires within idleMs, so it never holds | ||
| // the process open beyond the read it guards. | ||
| timer = setTimeout(() => reject(new DOMException(`stream idle for ${idleMs}ms`, "TimeoutError")), idleMs); | ||
| }); | ||
| try { | ||
| return await Promise.race([read, idle]); | ||
| } | ||
| catch (err) { | ||
| // Cancel so the still-pending read settles — a never-closing stream would | ||
| // otherwise leave a dangling promise — then surface the timeout. | ||
| await reader.cancel(err).catch(() => undefined); | ||
| await read.catch(() => undefined); | ||
| throw err; | ||
| } | ||
| finally { | ||
| clearTimeout(timer); | ||
| } | ||
| } | ||
| function indexOfBlankLine(s, from) { | ||
@@ -139,0 +176,0 @@ const a = s.indexOf("\n\n", from); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"llm-stream.js","sourceRoot":"","sources":["../src/llm-stream.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"llm-stream.js","sourceRoot":"","sources":["../src/llm-stream.ts"],"names":[],"mappings":"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"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"synthesize.d.ts","sourceRoot":"","sources":["../src/synthesize.ts"],"names":[],"mappings":"AAOA,OAAO,EAAW,KAAK,SAAS,EAAkB,MAAM,UAAU,CAAC;AAEnE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,WAAW,iBAAkB,SAAQ,MAAM;IAC/C,OAAO,EAAE,MAAM,CAAC;CACjB;AAsBD,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,SAAS,CAAC;IAEpB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,iBAAiB,EAAE,EAC5B,MAAM,EAAE,SAAS,EACjB,MAAM,CAAC,EAAE,WAAW,EACpB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAoBjB;AAID,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAWtE"} | ||
| {"version":3,"file":"synthesize.d.ts","sourceRoot":"","sources":["../src/synthesize.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,WAAW,iBAAkB,SAAQ,MAAM;IAC/C,OAAO,EAAE,MAAM,CAAC;CACjB;AAsBD,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,SAAS,CAAC;IAEpB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,iBAAiB,EAAE,EAC5B,MAAM,EAAE,SAAS,EACjB,MAAM,CAAC,EAAE,WAAW,EACpB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAID,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAWtE"} |
+12
-10
@@ -5,5 +5,5 @@ // Final answer synthesis — takes the original question and the collected | ||
| // | ||
| // When `onToken` is provided, uses the streaming variant so tokens land in | ||
| // front of the user as the model writes them instead of after a 30+s wait. | ||
| import { callLLM } from "./llm.js"; | ||
| // Synthesis always streams (see the call site). When `onToken` is provided | ||
| // (interactive TTY), tokens land in front of the user as the model writes | ||
| // them; otherwise the stream is accumulated and returned in one shot. | ||
| import { callLLMStream } from "./llm-stream.js"; | ||
@@ -39,9 +39,11 @@ const SYNTH_SYSTEM = `You are a careful research assistant. You will be given: | ||
| const messages = [{ role: "user", content: userMessage }]; | ||
| let result; | ||
| if (onToken) { | ||
| result = await callLLMStream(messages, system, config, { onToken }, signal); | ||
| } | ||
| else { | ||
| result = await callLLM(messages, system, config, signal); | ||
| } | ||
| // Always stream the synthesis (#104). A large, table-heavy answer can take | ||
| // 100-150s to generate; the non-streaming client's whole-call timeout | ||
| // (DEFAULT_LLM_TIMEOUT_MS, 120s) intermittently fired mid-generation and | ||
| // burned three full retries (~360s) before failing. The streaming client | ||
| // bounds only the connect by that timeout and the generation by an | ||
| // idle-token deadline, so a long-but-healthy stream finishes in one pass | ||
| // while a genuine stall still fails fast. `onToken` is undefined in | ||
| // non-TTY / --json mode — callLLMStream then just accumulates and returns. | ||
| const result = await callLLMStream(messages, system, config, { onToken }, signal); | ||
| if (result.usage && onUsage) | ||
@@ -48,0 +50,0 @@ onUsage(result.usage); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"synthesize.js","sourceRoot":"","sources":["../src/synthesize.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,wEAAwE;AACxE,2EAA2E;AAC3E,EAAE;AACF,2EAA2E;AAC3E,2EAA2E;AAE3E,OAAO,EAAE,OAAO,EAAkC,MAAM,UAAU,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAQhD,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;6IAewH,CAAC;AAE9I,4EAA4E;AAC5E,MAAM,SAAS,GAAG,sNAAsN,CAAC;AASzO,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAAgB,EAChB,OAA4B,EAC5B,MAAiB,EACjB,MAAoB,EACpB,OAA0B,EAAE;IAE5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,+DAA+D,CAAC;IACzE,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;IAC9D,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,WAAW,GACf,aAAa,QAAQ,MAAM;QAC3B,YAAY,OAAO,CAAC,MAAM,SAAS,MAAM,MAAM;QAC/C,sCAAsC,CAAC;IACzC,MAAM,QAAQ,GAAG,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IACnE,IAAI,MAAiB,CAAC;IACtB,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;IAC9E,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,+EAA+E;AAC/E,2EAA2E;AAC3E,MAAM,UAAU,iBAAiB,CAAC,OAA4B;IAC5D,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,SAAS,GACb,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ;YAC/B,CAAC,CAAC,eAAe,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG;YACtE,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,IAAI,YAAY,GAAG,SAAS,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;QAC7E,OAAO,GAAG,MAAM,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IACrC,CAAC,CAAC;SACD,IAAI,CAAC,aAAa,CAAC,CAAC;AACzB,CAAC"} | ||
| {"version":3,"file":"synthesize.js","sourceRoot":"","sources":["../src/synthesize.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,wEAAwE;AACxE,2EAA2E;AAC3E,EAAE;AACF,2EAA2E;AAC3E,0EAA0E;AAC1E,sEAAsE;AAGtE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAQhD,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;6IAewH,CAAC;AAE9I,4EAA4E;AAC5E,MAAM,SAAS,GAAG,sNAAsN,CAAC;AASzO,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAAgB,EAChB,OAA4B,EAC5B,MAAiB,EACjB,MAAoB,EACpB,OAA0B,EAAE;IAE5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,+DAA+D,CAAC;IACzE,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;IAC9D,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,WAAW,GACf,aAAa,QAAQ,MAAM;QAC3B,YAAY,OAAO,CAAC,MAAM,SAAS,MAAM,MAAM;QAC/C,sCAAsC,CAAC;IACzC,MAAM,QAAQ,GAAG,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IACnE,2EAA2E;IAC3E,sEAAsE;IACtE,yEAAyE;IACzE,yEAAyE;IACzE,mEAAmE;IACnE,yEAAyE;IACzE,oEAAoE;IACpE,2EAA2E;IAC3E,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;IAClF,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,+EAA+E;AAC/E,2EAA2E;AAC3E,MAAM,UAAU,iBAAiB,CAAC,OAA4B;IAC5D,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,SAAS,GACb,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ;YAC/B,CAAC,CAAC,eAAe,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG;YACtE,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,IAAI,YAAY,GAAG,SAAS,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;QAC7E,OAAO,GAAG,MAAM,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IACrC,CAAC,CAAC;SACD,IAAI,CAAC,aAAa,CAAC,CAAC;AACzB,CAAC"} |
+2
-2
| { | ||
| "name": "@askalf/deepdive", | ||
| "version": "0.25.1", | ||
| "description": "A local research agent. One command, cited answer. Routes every LLM call through your own proxy (dario, Anthropic-compat, OpenAI-compat). Headless browser + pluggable search + multi-provider LLM — zero hosted dependencies.", | ||
| "version": "0.25.2", | ||
| "description": "own your research — local agent, cited answers. Part of Own Your Stack.", | ||
| "type": "module", | ||
@@ -6,0 +6,0 @@ "bin": { |
+14
-22
| <p align="center"> | ||
| <h1 align="center">deepdive</h1> | ||
| <p align="center"><strong>Your machine. Your LLM subscription. Your search backend. Your cited report.</strong><br>A local research agent: ask a question, it plans sub-queries, searches the web, reads the pages in a real browser, iterates with a critic loop until the answer stops having gaps, and writes you a cited markdown report. Nothing leaves your laptop except the searches you run and the URLs the planner picked to read. Every LLM call routes through <a href="https://github.com/askalf/dario">dario</a> (or any Anthropic-compat endpoint), so the 30-to-60 calls a deep query burns bill against the Claude Max subscription you're already paying for — not a hosted tool stacking its margin on top of Anthropic's API pricing.</p> | ||
| </p> | ||
| > _deepdive — own your research — local agent, cited answers. Part of **[Own Your Stack](https://github.com/askalf)** — own your AI infrastructure instead of renting it by the token._ | ||
| <p align="center"><strong>Your machine. Your LLM subscription. Your search backend. Your cited report.</strong><br>A local research agent: ask a question, it plans sub-queries, searches the web, reads the pages in a real browser, iterates with a critic loop until the answer stops having gaps, and writes you a cited markdown report. Nothing leaves your laptop except the searches you run and the URLs the planner picked to read. Every LLM call routes through <a href="https://github.com/askalf/dario">dario</a> (or any Anthropic-compat endpoint), so the 30-to-60 calls a deep query burns bill against the Claude Max subscription you're already paying for — not a hosted tool stacking its margin on top of Anthropic's API pricing.</p> | ||
| <p align="center"><em>Zero hosted dependencies. MIT. Independent, unofficial, third-party — see <a href="DISCLAIMER.md">DISCLAIMER.md</a>.</em></p> | ||
@@ -469,3 +472,3 @@ | ||
| $ deepdive doctor | ||
| deepdive doctor — v0.25.1 | ||
| deepdive doctor — v0.25.2 | ||
@@ -475,3 +478,3 @@ # environment | ||
| --- Platform win32 x64 | ||
| --- deepdive v0.25.1 | ||
| --- deepdive v0.25.2 | ||
@@ -669,24 +672,13 @@ # cache | ||
| ## Also by askalf | ||
| ## Own Your Stack | ||
| | Project | What it does | | ||
| |---------|-------------| | ||
| | [arnie](https://github.com/askalf/arnie) | Portable IT troubleshooting companion. Networking, AD, Windows Update, package managers, log triage, hardware checks. | | ||
| | [browser-bridge](https://github.com/askalf/browser-bridge) | Stealth headless Chromium in a container. CDP on 9222 — Playwright/Puppeteer/MCP-compatible. | | ||
| | [dario](https://github.com/askalf/dario) | Local LLM router. Use your Claude Max/Pro subscription as an API. | | ||
| | [git-providers](https://github.com/askalf/git-providers) | Unified GitHub + GitLab + Bitbucket Cloud REST clients behind one GitProvider interface. Plus a 44-entry api-key-provider taxonomy. | | ||
| | [hands](https://github.com/askalf/hands) | Cross-platform computer-use agent. Mouse, keyboard, screen. | | ||
| | [install-kit](https://github.com/askalf/install-kit) | curl-pipe-bash template for self-hosted Docker apps. | | ||
| | [pgflex](https://github.com/askalf/pgflex) | One Postgres API. Two modes (real PG ↔ PGlite WASM). | | ||
| | [redisflex](https://github.com/askalf/redisflex) | One Redis API. Two modes (ioredis ↔ in-process). | | ||
| Part of **[Own Your Stack](https://github.com/askalf)** — open tools for owning your AI infrastructure instead of renting it by the token. One subscription. Your box. Your terms. | ||
| - **[dario](https://github.com/askalf/dario)** — own your routing | ||
| - **[deepdive](https://github.com/askalf/deepdive)** — own your research _(you are here)_ | ||
| - **[hands](https://github.com/askalf/hands)** — own your computer-use | ||
| - **[agent](https://github.com/askalf/agent)** — own your fleet | ||
| - **[browser-bridge](https://github.com/askalf/browser-bridge)** — own your browser | ||
| --- | ||
| ## Built by Sprayberry Labs | ||
| This is one of the open-source building blocks from **[Sprayberry Labs](https://sprayberrylabs.com)** — an independent studio (Atlanta, GA) that ships bespoke software and **fixed-price code & security audits**, delivered with the AI workforce these tools are part of. | ||
| Part of the [askalf](https://askalf.org) ecosystem — a self-hosted AI workforce platform, now in early access. | ||
| **Got a codebase that needs an expert read?** → **[Scan a repo — free mini-audit](https://sprayberrylabs.com)**, or see the **$1,500 fixed-price Audit** and build Sprints. · [sprayberrylabs.com](https://sprayberrylabs.com) · hello@sprayberrylabs.com | ||
| Part of **[Own Your Stack](https://github.com/askalf)** — own your AI infrastructure instead of renting it. Built by Thomas Sprayberry. |
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
798462
0.3%9643
0.41%682
-1.16%