Skip to content

feat: @ operator for file/directory search suggestions (SEA-83)#683

Open
fluxdiv wants to merge 13 commits into
mainfrom
06-22-sea-83
Open

feat: @ operator for file/directory search suggestions (SEA-83)#683
fluxdiv wants to merge 13 commits into
mainfrom
06-22-sea-83

Conversation

@fluxdiv

@fluxdiv fluxdiv commented Jun 23, 2026

Copy link
Copy Markdown
Collaborator

Pull request

Summary

Adds @-path mention autocomplete to the TUI composer. Typing @ followed by a path prefix opens a popup menu showing matching files and directories from the project root, with keyboard navigation and completion. A new [tui] path_mentions_respect_gitignore config option (default true) controls whether .gitignore rules are applied when building the file index.

Related issues

Refs #83

Changes

  • Introduces path_mentions module with PathMentionIndex, PathMentionPopupState, and active_path_mention — covering index building, prefix querying with priority ordering (same-level dirs → same-level files → descendant dirs → descendant files), and popup lifecycle (open, navigate, dismiss, insert).
  • Adds a .gitignore parser supporting negation, directory-only rules, anchored patterns, glob wildcards (*, ?, **), and inherited rules across subdirectories.
  • Spawns a background blocking task to build the path index on startup and refreshes it every 30 seconds via spawn_path_mention_index.
  • Wires popup key handling into ChatState::handle_key: Up/Down navigate, Enter/Tab insert the selected entry (appending a space), Esc dismisses for the current token.
  • Adds Composer::replace_range to support in-place token substitution with cursor repositioning.
  • Renders the path mention popup in the same suggestion slot as slash commands, suppressing slash suggestions while the path popup is visible.
  • Adds path_mentions_respect_gitignore to TuiConfig, TuiConfigFile, HostContext, config merging, JSON schema, and documentation.

Test plan

  • Unit tests in path_mentions cover: active_path_mention detection (bare @, path prefix, mid-token cursor, last-@-in-token), query ordering and overflow, prefix-only matching, .gitignore respect vs. ignore, directory-only rules, and negation.
  • Integration tests in app cover: popup opens on matching prefix, stays hidden with no matches, and Enter inserts the selected path and clears the @ sigil.
  • Config tests verify path_mentions_respect_gitignore defaults to true and that a local config overrides a global config value.

Notes for reviewers

  • Symlinks are skipped during directory walking to avoid cycles.
  • The popup is suppressed (not shown) when the current token has been explicitly dismissed via Esc; dismissal is cleared on the next insertion or when the token changes.
  • Path mention popup takes priority over slash command suggestions in the renderer; both cannot be visible simultaneously.
file_menu_demo.mp4

@linear-code

linear-code Bot commented Jun 23, 2026

Copy link
Copy Markdown

SEA-83

@coderabbitai

coderabbitai Bot commented Jun 23, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds @ path mention autocomplete to the TUI chat composer. A new path_mentions module implements a filesystem-backed PathMentionIndex with optional .gitignore filtering, active-mention parsing, popup state management, and comprehensive query/pagination logic. A background task in the run loop periodically rebuilds the index. ChatState gains keyboard routing for the popup, Composer gains replace_range for text substitution, the renderer displays the suggestion popup, and a new path_mentions_respect_gitignore config knob controls gitignore behavior.

Changes

@ Path Mention Autocomplete

Layer / File(s) Summary
Configuration, wiring, and dependencies
Cargo.toml, crates/seal-runtime/Cargo.toml, crates/seal-tui/Cargo.toml, crates/seal-cli/src/cli/config.rs, crates/seal-cli/src/main.rs, crates/seal-tui/src/chat/host.rs, schemas/config.toml.json, docs/site/src/content/docs/reference/config-reference.mdx
Adds path_mentions_respect_gitignore: bool (default true) to TuiConfig with field, default, and config merge logic. Wires into HostContext and test helpers. Adds ignore crate to workspace and seal-tui/seal-runtime dependencies. Updates JSON schema defaults, TuiConfig schema definition, CLI config file schema, and config reference documentation.
Path mention types, index, and query ranking
crates/seal-tui/src/lib.rs, crates/seal-tui/src/path_mentions.rs (types and index)
Declares the path_mentions module. Defines PathMentionKind, PathMentionEntry, ActivePathMention, and PathMentionQueryResult. Implements PathMentionIndex with filesystem-based build, in-memory construction, and prefix-based query APIs with pagination and overflow counts. Includes ranking helpers prioritizing same-level directories and directories over files.
Active mention parsing, directory traversal, and popup state
crates/seal-tui/src/path_mentions.rs (parsing, traversal, popup, tests)
Implements active_path_mention parsing with cursor/UTF-8 validation. Implements walk_dir with configurable .gitignore support and VCS metadata skipping. Implements PathMentionPopupState with visibility, sync, selection navigation, and dismissal tracking. Includes comprehensive tests for parsing edge cases, query ordering, prefix matching, pagination, popup scrolling, and gitignore behaviors.
Background periodic index rebuild in run_loop
crates/seal-tui/src/chat/runloop.rs
Introduces PATH_MENTION_REFRESH_INTERVAL constant and spawn_path_mention_index helper. Wires initial build at startup, drains completed results in main loop, applies updates, and reschedules after configured interval elapses.
ChatState fields, keyboard routing, and composer text replacement
crates/seal-tui/src/composer.rs, crates/seal-tui/src/app.rs
Adds Composer::replace_range for in-place text substitution. Extends ChatState with path-mention fields, keyboard routing (Esc dismiss, Up/Down navigate, Enter/Tab insert), and popup sync integration. Includes new public set_path_mention_index mutator and tests for popup visibility and insertion.
Renderer: path mention popup display and layout integration
crates/seal-tui/src/renderer.rs
Adds render_path_mention_suggestions with selection highlighting, overflow footer, and padding. Updates draw_with_context to suppress slash suggestions when path-mention popup is active, derives popup height for layout, recalculates chunk indices, and dispatches to either popup or slash-command renderer.

Sequence Diagram(s)

sequenceDiagram
  rect rgba(173, 216, 230, 0.5)
    Note over User,Renderer: @ path mention autocomplete flow
  end
  participant User
  participant ChatState
  participant PopupState as PathMentionPopupState
  participant Index as PathMentionIndex
  participant Composer
  participant Renderer

  User->>ChatState: text input or @
  ChatState->>Composer: update text
  ChatState->>PopupState: sync(text, cursor, index)
  PopupState->>Index: query_window(query, offset, limit)
  Index-->>PopupState: QueryResult (matches, overflow)
  PopupState-->>ChatState: popup visible with matches
  ChatState->>Renderer: mark dirty
  Renderer-->>User: render path mention popup

  User->>ChatState: Up/Down arrow
  ChatState->>PopupState: select_next/select_previous
  PopupState-->>ChatState: selection updated
  ChatState->>Renderer: mark dirty

  User->>ChatState: Enter or Tab
  ChatState->>PopupState: selected_entry()
  PopupState-->>ChatState: PathMentionEntry
  ChatState->>Composer: replace_range(range, insertion_text + " ")
  ChatState->>PopupState: clear_dismissed, sync
  ChatState->>Renderer: mark dirty
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Poem

🐇 Hippity-hop, I type an @,
A fuzzy popup blooms my way!
Through .gitignore rules I creep,
Indexing files while you sleep.
Dirs get a /, files get none —
Path mentions done, the rabbit's won! 🌿

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the main feature being added: an @ operator for file/directory search suggestions in the TUI composer.
Description check ✅ Passed The description is comprehensive and directly related to the changeset, covering the implementation details, configuration option, test plan, and notes for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 86.36% 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 unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 06-22-sea-83

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

fluxdiv commented Jun 23, 2026

Copy link
Copy Markdown
Collaborator Author

How to use the Graphite Merge Queue

Add either label to this PR to merge it via the merge queue:

  • Merge Queue - adds this PR to the back of the merge queue
  • Merge Queue Fast Track - for urgent changes, fast-track this PR to the front of the merge queue

You must have a Graphite account in order to use the merge queue. Sign up using this link.

An organization admin has required the Graphite Merge Queue in this repository.

Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.

This stack of pull requests is managed by Graphite. Learn more about stacking.

@sealedsecurity-ci

Copy link
Copy Markdown

Docs preview: https://06-22-sea-83.seal-docs.pages.dev

@fluxdiv fluxdiv marked this pull request as ready for review June 23, 2026 23:16
@fluxdiv fluxdiv requested a review from mattwilkinsonn as a code owner June 23, 2026 23:16
@greptile-apps

greptile-apps Bot commented Jun 23, 2026

Copy link
Copy Markdown

Greptile Summary

Adds @-path mention autocomplete to the TUI composer: typing @ opens a prioritised popup of matching files and directories, navigable with Up/Down/Enter/Tab/Esc, backed by a background index that rebuilds every 30 seconds and respects .gitignore by default.

  • path_mentions.rs introduces PathMentionIndex (prefix binary search + four-bucket priority ordering), PathMentionPopupState (windowed selection, dismissal-per-token), and active_path_mention (byte-accurate token detection with cursor-in-middle support); the ignore crate's WalkBuilder handles gitignore rules and symlink skipping, while a new filter_entry guard prunes .git, .hg, and .svn directories before recursion (addressing the previous review thread).
  • Previous feedback on display_path().len() being byte-length for multi-byte filenames is resolved: the renderer now uses UnicodeWidthStr::width throughout.
  • Config, schema, and docs are updated consistently; the ignore crate is promoted to a workspace dependency, consolidating it with seal-runtime's existing pin.

Confidence Score: 5/5

Safe to merge; the new path-mention feature is isolated from existing flows and all edge cases are covered by the included tests.

Background index building is off the main thread, the single-threaded event loop avoids races, byte/char boundary handling is consistent throughout active_path_mention and replace_range, and the two previously flagged issues are both resolved in this revision.

path_mentions.rs walk_dir loop body — git-worktree .git files pass the current directory-only guard and would appear as completions in worktree setups.

Important Files Changed

Filename Overview
crates/seal-tui/src/path_mentions.rs New core module: PathMentionIndex, popup lifecycle, active-mention detection, and walk logic. Well-tested, correct byte/char boundary handling, VCS metadata dirs excluded, Unicode width addressed in renderer.
crates/seal-tui/src/app.rs Integrates path mention popup into ChatState key handling; paste-FSM is ticked before delegating to popup keys so paste detection stays accurate; sync_path_mention_popup called after all mutations.
crates/seal-tui/src/chat/runloop.rs Spawns blocking index build on startup and refreshes every 30 s; building flag prevents double-spawn; JoinError is handled and sends Failed so the flag always clears.
crates/seal-tui/src/renderer.rs Adds path-mention suggestion panel; uses UnicodeWidthStr for column alignment (previous review concern addressed); path popup suppresses slash suggestions correctly.
crates/seal-tui/src/composer.rs Adds replace_range; byte-range consistency with active_path_mention is maintained; cursor placed correctly at range.start + replacement byte length.
crates/seal-cli/src/cli/config.rs Standard config plumbing for path_mentions_respect_gitignore with correct default (true), merge logic, and two new tests covering default and override cases.
crates/seal-tui/src/chat/host.rs Adds path_mentions_respect_gitignore to HostContext with correct default of true.

Reviews (8): Last reviewed commit: "fix: keep selected path mention always v..." | Re-trigger Greptile

Comment thread crates/seal-tui/src/path_mentions.rs Outdated
Comment thread crates/seal-tui/src/renderer.rs

@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.

Actionable comments posted: 6

🤖 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.

Inline comments:
In `@crates/seal-tui/src/app.rs`:
- Around line 439-441: The popup handler handle_path_mention_popup_keys is
running before handle_composer_keys, which allows Enter to complete path
suggestions even when paste mode FSM would treat it as a pasted newline. Reorder
these handler calls so that handle_composer_keys runs before
handle_path_mention_popup_keys to ensure paste-mode Enter is routed through
newline insertion first. Additionally, update the test cases mentioned in the
"Also applies to" section that are currently using ChatState::new() to instead
use ready_app() or explicitly configure paste-FSM settings to opt out of paste
detection, so tests do not rely on this bypass behavior.
- Around line 455-472: The ChatState::handle_paste method mutates composer.text
and composer.cursor without calling sync_path_mention_popup(), which leaves
stale path mention suggestions rendered when pasting over an active mention.
Locate the handle_paste method and ensure it calls sync_path_mention_popup()
after any mutations to composer.text or composer.cursor, following the same
pattern used in other methods like set_path_mention_index that also modify the
composer state.

In `@crates/seal-tui/src/chat/runloop.rs`:
- Around line 161-179: The spawn_path_mention_index function only sends a
message through the tx channel when index building succeeds, but when the error
path is hit at the Err(err) branch, no message is sent, leaving the
path_index_building flag permanently set to true and preventing periodic
rebuilds. Fix this by sending a message through the tx channel in the error case
as well, allowing the calling code to reset the path_index_building flag and
resume periodic rebuild attempts instead of stalling indefinitely.

In `@crates/seal-tui/src/path_mentions.rs`:
- Around line 89-131: The query_window method performs inefficient repeated
scans of the prefix_range on every keystroke, calculating bucket_totals by
iterating the entire range and then iterating again per bucket. This causes O(N)
performance on large repositories. To fix this, either precompute the bucket and
level metadata for each entry at construction time (storing it directly in the
entry structure) so it's immediately available without recalculation, or
refactor the logic to only compute the necessary bucket totals incrementally up
to the limit required, avoiding the need to scan and count the entire range
upfront. This will keep the hot path bounded by the limit parameter rather than
the total index size.
- Around line 254-269: The refresh_matches function fails to re-query the index
after clamping window_start to 0 when the result is empty, leaving the matches
list empty and causing the popup to disappear. After the condition checking if
self.matches.is_empty() resets window_start, selected, and overflow_count to 0,
add another call to index.query_window with the corrected window_start value of
0 and update self.matches and self.total_count with the new results before
returning, so valid matches at the new offset are properly displayed.

In `@crates/seal-tui/src/renderer.rs`:
- Around line 152-168: The renderer in the visible_matches assignment ignores
the window_start field from PathMentionPopupState, always displaying the first
item_rows matches instead of the scrolled window. To fix this, add a public
accessor method in PathMentionPopupState that returns the starting index
accounting for window_start, or use it directly if already exposed. Then in the
renderer, replace the take(item_rows) call to instead skip(window_start) before
taking the items, and adjust the idx comparison in the enumerate callback to use
the offset-adjusted index (idx + window_start) when comparing against
popup.selected to ensure the highlighted item remains visible and consistent
with the selection.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 35c8fd81-89e0-4e11-9b0f-fcacc82357a1

📥 Commits

Reviewing files that changed from the base of the PR and between be3410a and cca74e0.

📒 Files selected for processing (11)
  • crates/seal-cli/src/cli/config.rs
  • crates/seal-cli/src/main.rs
  • crates/seal-tui/src/app.rs
  • crates/seal-tui/src/chat/host.rs
  • crates/seal-tui/src/chat/runloop.rs
  • crates/seal-tui/src/composer.rs
  • crates/seal-tui/src/lib.rs
  • crates/seal-tui/src/path_mentions.rs
  • crates/seal-tui/src/renderer.rs
  • docs/site/src/content/docs/reference/config-reference.mdx
  • schemas/config.toml.json

Comment thread crates/seal-tui/src/app.rs
Comment thread crates/seal-tui/src/app.rs
Comment thread crates/seal-tui/src/chat/runloop.rs
Comment thread crates/seal-tui/src/path_mentions.rs
Comment thread crates/seal-tui/src/path_mentions.rs
Comment thread crates/seal-tui/src/renderer.rs
Comment thread crates/seal-tui/src/chat/runloop.rs

@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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
crates/seal-tui/src/path_mentions.rs (1)

333-384: 🩺 Stability & Availability | 🟡 Minor

Add recursion depth guard to walk_dir to prevent stack overflow on pathologically nested directories.

The walk_dir function recurses per subdirectory (line 381) without a depth limit. Sufficiently deep directory trees—or vendored subtrees like node_modules when respect_gitignore=false—can exhaust the stack. In Rust, stack overflow aborts the entire process rather than returning an error. Symlinks are already skipped, so cycles are not a risk; unbounded depth is.

Add a depth parameter with a constant max depth (e.g., const MAX_WALK_DEPTH: usize = 64;), check at entry, and increment on recursion.

Proposed fix (update both `build` caller at line 62 and recursive call at line 381)
 fn walk_dir(
     dir: &Path,
     rel_dir: &str,
     respect_gitignore: bool,
     inherited_rules: &[IgnoreRule],
     entries: &mut Vec<PathMentionEntry>,
+    depth: usize,
 ) {
+    if depth >= MAX_WALK_DEPTH {
+        return;
+    }
     let mut rules = inherited_rules.to_vec();
     // ...
     if is_dir {
         let child = entry.path();
-        walk_dir(&child, &rel, respect_gitignore, &rules, entries);
+        walk_dir(&child, &rel, respect_gitignore, &rules, entries, depth + 1);
     }

Pass 0 from the build caller (line 62).

🤖 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 `@crates/seal-tui/src/path_mentions.rs` around lines 333 - 384, The `walk_dir`
function recurses without depth limits, which can cause stack overflow on deeply
nested directories. Add a `depth` parameter to the `walk_dir` function
signature, define a constant `MAX_WALK_DEPTH` set to 64, and check at the
beginning of the function to return early if depth exceeds this limit. Increment
the depth parameter by 1 when making the recursive call to `walk_dir` at the
current line 381. Finally, update the initial call to `walk_dir` in the `build`
function to pass 0 as the starting depth value.
🤖 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.

Outside diff comments:
In `@crates/seal-tui/src/path_mentions.rs`:
- Around line 333-384: The `walk_dir` function recurses without depth limits,
which can cause stack overflow on deeply nested directories. Add a `depth`
parameter to the `walk_dir` function signature, define a constant
`MAX_WALK_DEPTH` set to 64, and check at the beginning of the function to return
early if depth exceeds this limit. Increment the depth parameter by 1 when
making the recursive call to `walk_dir` at the current line 381. Finally, update
the initial call to `walk_dir` in the `build` function to pass 0 as the starting
depth value.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 12d8b56a-d759-486e-96cd-03d52296556d

📥 Commits

Reviewing files that changed from the base of the PR and between cca74e0 and 8598577.

📒 Files selected for processing (3)
  • crates/seal-tui/src/app.rs
  • crates/seal-tui/src/path_mentions.rs
  • crates/seal-tui/src/renderer.rs

@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.

Actionable comments posted: 2

🤖 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.

Inline comments:
In `@crates/seal-tui/src/app.rs`:
- Around line 1583-1599: The test
`path_mention_enter_in_paste_mode_inserts_newline` is flaky because it relies on
timing-dependent FSM state transitions to enter paste mode. Instead of depending
on scheduler timing, explicitly set the paste mode to true before testing Enter
key routing. After setting the path mention index, directly set
`app.composer.paste_mode = true` before sending the key presses. This makes the
test deterministic by validating Enter key behavior in paste mode without
depending on sub-millisecond timing of the FSM state machine.

In `@crates/seal-tui/src/path_mentions.rs`:
- Around line 485-528: The custom glob matching implementation in
path_pattern_matches, match_segments, segment_pattern_matches, and
segment_match_inner only supports basic wildcards (*, ?, **) and does not handle
full .gitignore syntax like character classes or brace expansion, which could
cause sensitive files to leak into autocomplete if users expect these patterns
to work. Replace this custom implementation by adding the ignore crate (v0.4.26)
as a direct dependency in the seal-tui Cargo.toml and refactor the path matching
logic to use the ignore crate's built-in pattern matching, which provides
complete .gitignore semantics support.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 4b43537a-47e7-42f2-b05f-d687d1c1195f

📥 Commits

Reviewing files that changed from the base of the PR and between a3b80a4 and c30a5f6.

📒 Files selected for processing (11)
  • crates/seal-cli/src/cli/config.rs
  • crates/seal-cli/src/main.rs
  • crates/seal-tui/src/app.rs
  • crates/seal-tui/src/chat/host.rs
  • crates/seal-tui/src/chat/runloop.rs
  • crates/seal-tui/src/composer.rs
  • crates/seal-tui/src/lib.rs
  • crates/seal-tui/src/path_mentions.rs
  • crates/seal-tui/src/renderer.rs
  • docs/site/src/content/docs/reference/config-reference.mdx
  • schemas/config.toml.json

Comment thread crates/seal-tui/src/app.rs
Comment thread crates/seal-tui/src/path_mentions.rs Outdated
coderabbitai[bot]
coderabbitai Bot previously approved these changes Jun 24, 2026

@cubic-dev-ai cubic-dev-ai 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.

3 issues found across 15 files

Reply with feedback, questions, or to request a fix.

Fix all with cubic | Re-trigger cubic

Comment thread crates/seal-tui/src/chat/runloop.rs
Comment thread crates/seal-tui/src/renderer.rs Outdated
Comment thread crates/seal-tui/src/path_mentions.rs
coderabbitai[bot]
coderabbitai Bot previously approved these changes Jun 24, 2026
@fluxdiv fluxdiv changed the title feat: @ operator for file/directory search suggestions feat: @ operator for file/directory search suggestions (SEA-83) Jun 24, 2026
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