thoughtframe/webapp/WEB-INF/base/thoughtframe/frames/research/actions/plan.groovy
thoughtframe/webapp/WEB-INF/base/thoughtframe/frames/research/actions/read.groovy
thoughtframe/src/main/java/org/thoughtframe/search/WebSearchModule.java
thoughtframe/webapp/WEB-INF/base/thoughtframe/frames/research/actions/synthesize.xconf
thoughtframe/src/main/java/org/thoughtframe/search/WebSearcher.java
thoughtframe/webapp/WEB-INF/base/thoughtframe/frames/research/actions/plan.html
thoughtframe/webapp/WEB-INF/base/thoughtframe/frames/research/actions/read.html
thoughtframe/webapp/WEB-INF/base/thoughtframe/frames/research/actions/synthesize.groovy
thoughtframe/webapp/WEB-INF/base/thoughtframe/frames/research/actions/synthesize.html
thoughtframe/src/main/resources/plugin.xml
thoughtframe/src/main/java/org/thoughtframe/search/DeepSeekWebSearcher.java
thoughtframe/webapp/WEB-INF/base/thoughtframe/frames/research/actions/plan.xconf
thoughtframe/webapp/WEB-INF/base/thoughtframe/frames/research/actions/search.html
thoughtframe/webapp/WEB-INF/base/thoughtframe/frames/research/actions/read.xconf
thoughtframe/webapp/WEB-INF/base/thoughtframe/frames/research/actions/search.xconf
thoughtframe/webapp/WEB-INF/base/thoughtframe/frames/research/actions/search.groovy
thoughtframe/webapp/WEB-INF/base/thoughtframe/frames/research/deepresearch.groovy
ian
at
DeepSeekWebSearcher implements WebSearcher on api.deepseek.com/v1/tools/{search,fetch}: search maps results to the title/url/content shape the module expects; fetch returns clean Markdown and is used by WebSearchModule.fetch when a provider is configured (plain OkHttp stays the fallback). Bean deepseekWebSearcher; key comes from the existing 'deepseek-key' bench setting.
frames/research/deepresearch.groovy is a stateful background runner: plan (LLM -> queries) -> search (DeepSeek Search) -> read (DeepSeek Fetch -> notes) -> synthesize (LLM -> report). Each step is an action script that persists its output on the frame, so work survives across ticks.