Skip to content

fix: address PR #757 review comments - #759

Merged
otomatty merged 2 commits into
developfrom
fix/pr-757-review
Apr 26, 2026
Merged

fix: address PR #757 review comments#759
otomatty merged 2 commits into
developfrom
fix/pr-757-review

Conversation

@otomatty

@otomatty otomatty commented Apr 26, 2026

Copy link
Copy Markdown
Owner

概要

PR #757 のレビューコメントのうち、リリース前に取り込むべきバグ修正・型安全性・テスト安定化・コメント整備をまとめて対応します。

変更点

  • buildContentPreview が最大長を超えないよう、ellipsis 分を含めて切り詰めるよう修正
  • WikiLink / Tagdata-target-id パースで空文字を null に正規化し、対応テストを追加
  • addAttributes.call() 周辺の as any を明示的な context 型へ置換
  • abort stream テストの ReadableStream を明示的に close してハングを防止
  • レビュー指摘のテストコメント・ドキュメント文言を日英併記または正しい説明へ更新

変更の種類

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

テスト方法

  1. bun run lint
  2. bunx prettier --check AGENTS.md server/api/src/lib/extractPlainTextFromYXml.ts server/hocuspocus/src/extractPlainTextFromYXml.ts server/hocuspocus/src/extractPlainTextFromYXml.test.ts src/components/editor/TiptapEditor/useWikiLinkStatusSync.test.tsx src/components/editor/extensions/TagExtension.ts src/components/editor/extensions/TagExtension.test.ts src/components/editor/extensions/WikiLinkExtension.ts src/components/editor/extensions/WikiLinkExtension.test.ts src/components/editor/extensions/slashSuggestionPlugin.test.ts src/hooks/useMermaidGenerator.test.ts src/hooks/useWorkflowDraft.test.ts src/hooks/useWorkflowRunSession.test.ts src/lib/aiServiceServer.test.ts src/stores/aiChatStore.test.ts
  3. bunx vitest run src/components/editor/extensions/WikiLinkExtension.test.ts src/components/editor/extensions/TagExtension.test.ts src/components/editor/extensions/slashSuggestionPlugin.test.ts src/components/editor/TiptapEditor/useWikiLinkStatusSync.test.tsx src/hooks/useMermaidGenerator.test.ts src/hooks/useWorkflowDraft.test.ts src/hooks/useWorkflowRunSession.test.ts src/lib/aiServiceServer.test.ts src/stores/aiChatStore.test.ts
  4. (cd server/hocuspocus && bunx vitest run src/extractPlainTextFromYXml.test.ts)

Note: bun run format:check はリポジトリ既存の未整形ファイル多数により失敗するため、今回変更したファイル限定で Prettier check を実行しています。

チェックリスト

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

スクリーンショット(UI 変更がある場合)

UI 変更なし。

関連 Issue

Related to #757

Made with Cursor


Open in Devin Review

Summary by CodeRabbit

  • Bug Fixes

    • Fixed content preview truncation to properly respect maximum length limits when appending ellipsis.
    • Improved wiki link and tag attribute parsing to correctly handle empty and whitespace-only values.
  • Documentation

    • Updated database schema change documentation with improved error descriptions.

@coderabbitai

coderabbitai Bot commented Apr 26, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

This PR contains targeted improvements across multiple areas: fixing content preview truncation logic to respect max length constraints with ellipsis appending, strengthening HTML parsing validation for wiki-link and tag targetId attributes with whitespace trimming and null normalization, enhancing test coverage and clarity through documentation, and refining timer and stream handling in test utilities.

Changes

Cohort / File(s) Summary
Plain-text extraction truncation
server/api/src/lib/extractPlainTextFromYXml.ts, server/hocuspocus/src/extractPlainTextFromYXml.ts, server/hocuspocus/src/extractPlainTextFromYXml.test.ts
Fixed buildContentPreview to subtract ellipsis length (3) from CONTENT_PREVIEW_MAX_LENGTH when truncating, preventing the final preview from exceeding the intended maximum; guards against negative headLength via Math.max(0, ...); updated test assertion to enforce 120-character maximum.
targetId HTML parsing validation
src/components/editor/extensions/TagExtension.ts, src/components/editor/extensions/TagExtension.test.ts, src/components/editor/extensions/WikiLinkExtension.ts, src/components/editor/extensions/WikiLinkExtension.test.ts
Added validation and normalization to targetId.parseHTML: checks for string values, trims whitespace, and converts empty/whitespace-only results to null instead of passing through raw attribute values; strengthened test assertions to verify empty data-target-id="" parsing to null and corrected test helper typing to use properly typed AddAttributesContext.
Wiki-link status sync test documentation
src/components/editor/TiptapEditor/useWikiLinkStatusSync.test.tsx
Updated mock contract documentation for checkExistence to clarify support for scenarios where wiki-link status syncing resolves a targetId via normalized pageTitleToId map from note-scoped notePages; no control flow changes.
Test enhancements and documentation
src/components/editor/extensions/slashSuggestionPlugin.test.ts, src/hooks/useMermaidGenerator.test.ts, src/hooks/useWorkflowRunSession.test.ts, src/stores/aiChatStore.test.ts
Added clarifying Japanese inline comments describing test scenarios and intent (slash-trigger activation/deactivation, error handling, paused state capture, volatile-field behavior) without altering logic or assertions.
Test timer and stream handling
src/hooks/useWorkflowDraft.test.ts, src/lib/aiServiceServer.test.ts
Updated exportJson test to explicitly flush fake timers after URL.createObjectURL call to ensure URL.revokeObjectURL invocation occurs; updated SSE abort test to explicitly close ReadableStream after enqueueing keep-alive chunk with clarifying comment.
Documentation
AGENTS.md
Updated wording in "DB スキーマ変更(必読) / Database schema changes (must read)" section with improved spacing and error description phrasing referencing PR #728.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Poem

🐰 A rabbit's notes on truncation true,
With ellipsis trimmed to size anew,
Wiki links now parse with care and grace,
Empty strings find null's embrace!
Tests grow clearer, timers flush with pride—
Documentation blooms far and wide. 🌟

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'fix: address PR #757 review comments' accurately reflects the main objective of addressing review feedback from a prior PR, which is the primary purpose of this changeset.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
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 fix/pr-757-review

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 updates documentation for database migrations and refines the buildContentPreview utility to strictly enforce length limits. It also improves Tiptap editor extensions by handling empty targetId attributes and refactoring test contexts. Furthermore, numerous test files were updated with bilingual comments and enhanced mock behavior. Feedback highlights the need for safer string slicing to handle surrogate pairs in previews and recommends closing stream controllers immediately upon abortion in tests to avoid potential hangs.

if (trimmed.length <= CONTENT_PREVIEW_MAX_LENGTH) return trimmed;
return trimmed.slice(0, CONTENT_PREVIEW_MAX_LENGTH).trim() + "...";
const headLength = Math.max(0, CONTENT_PREVIEW_MAX_LENGTH - 3);
return `${trimmed.slice(0, headLength).trim()}...`;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

trimmed.slice(0, headLength) は UTF-16 コードユニット単位で文字列を切り出すため、サロゲートペア(絵文字や一部の漢字など)の途中で切断され、不正な文字列(文字化け)が発生する可能性があります。プレビュー用途では致命的ではありませんが、より堅牢にするには Intl.Segmenter を使用するか、切り出し位置がサロゲートペアの間でないかを確認する処理を追加することを検討してください。なお、この修正を行う場合は server/hocuspocus 側の同名ファイルも同様に更新する必要があります。

if (trimmed.length <= CONTENT_PREVIEW_MAX_LENGTH) return trimmed;
return trimmed.slice(0, CONTENT_PREVIEW_MAX_LENGTH).trim() + "...";
const headLength = Math.max(0, CONTENT_PREVIEW_MAX_LENGTH - 3);
return `${trimmed.slice(0, headLength).trim()}...`;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

trimmed.slice(0, headLength) は UTF-16 コードユニット単位で文字列を切り出すため、サロゲートペア(絵文字や一部の漢字など)の途中で切断され、不正な文字列(文字化け)が発生する可能性があります。プレビュー用途では致命的ではありませんが、より堅牢にするには Intl.Segmenter を使用するか、切り出し位置がサロゲートペアの間でないかを確認する処理を追加することを検討してください。なお、この修正を行う場合は server/api 側の同名ファイルも同様に更新する必要があります。

Comment on lines +361 to 363
// Abort before the next pull.
abortController.abort();
return;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

この pull メソッド内での abort() 呼び出し直後に controller.close() を実行することを検討してください。現在の実装では、2 回目の pull が呼ばれた際に close() されるようになっていますが、コンシューマ(callAIWithServer)が abort を検知してストリームの読み取りを即座に停止した場合、2 回目の pull が発生せず、ストリームが閉じられないままハングやリークの原因になる可能性があります。この PR の目的である「ハング防止」をより確実にするための修正です。

            // Abort before the next pull.
            abortController.abort();
            controller.close();
            return;

@otomatty otomatty self-assigned this Apr 26, 2026

@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 (7)
server/hocuspocus/src/extractPlainTextFromYXml.test.ts (1)

143-143: Use the exported max-length constant in the expectation.

Line 143 hardcodes 120; importing CONTENT_PREVIEW_MAX_LENGTH keeps spec and implementation aligned if the limit changes.

Proposed refactor
-import { buildContentPreview, extractTextFromYXml } from "./extractPlainTextFromYXml.js";
+import {
+  buildContentPreview,
+  CONTENT_PREVIEW_MAX_LENGTH,
+  extractTextFromYXml,
+} from "./extractPlainTextFromYXml.js";
@@
-    expect(prev.length).toBeLessThanOrEqual(120);
+    expect(prev.length).toBeLessThanOrEqual(CONTENT_PREVIEW_MAX_LENGTH);

As per coding guidelines **/*.{test,spec}.{ts,tsx,js,jsx}: Tests serve as a source of truth for specifications alongside implementation code TSDoc/JSDoc.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/hocuspocus/src/extractPlainTextFromYXml.test.ts` at line 143, The test
currently hardcodes the preview length check with
expect(prev.length).toBeLessThanOrEqual(120); — replace the literal with the
exported constant CONTENT_PREVIEW_MAX_LENGTH by importing it into the test file
and using expect(prev.length).toBeLessThanOrEqual(CONTENT_PREVIEW_MAX_LENGTH);
so the spec follows the implementation constant (ensure the import name matches
the exported symbol).
server/api/src/lib/extractPlainTextFromYXml.ts (1)

76-77: Mirror-side maintainability: avoid magic ellipsis values here too.

Line 76/Line 77 should follow the same suffix-constant pattern to avoid drift between this mirrored file and the Hocuspocus copy.

Proposed refactor
+const PREVIEW_ELLIPSIS = "...";
+
 export function buildContentPreview(text: string): string {
   const trimmed = text.trim().replace(/\s+/g, " ");
   if (trimmed.length <= CONTENT_PREVIEW_MAX_LENGTH) return trimmed;
-  const headLength = Math.max(0, CONTENT_PREVIEW_MAX_LENGTH - 3);
-  return `${trimmed.slice(0, headLength).trim()}...`;
+  const headLength = Math.max(0, CONTENT_PREVIEW_MAX_LENGTH - PREVIEW_ELLIPSIS.length);
+  return `${trimmed.slice(0, headLength).trim()}${PREVIEW_ELLIPSIS}`;
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/api/src/lib/extractPlainTextFromYXml.ts` around lines 76 - 77, Replace
the magic ellipsis string ("...") in the return of the function that computes
preview text with the shared suffix constant used elsewhere to avoid drift;
locate the logic around CONTENT_PREVIEW_MAX_LENGTH and headLength in
extractPlainTextFromYXml.ts and return the trimmed slice concatenated with the
existing SUFFIX constant (or a similarly named PREVIEW_SUFFIX used in the
Hocuspocus copy) instead of the literal "..." so both mirrored implementations
use the same suffix symbol.
server/hocuspocus/src/extractPlainTextFromYXml.ts (1)

75-76: Avoid duplicated magic values for ellipsis truncation.

Line 75/Line 76 hardcode both 3 and "...". Derive head length from a single suffix constant so future changes can’t desync behavior.

Proposed refactor
+const PREVIEW_ELLIPSIS = "...";
+
 export function buildContentPreview(text: string): string {
   const trimmed = text.trim().replace(/\s+/g, " ");
   if (trimmed.length <= CONTENT_PREVIEW_MAX_LENGTH) return trimmed;
-  const headLength = Math.max(0, CONTENT_PREVIEW_MAX_LENGTH - 3);
-  return `${trimmed.slice(0, headLength).trim()}...`;
+  const headLength = Math.max(0, CONTENT_PREVIEW_MAX_LENGTH - PREVIEW_ELLIPSIS.length);
+  return `${trimmed.slice(0, headLength).trim()}${PREVIEW_ELLIPSIS}`;
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/hocuspocus/src/extractPlainTextFromYXml.ts` around lines 75 - 76, The
truncation logic in extractPlainTextFromYXml.ts uses two hardcoded values (3 and
"...") which can drift; introduce a single suffix constant (e.g., const ELLIPSIS
= "..." or const SUFFIX = "...") and derive the head length from
CONTENT_PREVIEW_MAX_LENGTH - ELLIPSIS.length, then use that suffix constant in
the template return instead of the literal "..." (update the variables
headLength and the return string in the function that computes the preview).
src/components/editor/extensions/TagExtension.ts (1)

170-182: Apply the same targetId normalization in renderHTML to match parse behavior.

parseHTML trims and null-normalizes, but renderHTML can still serialize whitespace-only strings. Mirroring normalization avoids writing non-canonical data-target-id values.

♻️ Proposed fix
       targetId: {
         default: null,
         parseHTML: (element) => {
           const raw = element.getAttribute("data-target-id");
           if (typeof raw !== "string") return null;
           const normalized = raw.trim();
           return normalized.length > 0 ? normalized : null;
         },
         renderHTML: (attributes) => {
           const value = attributes.targetId;
-          if (typeof value !== "string" || value.length === 0) {
+          if (typeof value !== "string") {
             return {};
           }
-          return { "data-target-id": value };
+          const normalized = value.trim();
+          if (normalized.length === 0) {
+            return {};
+          }
+          return { "data-target-id": normalized };
         },
       },
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/editor/extensions/TagExtension.ts` around lines 170 - 182, The
renderHTML in TagExtension currently serializes attributes.targetId verbatim;
update renderHTML to mirror parseHTML by first checking typeof
attributes.targetId === "string", then creating a normalized =
attributes.targetId.trim(), and only return { "data-target-id": normalized }
when normalized.length > 0 (otherwise return {}). This keeps
TagExtension.renderHTML behavior consistent with parseHTML and avoids writing
whitespace-only data-target-id values.
src/components/editor/extensions/WikiLinkExtension.ts (1)

121-133: Normalize targetId on render as well to keep serialization canonical.

parseHTML trims whitespace-only values to null, but renderHTML still emits whitespace strings. Trimming in renderHTML too keeps round-trip behavior consistent.

♻️ Proposed fix
       targetId: {
         default: null,
         parseHTML: (element) => {
           const raw = element.getAttribute("data-target-id");
           if (typeof raw !== "string") return null;
           const normalized = raw.trim();
           return normalized.length > 0 ? normalized : null;
         },
         renderHTML: (attributes) => {
           const value = attributes.targetId;
-          if (typeof value !== "string" || value.length === 0) {
+          if (typeof value !== "string") {
             return {};
           }
-          return { "data-target-id": value };
+          const normalized = value.trim();
+          if (normalized.length === 0) {
+            return {};
+          }
+          return { "data-target-id": normalized };
         },
       },
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/editor/extensions/WikiLinkExtension.ts` around lines 121 -
133, The renderHTML logic for WikiLinkExtension should mirror parseHTML by
normalizing attributes.targetId before serializing: trim the string and treat
empty/whitespace-only results as absent; in renderHTML (which currently reads
attributes.targetId) call .trim(), check length > 0, and only return {
"data-target-id": trimmed } when non-empty, otherwise return {} so serialization
round-trips consistently with parseHTML.
src/components/editor/extensions/TagExtension.test.ts (1)

246-251: Consider asserting whitespace-only data-target-id normalization too.

You already cover ""; adding " " would fully lock the trim-to-null behavior introduced in the parser.

✅ Suggested test addition
       const empty = document.createElement("span");
       expect(spec.parseHTML(empty)).toBeNull();

       empty.setAttribute("data-target-id", "");
       expect(spec.parseHTML(empty)).toBeNull();
+
+      empty.setAttribute("data-target-id", "   ");
+      expect(spec.parseHTML(empty)).toBeNull();
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/editor/extensions/TagExtension.test.ts` around lines 246 -
251, Add a test case to assert that spec.parseHTML trims whitespace-only values
for the data-target-id attribute and returns null for them; specifically, after
creating the empty span and before finishing the current test, set
empty.setAttribute("data-target-id", "   ") and
expect(spec.parseHTML(empty)).toBeNull() to verify the trim-to-null
normalization implemented in parseHTML.
src/components/editor/extensions/WikiLinkExtension.test.ts (1)

134-139: Add a whitespace-only data-target-id parse assertion.

parseHTML now trims values, so pinning " "null here would protect against regressions beyond just "".

✅ Suggested test addition
       const empty = document.createElement("span");
       expect(spec.parseHTML(empty)).toBeNull();

       empty.setAttribute("data-target-id", "");
       expect(spec.parseHTML(empty)).toBeNull();
+
+      empty.setAttribute("data-target-id", "   ");
+      expect(spec.parseHTML(empty)).toBeNull();
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/editor/extensions/WikiLinkExtension.test.ts` around lines 134
- 139, The test currently asserts that an empty data-target-id string returns
null; add an assertion that a whitespace-only value also returns null to guard
against regressions in trimming logic: set the span's data-target-id to a string
of spaces (e.g., "  ") and call spec.parseHTML(empty) expect it toBeNull().
Refer to the existing test variable empty and the spec.parseHTML function in
WikiLinkExtension.test.ts when adding this assertion.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@server/api/src/lib/extractPlainTextFromYXml.ts`:
- Around line 76-77: Replace the magic ellipsis string ("...") in the return of
the function that computes preview text with the shared suffix constant used
elsewhere to avoid drift; locate the logic around CONTENT_PREVIEW_MAX_LENGTH and
headLength in extractPlainTextFromYXml.ts and return the trimmed slice
concatenated with the existing SUFFIX constant (or a similarly named
PREVIEW_SUFFIX used in the Hocuspocus copy) instead of the literal "..." so both
mirrored implementations use the same suffix symbol.

In `@server/hocuspocus/src/extractPlainTextFromYXml.test.ts`:
- Line 143: The test currently hardcodes the preview length check with
expect(prev.length).toBeLessThanOrEqual(120); — replace the literal with the
exported constant CONTENT_PREVIEW_MAX_LENGTH by importing it into the test file
and using expect(prev.length).toBeLessThanOrEqual(CONTENT_PREVIEW_MAX_LENGTH);
so the spec follows the implementation constant (ensure the import name matches
the exported symbol).

In `@server/hocuspocus/src/extractPlainTextFromYXml.ts`:
- Around line 75-76: The truncation logic in extractPlainTextFromYXml.ts uses
two hardcoded values (3 and "...") which can drift; introduce a single suffix
constant (e.g., const ELLIPSIS = "..." or const SUFFIX = "...") and derive the
head length from CONTENT_PREVIEW_MAX_LENGTH - ELLIPSIS.length, then use that
suffix constant in the template return instead of the literal "..." (update the
variables headLength and the return string in the function that computes the
preview).

In `@src/components/editor/extensions/TagExtension.test.ts`:
- Around line 246-251: Add a test case to assert that spec.parseHTML trims
whitespace-only values for the data-target-id attribute and returns null for
them; specifically, after creating the empty span and before finishing the
current test, set empty.setAttribute("data-target-id", "   ") and
expect(spec.parseHTML(empty)).toBeNull() to verify the trim-to-null
normalization implemented in parseHTML.

In `@src/components/editor/extensions/TagExtension.ts`:
- Around line 170-182: The renderHTML in TagExtension currently serializes
attributes.targetId verbatim; update renderHTML to mirror parseHTML by first
checking typeof attributes.targetId === "string", then creating a normalized =
attributes.targetId.trim(), and only return { "data-target-id": normalized }
when normalized.length > 0 (otherwise return {}). This keeps
TagExtension.renderHTML behavior consistent with parseHTML and avoids writing
whitespace-only data-target-id values.

In `@src/components/editor/extensions/WikiLinkExtension.test.ts`:
- Around line 134-139: The test currently asserts that an empty data-target-id
string returns null; add an assertion that a whitespace-only value also returns
null to guard against regressions in trimming logic: set the span's
data-target-id to a string of spaces (e.g., "  ") and call spec.parseHTML(empty)
expect it toBeNull(). Refer to the existing test variable empty and the
spec.parseHTML function in WikiLinkExtension.test.ts when adding this assertion.

In `@src/components/editor/extensions/WikiLinkExtension.ts`:
- Around line 121-133: The renderHTML logic for WikiLinkExtension should mirror
parseHTML by normalizing attributes.targetId before serializing: trim the string
and treat empty/whitespace-only results as absent; in renderHTML (which
currently reads attributes.targetId) call .trim(), check length > 0, and only
return { "data-target-id": trimmed } when non-empty, otherwise return {} so
serialization round-trips consistently with parseHTML.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 573367c1-ed70-4333-a386-7c9f09bfeecb

📥 Commits

Reviewing files that changed from the base of the PR and between 6ca7ab8 and 7775d9b.

📒 Files selected for processing (15)
  • AGENTS.md
  • server/api/src/lib/extractPlainTextFromYXml.ts
  • server/hocuspocus/src/extractPlainTextFromYXml.test.ts
  • server/hocuspocus/src/extractPlainTextFromYXml.ts
  • src/components/editor/TiptapEditor/useWikiLinkStatusSync.test.tsx
  • src/components/editor/extensions/TagExtension.test.ts
  • src/components/editor/extensions/TagExtension.ts
  • src/components/editor/extensions/WikiLinkExtension.test.ts
  • src/components/editor/extensions/WikiLinkExtension.ts
  • src/components/editor/extensions/slashSuggestionPlugin.test.ts
  • src/hooks/useMermaidGenerator.test.ts
  • src/hooks/useWorkflowDraft.test.ts
  • src/hooks/useWorkflowRunSession.test.ts
  • src/lib/aiServiceServer.test.ts
  • src/stores/aiChatStore.test.ts

@devin-ai-integration devin-ai-integration 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.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no potential bugs to report.

View in Devin Review to see 3 additional findings.

Open in Devin Review

@otomatty
otomatty merged commit 68e7de5 into develop Apr 26, 2026
17 checks passed
@otomatty
otomatty deleted the fix/pr-757-review branch April 26, 2026 12:37
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.

1 participant