Add independent conversation-driven research offers #304MergedKrzysztof-Cieslakmerged 12 commits intomainfromrefs/pull/304/headConversationFiles changed109 files changed+5303-2258StackedSplitAGENTS.md+18 −10Dockerfile+2 −0README.md+3 −0apps/server/package.json+1 −0apps/server/src/conversation-plan/accepted-research.ts+2 −1apps/server/src/conversation-plan/commands.ts+8 −4apps/server/src/conversation-plan/corrections-contributions.test.ts+1 −1apps/server/src/conversation-plan/domain-initial.ts+3 −1apps/server/src/conversation-plan/domain-research.ts+25 −5apps/server/src/conversation-plan/effect-projection.ts+1 −0apps/server/src/conversation-plan/effects-interpretation.test.ts+1 −1apps/server/src/conversation-plan/interpret-order.test.ts+2 −2apps/server/src/conversation-plan/interpret-research.ts+0 −84apps/server/src/conversation-plan/interpret-types.ts+0 −13apps/server/src/conversation-plan/interpret.ts+2 −31apps/server/src/conversation-plan/pipeline-commitment-pending.test.ts+1 −1apps/server/src/conversation-plan/pipeline-commitment-triage.test.ts+1 −1apps/server/src/conversation-plan/pipeline-recommendation-1.test.ts+6 −18apps/server/src/conversation-plan/processor-commands.ts+26 −1apps/server/src/conversation-plan/processor-research-admission.ts+0 −125apps/server/src/conversation-plan/processor-run.ts+0 −19apps/server/src/conversation-plan/processor-types.ts+7 −1apps/server/src/conversation-plan/question-research.ts+0 −123apps/server/src/conversation-plan/question-shared.ts+1 −1apps/server/src/conversation-plan/question-triage.ts+0 −5apps/server/src/conversation-plan/questions.ts+0 −1apps/server/src/conversation-plan/recent-thread-context.test.ts+6 −4apps/server/src/conversation-plan/research-admission.ts+70 −0apps/server/src/conversation-plan/research-brief-coordinator.test.ts+117 −0apps/server/src/conversation-plan/research-brief-coordinator.ts+161 −0apps/server/src/conversation-plan/research-brief-runtime.test.ts+131 −0apps/server/src/conversation-plan/research-commands.ts+43 −1apps/server/src/conversation-plan/research-draft-service.test.ts+57 −0apps/server/src/conversation-plan/research-draft-service.ts+148 −0apps/server/src/conversation-plan/research-draft.test-fixtures.ts+43 −0apps/server/src/conversation-plan/research-interpreter.test.ts+205 −0apps/server/src/conversation-plan/research-interpreter.ts+229 −0apps/server/src/conversation-plan/research-offer-detection-card-focus.test.ts+0 −242apps/server/src/conversation-plan/research-offer-detection-comparison-guards.test.ts+0 −351apps/server/src/conversation-plan/research-offer-detection-concern-guards.test.ts+0 −257apps/server/src/conversation-plan/research-offer-detection-positive.test.ts+0 −282apps/server/src/conversation-plan/research-offer-detection.test-fixtures.ts+0 −348apps/server/src/conversation-plan/research-opportunities.test.ts+171 −0apps/server/src/conversation-plan/research-opportunities.ts+119 −0apps/server/src/conversation-plan/research-processor.test.ts+62 −0apps/server/src/conversation-plan/research-processor.ts+182 −0apps/server/src/conversation-plan/research-start.test.ts+116 −0apps/server/src/conversation-plan/research-state.test.ts+150 −0apps/server/src/conversation-plan/research-state.ts+255 −0apps/server/src/conversation-plan/research-validation.ts+14 −2apps/server/src/conversation-plan/runtime.ts+49 −2apps/server/src/conversation-plan/service-order.test.ts+4 −0apps/server/src/conversation-plan/service.ts+10 −2apps/server/src/conversation-plan/state-provenance.ts+21 −0apps/server/src/conversation-plan/state-restoration.ts+2 −1apps/server/src/conversation-plan/state-validation.test.ts+1 −1apps/server/src/conversation-plan/state-validation.ts+162 −152apps/server/src/harness/agents.ts+9 −0apps/server/src/harness/copilot-sdk/adapter.test.ts+81 −2apps/server/src/harness/web-search.test.ts+93 −3apps/server/src/harness/web-search.ts+59 −10apps/server/src/jobs/registry.ts+26 −19apps/server/src/jobs/research-brief.test.ts+127 −0apps/server/src/jobs/research-brief.ts+170 −0apps/server/src/jobs/research-workspace.test.ts+2 −0apps/server/src/jobs/research-workspace.ts+69 −11apps/server/src/jobs/runner.test.ts+52 −0apps/server/src/jobs/runner.ts+44 −9apps/server/src/main.ts+43 −6apps/server/src/research/request-view.test.ts+52 −0apps/server/src/research/request-view.ts+26 −2apps/server/src/research/service.ts+9 −4apps/server/src/storage/postgres/conversation-restart.test.ts+26 −3apps/web/package.json+1 −0apps/web/src/chat/chat.tsx+5 −1apps/web/src/chat/research-brief-editor.tsx+68 −0apps/web/src/chat/research-draft-controller.test.ts+38 −0apps/web/src/chat/research-draft-controller.ts+177 −0apps/web/src/chat/research-offer-transcript.test.ts+2 −2apps/web/src/chat/research-offer.test.ts+24 −0apps/web/src/chat/research-offer.tsx+223 −14apps/web/src/chat/research-transcript.ts+38 −0apps/web/src/chat/transcript.tsx+24 −9apps/web/src/conversation-plan/markers.tsx+17 −4apps/web/src/conversation-plan/research-diagnostics.test.tsx+70 −0apps/web/src/conversation-plan/research-diagnostics.tsx+99 −0apps/web/src/room-workspace.tsx+15 −2bun.lock+14 −0docs/architecture.md+26 −9docs/background-jobs.md+25 −6docs/conversation-research.md+160 −0docs/jev-product-extraction.md+4 −1docs/self-hosting.md+8 −0docs/storage.md+7 −0e2e/jev.ts+65 −0e2e/playwright.config.ts+11 −3e2e/research-conversation.e2e.ts+114 −0e2e/research-offers-ui.e2e.ts+21 −41e2e/research-scenarios.ts+8 −0e2e/source/playwright.config.ts+1 −0e2e/source/research-offers.fixture.ts+98 −0e2e/source/research-offers.native.ts+178 −0packages/draft/package.json+10 −0packages/draft/src/index.test.ts+32 −0packages/draft/src/index.ts+81 −0packages/draft/tsconfig.json+5 −0packages/protocol/conversation-plan.d.ts+104 −2packages/protocol/research.d.ts+2 −0scripts/design-contract/exceptions/dynamic-web.json+1 −1