Skip to content

feat(wiki-compose): autonomous research loop without user iteration setting - #1055

Merged
otomatty merged 3 commits into
developfrom
cursor/wiki-compose-autonomous-research-068d
Jun 12, 2026
Merged

feat(wiki-compose): autonomous research loop without user iteration setting#1055
otomatty merged 3 commits into
developfrom
cursor/wiki-compose-autonomous-research-068d

Conversation

@otomatty

@otomatty otomatty commented Jun 12, 2026

Copy link
Copy Markdown
Owner

概要

Wiki Compose の Brief フェーズにあった「調査の深さ(1〜5 回)」スライダーを廃止し、調査ループの終了を評価 LLM の自律判断に委ねるようにしました。コードレビュー指摘に基づき、cap 解決は graphId 分岐に統一し、legacy checkpoint でも誤って 3 回 cap されないようにしています。

変更点

server/api/(調査ループ)

  • Brief の researchMaxIterations を削除し、UI/API から回数設定を排除
  • resolveResearchMaxIterations(graphId, …) — ingest のみ state cap (1..5)、Wiki Compose は常に安全上限 (10)
  • Evaluation.sufficient を追加し、shouldRefine / compileBatch が明示フラグを優先
  • exitReason: "safety_cap" を追加(自律モードの安全上限到達を max_iterations と区別)
  • RESEARCH_SUFFICIENCY_SCORE_THRESHOLD と ingest clamp を constants.ts に集約

src/(UI)

  • Brief 画面の調査深度スライダーと関連 i18n を削除

変更の種類

  • 🐛 バグ修正 (Bug fix)
  • ✨ 新機能 (New feature)
  • 💥 破壊的変更 (Breaking change)
  • 📝 ドキュメント (Documentation)
  • 🎨 スタイル/リファクタリング (Style/Refactor)
  • 🧪 テスト (Tests)
  • 🔧 ビルド/CI (Build/CI)

テスト方法

  1. Wiki Compose(guided モード)で Brief を回答し「調査を開始」を押す
  2. 調査深度スライダーが表示されないことを確認
  3. 評価 LLM が sufficient: true または score ≥ 0.75 で HITL へ進むこと
  4. 旧 checkpoint maxIterations: 3 でも Wiki Compose が 10 回まで調査できること(planQueries / constants テストで担保)

チェックリスト

  • テストがすべてパスする
  • Lint エラーがない
  • 必要に応じてドキュメントを更新した
  • コミットメッセージが Conventional Commits に従っている

関連 Issue

Open in Web Open in Cursor 

Summary by CodeRabbit

  • New Features

    • Evaluations now include a "sufficient" flag to signal when research meets requirements.
    • Added a "safety_cap" exit reason so research can stop at a defined safety limit.
  • Bug Fixes

    • Consistent iteration-limit behavior across research workflows to prevent unexpected looping.
  • Refactor

    • Removed the research-depth (iteration count) control from the Brief UI for a simpler flow.

…etting

Remove the Brief-phase research depth slider and let the evaluator LLM
decide when sources are sufficient. Wiki Compose now uses an internal
safety cap instead of a user-configured 1..5 iteration limit; ingest
planner keeps its explicit 1..5 cap when provided.
@coderabbitai

coderabbitai Bot commented Jun 12, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 858c6743-c12f-4b90-898a-3ae9c4fd1062

📥 Commits

Reviewing files that changed from the base of the PR and between d57f046 and ce5b62b.

📒 Files selected for processing (3)
  • server/api/src/agents/subgraphs/research/nodes/compileBatch.ts
  • server/api/src/agents/subgraphs/research/nodes/shared/dispatchSseCustom.ts
  • server/api/src/agents/subgraphs/research/types.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • server/api/src/agents/subgraphs/research/types.ts
  • server/api/src/agents/subgraphs/research/nodes/compileBatch.ts

📝 Walkthrough

Walkthrough

This PR introduces an explicit sufficient: boolean signal to research evaluation, adds a "safety_cap" exit reason for enforced iteration limits, centralizes iteration capping into shared constants, and removes the researchMaxIterations parameter from Wiki Compose Brief interrupts end-to-end (backend, schema, and UI).

Changes

Research Graph Sufficiency & Exit Conditions

Layer / File(s) Summary
Research Evaluation with Sufficiency Signal
server/api/src/agents/subgraphs/research/nodes/evaluateSufficiency.ts, server/api/src/agents/subgraphs/research/types.ts, server/api/src/agents/subgraphs/research/shouldRefine.ts, server/api/src/__tests__/agents/subgraphs/research/researchGraph.*.ts
The evaluator LLM now returns an explicit sufficient: boolean field. Evaluation interface adds the boolean flag, evaluationSchema validates it, and new isResearchSufficient helper prefers this signal over hardcoded score thresholds. Test mocks across conditional, loop, interrupt, and resume scenarios are updated to include sufficient in evaluation fixtures.
Exit Reason Resolution & Safety Cap
server/api/src/agents/subgraphs/research/nodes/compileBatch.ts, server/api/src/agents/core/types/sseEvents.ts, server/api/src/agents/subgraphs/research/nodes/shared/dispatchSseCustom.ts, server/api/src/agents/runner/sseMapper.ts, server/api/src/__tests__/agents/subgraphs/research/nodes/compileBatch.test.ts
New resolveResearchExitReason helper determines exit reason by checking sufficiency first, then selecting "max_iterations" vs "safety_cap" based on graph ID. The exitReason union across types gains "safety_cap" variant, and SSE mapper validation now accepts this new value. Test refactored with configForGraph helper and new cases for each exit reason.
Shared Research Iteration Constants & Application
server/api/src/agents/subgraphs/research/constants.ts, server/api/src/agents/subgraphs/research/state.ts, server/api/src/agents/graphs/wikiCompose/state.ts, server/api/src/agents/graphs/ingest/nodes/prepareIngest.ts, server/api/src/agents/subgraphs/research/nodes/planQueries.ts, server/api/src/agents/subgraphs/research/nodes/refineQueries.ts, server/api/src/agents/subgraphs/research/researchGraph.ts, server/api/src/__tests__/agents/subgraphs/research/constants.test.ts, server/api/src/__tests__/agents/subgraphs/research/nodes/planQueries.test.ts
New constants.ts exports iteration limits and clamping/resolution helpers. Both ResearchLoopState and WikiComposeState now use RESEARCH_SAFETY_MAX_ITERATIONS as the maxIterations default. prepareIngest uses clampIngestMaxIterations, and planQueries uses resolveResearchMaxIterations to select graph-specific caps. Tests added for new constants and updated for graph-specific iteration behavior.

Wiki Compose Brief Resume Payload Simplification

Layer / File(s) Summary
Brief Node & Schema Updates
server/api/src/agents/graphs/wikiCompose/nodes/humanReviewBrief.ts, server/api/src/agents/graphs/wikiCompose/resumeSchemas.ts, server/api/src/agents/graphs/wikiCompose/types.ts, server/api/src/__tests__/agents/graphs/wikiCompose/nodes/humanReviewBrief.test.ts, src/lib/wikiCompose/composeService.ts
briefResumeSchema removes the optional researchMaxIterations field, and BriefResumeInput type no longer includes that property. human_review_brief node stops forwarding the resume field to state.maxIterations. Tests updated to remove assertions about update.maxIterations projection. Documentation updated to reflect the simplified payload shape.
Frontend UI Removal of Research Depth Control
src/components/wikiCompose/DialogueSection.tsx, src/components/wikiCompose/ComposePanel.tsx, src/hooks/wiki/useWikiComposeSession.ts, src/i18n/locales/en/wikiCompose.json, src/i18n/locales/ja/wikiCompose.json, src/lib/wikiCompose/types.ts, server/api/src/routes/composeSessions.ts
DialogueSection removes the research-depth slider UI (Slider import and state removed) and no longer sends researchMaxIterations to onSubmitBrief callback. ComposePanel and useWikiComposeSession hook signatures updated to remove the field from input shapes. Localization keys for research depth/iteration selection removed. SSE event type and API route documentation updated to reflect the simplified payload.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • otomatty/zedi#956: Related research-loop subgraph changes that introduced core nodes and termination logic which this PR extends with evaluation.sufficient and "safety_cap".
  • otomatty/zedi#990: Overlaps at research-loop node changes (model routing vs. sufficiency/exitReason updates).
  • otomatty/zedi#1042: Related to humanReviewBrief interrupt/resume behavior and tests touching researchMaxIterations handling.

🐰 A rabbit hops through research loops,
Now "sufficient" signals truth so true,
Safety caps prevent endless scoops,
Brief answers flow without the choose,
Small hops, big fixes — carrots for you! 🥕

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 57.89% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: removing the user-controlled iteration setting from Wiki Compose and making the research loop autonomous via LLM evaluation.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/wiki-compose-autonomous-research-068d

Comment @coderabbitai help to get the list of available commands and usage tips.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request removes the user-facing "Research depth" slider from the Wiki Compose interface, transitioning the research process to an autonomous loop. The research depth is now determined dynamically by an evaluator LLM using a sufficiency score threshold of 0.75, with a hard safety cap of 10 iterations to prevent runaway loops. Legacy explicit iteration caps (1 to 5) are still supported and resolved appropriately. All corresponding UI components, translation keys, schemas, state variables, and tests have been updated to reflect this change. I have no feedback to provide as the changes are clean and well-tested.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

@otomatty
otomatty marked this pull request as ready for review June 12, 2026 10:54
@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

Use graphId instead of a 1..5 numeric heuristic to choose iteration caps,
consolidate ingest clamping in constants.ts, add Evaluation.sufficient,
and distinguish safety_cap from max_iterations in exit reasons.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (5)
server/api/src/agents/subgraphs/research/shouldRefine.ts (1)

10-21: 💤 Low value

Clarify the documentation for isResearchSufficient.

The comment says "Prefers the evaluator's explicit sufficient flag; falls back to score threshold", but the logic only honors sufficient === true as a strong signal. When sufficient === false, the function still falls back to the score threshold, so sufficient: false doesn't prevent stopping if the score is high enough.

Consider rephrasing to: "Returns true if the evaluator sets sufficient: true, or if the score meets the threshold" or "Honors explicit sufficient: true to force stopping; otherwise checks score threshold."

This makes it clearer that sufficient: true is a one-way override (forces stop) rather than sufficient being the primary decision in both directions.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/api/src/agents/subgraphs/research/shouldRefine.ts` around lines 10 -
21, Update the JSDoc for isResearchSufficient to clarify that only sufficient
=== true forces a true return while sufficient === false does not block success
— the function returns true if the evaluator sets sufficient: true or if
evaluation.score >= RESEARCH_SUFFICIENCY_SCORE_THRESHOLD; reference the
Evaluation type, the isResearchSufficient function, and
RESEARCH_SUFFICIENCY_SCORE_THRESHOLD in the comment so readers know the
explicit-true override and the score fallback behavior.
server/api/src/__tests__/agents/subgraphs/research/researchGraph.conditional.test.ts (1)

96-107: ⚡ Quick win

Consider adding a test for sufficient: false with high score.

The new test on line 96-106 covers sufficient: true with low score (forces compile). For completeness, consider adding a test for the opposite edge case: sufficient: false with high score (e.g., score: 0.95).

Based on the current logic, this should compile (score threshold wins), but an explicit test would document this behavior clearly.

📝 Suggested test case
it("compiles when score is high even if sufficient is false", () => {
  expect(
    shouldRefine(
      state({
        iteration: 1,
        maxIterations: 5,
        lastEvaluation: { score: 0.95, sufficient: false, rationale: "conservative", missingAspects: [] },
      }),
    ),
  ).toBe("compile");
});
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@server/api/src/__tests__/agents/subgraphs/research/researchGraph.conditional.test.ts`
around lines 96 - 107, Add a new unit test in the same file to assert the edge
case where lastEvaluation.sufficient is false but score is above the threshold:
create an it("compiles when score is high even if sufficient is false") that
calls shouldRefine(state({ iteration: 1, maxIterations: 5, lastEvaluation: {
score: 0.95, sufficient: false, rationale: "conservative", missingAspects: []
}})) and expect the result toBe("compile"); this mirrors the existing test
pattern and documents that the score threshold overrides sufficient.
server/api/src/agents/subgraphs/research/nodes/evaluateSufficiency.ts (1)

29-35: 💤 Low value

Consider clarifying the relationship between sufficient and score in the prompt.

The prompt instructs the model to set both sufficient (boolean) and score (0..1), and mentions ">= 0.75 typically means sufficient". The relationship between these two signals could be made more explicit: should the model set them in agreement, or are they independent? For example, if the model sets sufficient: true, should it typically also give a score >= 0.75?

Current behavior (based on downstream logic) allows disagreement, which is fine, but the prompt could guide the model on this.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/api/src/agents/subgraphs/research/nodes/evaluateSufficiency.ts` around
lines 29 - 35, Clarify in the SYSTEM_PROMPT how `sufficient` and `score` should
relate: update the prompt string (the constant SYSTEM_PROMPT that already
references RESEARCH_SUFFICIENCY_SCORE_THRESHOLD) to instruct the model to
normally make `sufficient: true` when `score` >=
${RESEARCH_SUFFICIENCY_SCORE_THRESHOLD} and `sufficient: false` when `score` <
that threshold, but allow the model to override when it provides a short
rationale explaining the exception; ensure the wording requires JSON output
containing `sufficient`, `score`, `rationale`, and up to 5 `missing_aspects`.
server/api/src/agents/subgraphs/research/constants.ts (1)

23-29: ⚡ Quick win

Consider importing graph ID from the owner module to eliminate duplication.

The comment on Line 25 asks to keep INGEST_RESEARCH_GRAPH_ID in sync with INGEST_PLANNER_GRAPH_ID in another file. This string constant duplication creates a maintenance risk—if the values drift, resolveResearchMaxIterations will silently apply the wrong cap to ingest research runs.

A more maintainable approach: have the ingest graph module export its ID constant, then import it here rather than duplicating the string literal.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/api/src/agents/subgraphs/research/constants.ts` around lines 23 - 29,
The constant INGEST_RESEARCH_GRAPH_ID duplicates the string from
INGEST_PLANNER_GRAPH_ID and risks drifting; instead import the canonical graph
id exported by the ingest planner module (the symbol INGEST_PLANNER_GRAPH_ID)
and re-export or alias it here (replace the local INGEST_RESEARCH_GRAPH_ID
definition with an import from the ingest/ingestPlannerGraph module and, if
needed for API stability, export it under the same name so
resolveResearchMaxIterations uses the single source of truth).
server/api/src/__tests__/agents/subgraphs/research/constants.test.ts (1)

13-19: ⚡ Quick win

Add boundary and edge case tests for more comprehensive validation.

The current tests cover the happy path, but adding explicit boundary cases would improve confidence in the clamping logic:

  • Boundary values: 0 → 1, 1 → 1, 5 → 5, 6 → 5, -1 → 1
  • Fractional inputs: 1.5 → 1, 4.7 → 4, 5.9 → 5
  • Already handled but worth explicit tests: null, NaN, "3"

The implementation handles these correctly via typeof/isFinite/trunc checks, but explicit test cases document expected behavior and catch future regressions.

🧪 Suggested additional test cases
 describe("clampIngestMaxIterations", () => {
   it("clamps ingest caps to 1..5 with default 3", () => {
     expect(clampIngestMaxIterations(undefined)).toBe(3);
     expect(clampIngestMaxIterations(99)).toBe(5);
     expect(clampIngestMaxIterations(4)).toBe(4);
   });
+
+  it("handles boundary values", () => {
+    expect(clampIngestMaxIterations(0)).toBe(1);
+    expect(clampIngestMaxIterations(1)).toBe(1);
+    expect(clampIngestMaxIterations(5)).toBe(5);
+    expect(clampIngestMaxIterations(6)).toBe(5);
+    expect(clampIngestMaxIterations(-1)).toBe(1);
+  });
+
+  it("truncates fractional inputs", () => {
+    expect(clampIngestMaxIterations(1.5)).toBe(1);
+    expect(clampIngestMaxIterations(4.7)).toBe(4);
+    expect(clampIngestMaxIterations(5.9)).toBe(5);
+  });
+
+  it("rejects non-numeric inputs with default", () => {
+    expect(clampIngestMaxIterations(null)).toBe(3);
+    expect(clampIngestMaxIterations(NaN)).toBe(3);
+    expect(clampIngestMaxIterations("3")).toBe(3);
+  });
 });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/api/src/__tests__/agents/subgraphs/research/constants.test.ts` around
lines 13 - 19, The test suite for clampIngestMaxIterations is missing explicit
boundary and edge-case assertions; add unit tests in constants.test.ts calling
clampIngestMaxIterations for 0,1,5,6,-1 and expect 1,1,5,5,1 respectively, add
fractional inputs like 1.5→1, 4.7→4, 5.9→5, and add null, NaN, and string inputs
(e.g., null, NaN, "3") to assert the function’s current behavior (undefined-like
default to 3 or appropriate clamped/truncated results) so these edge cases are
documented and will catch regressions.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@server/api/src/__tests__/agents/subgraphs/research/constants.test.ts`:
- Around line 13-19: The test suite for clampIngestMaxIterations is missing
explicit boundary and edge-case assertions; add unit tests in constants.test.ts
calling clampIngestMaxIterations for 0,1,5,6,-1 and expect 1,1,5,5,1
respectively, add fractional inputs like 1.5→1, 4.7→4, 5.9→5, and add null, NaN,
and string inputs (e.g., null, NaN, "3") to assert the function’s current
behavior (undefined-like default to 3 or appropriate clamped/truncated results)
so these edge cases are documented and will catch regressions.

In
`@server/api/src/__tests__/agents/subgraphs/research/researchGraph.conditional.test.ts`:
- Around line 96-107: Add a new unit test in the same file to assert the edge
case where lastEvaluation.sufficient is false but score is above the threshold:
create an it("compiles when score is high even if sufficient is false") that
calls shouldRefine(state({ iteration: 1, maxIterations: 5, lastEvaluation: {
score: 0.95, sufficient: false, rationale: "conservative", missingAspects: []
}})) and expect the result toBe("compile"); this mirrors the existing test
pattern and documents that the score threshold overrides sufficient.

In `@server/api/src/agents/subgraphs/research/constants.ts`:
- Around line 23-29: The constant INGEST_RESEARCH_GRAPH_ID duplicates the string
from INGEST_PLANNER_GRAPH_ID and risks drifting; instead import the canonical
graph id exported by the ingest planner module (the symbol
INGEST_PLANNER_GRAPH_ID) and re-export or alias it here (replace the local
INGEST_RESEARCH_GRAPH_ID definition with an import from the
ingest/ingestPlannerGraph module and, if needed for API stability, export it
under the same name so resolveResearchMaxIterations uses the single source of
truth).

In `@server/api/src/agents/subgraphs/research/nodes/evaluateSufficiency.ts`:
- Around line 29-35: Clarify in the SYSTEM_PROMPT how `sufficient` and `score`
should relate: update the prompt string (the constant SYSTEM_PROMPT that already
references RESEARCH_SUFFICIENCY_SCORE_THRESHOLD) to instruct the model to
normally make `sufficient: true` when `score` >=
${RESEARCH_SUFFICIENCY_SCORE_THRESHOLD} and `sufficient: false` when `score` <
that threshold, but allow the model to override when it provides a short
rationale explaining the exception; ensure the wording requires JSON output
containing `sufficient`, `score`, `rationale`, and up to 5 `missing_aspects`.

In `@server/api/src/agents/subgraphs/research/shouldRefine.ts`:
- Around line 10-21: Update the JSDoc for isResearchSufficient to clarify that
only sufficient === true forces a true return while sufficient === false does
not block success — the function returns true if the evaluator sets sufficient:
true or if evaluation.score >= RESEARCH_SUFFICIENCY_SCORE_THRESHOLD; reference
the Evaluation type, the isResearchSufficient function, and
RESEARCH_SUFFICIENCY_SCORE_THRESHOLD in the comment so readers know the
explicit-true override and the score fallback behavior.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 72ed7f21-9bbd-496e-a25c-0eff045ecc47

📥 Commits

Reviewing files that changed from the base of the PR and between af25933 and d57f046.

📒 Files selected for processing (37)
  • server/api/src/__tests__/agents/graphs/ingest/formatResearchForIngest.test.ts
  • server/api/src/__tests__/agents/graphs/ingest/ingestPlannerGraph.test.ts
  • server/api/src/__tests__/agents/graphs/wikiCompose/nodes/humanReviewBrief.test.ts
  • server/api/src/__tests__/agents/graphs/wikiCompose/wikiComposeGraph.test.ts
  • server/api/src/__tests__/agents/subgraphs/research/constants.test.ts
  • server/api/src/__tests__/agents/subgraphs/research/nodes/compileBatch.test.ts
  • server/api/src/__tests__/agents/subgraphs/research/nodes/planQueries.test.ts
  • server/api/src/__tests__/agents/subgraphs/research/researchGraph.conditional.test.ts
  • server/api/src/__tests__/agents/subgraphs/research/researchGraph.interrupt.test.ts
  • server/api/src/__tests__/agents/subgraphs/research/researchGraph.loop.test.ts
  • server/api/src/__tests__/agents/subgraphs/research/researchGraph.modelGuard.test.ts
  • server/api/src/__tests__/agents/subgraphs/research/researchGraph.resume.test.ts
  • server/api/src/agents/core/types/sseEvents.ts
  • server/api/src/agents/graphs/ingest/nodes/prepareIngest.ts
  • server/api/src/agents/graphs/wikiCompose/nodes/humanReviewBrief.ts
  • server/api/src/agents/graphs/wikiCompose/resumeSchemas.ts
  • server/api/src/agents/graphs/wikiCompose/state.ts
  • server/api/src/agents/graphs/wikiCompose/types.ts
  • server/api/src/agents/runner/sseMapper.ts
  • server/api/src/agents/subgraphs/research/constants.ts
  • server/api/src/agents/subgraphs/research/nodes/compileBatch.ts
  • server/api/src/agents/subgraphs/research/nodes/evaluateSufficiency.ts
  • server/api/src/agents/subgraphs/research/nodes/planQueries.ts
  • server/api/src/agents/subgraphs/research/nodes/refineQueries.ts
  • server/api/src/agents/subgraphs/research/nodes/shared/dispatchSseCustom.ts
  • server/api/src/agents/subgraphs/research/researchGraph.ts
  • server/api/src/agents/subgraphs/research/shouldRefine.ts
  • server/api/src/agents/subgraphs/research/state.ts
  • server/api/src/agents/subgraphs/research/types.ts
  • server/api/src/routes/composeSessions.ts
  • src/components/wikiCompose/ComposePanel.tsx
  • src/components/wikiCompose/DialogueSection.tsx
  • src/hooks/wiki/useWikiComposeSession.ts
  • src/i18n/locales/en/wikiCompose.json
  • src/i18n/locales/ja/wikiCompose.json
  • src/lib/wikiCompose/composeService.ts
  • src/lib/wikiCompose/types.ts
💤 Files with no reviewable changes (4)
  • src/i18n/locales/en/wikiCompose.json
  • src/i18n/locales/ja/wikiCompose.json
  • server/api/src/tests/agents/graphs/wikiCompose/nodes/humanReviewBrief.test.ts
  • server/api/src/agents/graphs/wikiCompose/types.ts

Introduce ResearchLoopCompileExitReason so compile_batch dispatch
matches the SSE payload union and fixes API Type Check.
@otomatty
otomatty merged commit ef927ec into develop Jun 12, 2026
20 checks passed
@otomatty
otomatty deleted the cursor/wiki-compose-autonomous-research-068d branch June 12, 2026 16:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants