Conversation
Teardown now discovers and removes any devglide-* MCP registrations not in the current server map, plus cleans legacy ~/.claude/.mcp.json entries. Prevents stale entries from renamed/removed apps lingering.
- Shell: remove manual auto-scroll tracking (xterm handles it natively), focus first visible pane when active pane is hidden by project filter - Test: reduce noisy SSE reconnect logging - Voice TTS: replace boolean stop flag with session counter for reliable cancellation, add retry on cold WebSocket flake, simplify WSL playback - Dashboard: stop event propagation on project dropdown arrow keys, fix dropdown max-height and overflow
- Dashboard XSS: escape project name/path in innerHTML and attributes - SVG XSS: remove SVG from allowed MIME types, add nosniff + sandbox headers - Kanban attachment delete: fix stale __dirname path, use getUploadsDir(), add file cleanup to MCP delete tools - Workflow list: use nodeCount/edgeCount instead of .length on missing arrays - Workflow update: add Zod validation to PUT route - Log path semantics: extract shared safeLogPath(), fix MCP tool descriptions
- Markdown XSS: add sanitizeHtml() to ui-utils, wrap all marked.parse() outputs, add link/image renderer overrides blocking dangerous protocols - Symlink traversal: add realpath() resolution to coder safePath() and shell preview route, with ancestor walking for write targets - Whisper integrity: add SHA-256 verification for prebuilt binary downloads (placeholder hashes — replace before shipping) - SSRF: create shared ssrf-guard with DNS resolution check and manual redirect following, replace local isBlockedUrl() in http-executor and shell proxy
- Priority enums: unify REST VALID_PRIORITIES to [LOW, MEDIUM, HIGH, URGENT] matching MCP tools and UI - TTS: remove CJS require() in ESM context, scope uncaughtException and unhandledRejection handlers to TTS-related errors only - Frontend escaping: add shared escapeHtml/escapeAttr to voice page, remove local duplicates; test and shell pages confirmed safe (DOM APIs only)
- Shared domain contracts: add KANBAN_PRIORITIES, KANBAN_ITEM_TYPES, KANBAN_DEFAULT_COLUMNS to shared-types; update all consumers - Centralize helpers: features.ts imports DEFAULT_COLUMNS from mcp-helpers - Module structure: delete vestigial coder/server.js and keymap/server.js, clean up their package.json files - Error handling: create shared asyncHandler/errorHandler middleware, mount in server.ts after all routers - Type discipline: add AttachmentRow/CountRow/MaxOrderRow to db.ts, replace 8 as-any casts in kanban tools with proper types - Request validation: infrastructure in place, pattern established
- issues.ts: add Zod schemas (create, update, reorder, content) and migrate 5 handlers to safeParse; replace 2 as-any casts - features.ts: add Zod schemas (create, update) and migrate 2 handlers to safeParse; replace 5 as-any casts with proper row types - attachments.ts: replace 2 as-any casts with inline attachment types
- Shell: deduplicate standalone MCP with router modules — add ShellEmitter interface, refactor spawnGlobalPty to accept emitter param, rewrite standalone index.ts to import from pty-manager/shell-config/shell-state, remove duplicated killPty from mcp.ts - Kanban: add Zod schemas to issues.ts (5 handlers) and features.ts (2 handlers), replacing manual validation with safeParse - Types: replace 9 remaining as-any casts in kanban routes with proper row types
- Remove process-level TTS error hooks; rely on try/catch + Node defaults - Add Zod validation to all remaining HTTP routes (shell, coder, kanban GET, features params, workflow params/queries) - Replace bare res.status().end() with structured JSON in log routes - Remove any/as-any in workflow, voice, mcp-utils (typed OpenAI interfaces, McpHttpRequest/ServerResponse) - Extract shared createShellMcpState() factory and shutdownAllPtys() for shell service boundary - Extract shared createKanbanItem() helper for kanban executor dedup - Add HTTPS IP pinning to SSRF guard via custom https.Agent with lookup callback - Compute real SHA-256 hashes for whisper prebuilt binaries - Escape modal button data in workflow frontend - Add server-side graph validation to workflow create/update routes - Move shell state/config/pty-manager to src/apps/shell/src/runtime/
New chat app (devglide-chat) enabling multiple LLM instances and users to communicate in a shared room via @mention addressing. Includes MCP server (5 tools), REST API, JSONL message persistence, PTY injection for message delivery, automatic pane lifecycle management, and Codex config integration.
…c filtering to chat Replace @mention-gated delivery with full broadcast — all messages now reach every participant, with @mentions serving as a semantic signal for who should act. Introduce per-project Rules of Engagement (returned on join, CRUD via REST) so LLMs know when to respond vs stay silent. Add detach/reclaim so participants survive MCP session restarts without losing their assigned name. Add #topic extraction, storage, filtering (API + dashboard dropdown), and sequential per-pane PTY delivery queues with epoch-based stale cancellation. Dashboard: rules editor overlay, topic badges, detached member indicators. Tests: chat-registry, chat-rules, chat-store, chat router.
…topics Shared-UI foundation: - Create src/packages/shared-ui/ with AppPage base class, createApi/createScopedQueries composition helpers, shared-ui.css (common primitives), and components (header, modal, toast, search-bar) - Wire /shared-ui static serving and CSS link in index.html Phase 2 migrations (prompts, vocabulary): - Replace duplicated api(), search, delete dialogs with shared-ui imports - Switch to shared CSS classes (group, entry-row, filter-select, search-input) - ~250 lines duplicated CSS removed Phase 3 migrations (chat, keymap, log, test): - Add createHeader() and app-page class to all 4 apps - Remove duplicated root/header/scrollbar CSS - Log keeps custom header for clickable brand (data-action) Chat improvements: - Replace random name pool with model-paneId naming (e.g. "claude-1") - Remove topics feature end-to-end (extraction, filtering, UI, API) - Add claim-confirmation requirement to engagement rules
Add search input (filters by name/description, debounced 150ms) and sort dropdown (name, issue count, recently updated) to the feature list header. Shows filtered count when search is active with empty state for no matches. State resets on unmount and project change.
Move search input from header-actions into a .board-search container below the header, matching the existing board view's search bar pattern. Adds clear button (x), reuses .search-bar/.search-input/.search-clear CSS classes from the board. Sort dropdown sits beside the search bar.
Extend _handleSearchKeydown to find both board and feature-list search inputs. The / shortcut now focuses whichever search is visible, and Escape clears the correct search state for each view.
Remove the unrequested sort dropdown. Feature list search now uses the exact same markup and CSS as the board search — just .board-search > .search-bar > .search-input + .search-clear. No extra controls.
Phase 4 shared-ui migration (composition pattern): - Coder: createApi, createHeader, confirmModal; removed custom toolbar + confirm dialog - Kanban: createHeader, confirmModal, shared-ui toast; replaced delete confirm dialogs - Shell: createHeader; socket-only app, minimal migration - Workflow: createApi, showModal/confirmModal, shared-ui toast; replaced custom modal/toast - Log: restored original root styles (opted out of app-page per user confirmation) - Fix duplicate const newBtn in workflow-list.js Chat: sort member list alphabetically in listParticipants()
Server automatically assigns one responder per unaddressed user message via round-robin. Eliminates claim spam and peer confirmation loops. - Add assignment state to chat-registry (round-robin, idle reassignment) - Broadcast assignedTo metadata on user messages - Show ON DECK / ACTIVE badges in member list and message rows - Simplify Rules of Engagement (respond if assigned or @mentioned) - 20s idle timeout with automatic reassignment - Explicit @mention bypasses auto-assignment - Add ChatAssignment type and isAssigned field to participants - Add regression tests for assignment, activation, reassignment
…to-dispatch" This reverts commit 87875d2.
Unaddressed messages: all LLMs can share research (planning mode). @mentioned LLM: only that LLM executes (execution mode). No claims, no auto-dispatch, no timers.
Chat registry, store, and PTY delivery now use explicit project IDs instead of relying on the global active-project singleton. This fixes cross-project leaks when the dashboard switches projects while LLMs remain joined to a different project's chat. Key changes: - Participant map keyed by (name, projectId) instead of just name - Join resolves project from pane metadata, not global state - Send, leave, detach, and deliverToPty all accept explicit projectId - chat-store reads/writes JSONL scoped to the sender's project - Pane numbering and limits scoped per project - Added tests for cross-project isolation and project switching
Chat: - Fix renderMessages() typo to renderAllMessages() for post-marked rerender - Add Mermaid.js chart rendering with dark DevGlide-themed SVG output - Mermaid placeholders survive sanitizeHtml, render after DOM insertion - securityLevel: strict pinned, CDN load failure falls back to code blocks - Add markdown rendering CSS (headings, tables, code blocks, blockquotes) - Gitignore articles/ folder for draft content Kanban: - Add cross-feature move and full-text search capabilities - Extend item tools, routes, DB helpers, and MCP helpers - Add tests for cross-feature moves and FTS search
- Make nowIso() monotonic: track last timestamp, bump by 1ms on collision so polling clients always detect mutations - Add order recalculation to HTTP PATCH cross-feature move path, matching the existing MCP tool behavior (append to end of destination column)
- Split large PTY writes into 1KB chunks with 50ms gaps to avoid buffer overflow and crossterm paste-burst detection - Adaptive submit delay: 500ms base + 1ms/char (capped at 5s) so long messages get more time before CR - Revalidate pane/session state between chunks to stop delivery if participant detaches or pane closes mid-burst - Add tests for long-message chunking and mid-burst detach
Investigation, analysis, and discussion do not imply implementation approval. Participants must wait for explicit execution instructions before making code changes, even when the fix is obvious.
Replace chat-assignment-only status with PTY output monitoring that reflects actual terminal activity. Each linked pane's output stream is watched to detect working state (nontrivial output) and awaiting-user state (known prompt patterns after quiescence). Delta-based scanning prevents stale prompts from re-triggering. Status precedence: reviewing > awaiting-user > working > idle.
Replace the old Planning/Execution two-mode rules with a comprehensive 10-section rules of engagement covering delivery model, discussion vs execution mode, assignment semantics, ownership, and reporting. Simplify chat member tag rendering by removing model name from display tags.
…g-user Merge the reviewing state into working since the distinction added complexity without actionable benefit. Add detection for LLM messages that ask @user a question, automatically setting status to awaiting-user. Allow PTY activity to override former review assignments and let awaiting-user take precedence when a prompt appears.
…er type error Update chat-rules test assertions to match the rewritten rules of engagement text. Remove the unimplemented topic filter test from the chat router. Fix TS2339 in the kanban PATCH handler where updateFields.order was assigned outside its inferred schema type.
… src/ layout Add devglide.manifest.json and scripts/check-structure.mjs to enforce monorepo structure conventions. The checker validates app entrypoints, package names, undeclared entries, MCP registry drift, and cross-app import boundaries. Wired into pnpm build alongside turbo build and build-mcp. Migrate chat, prompts, vocabulary, and workflow apps from root-level mcp.ts to canonical src/mcp.ts layout. Update all router and index.ts imports. Clean up stale artifacts (kanban/.next, server.log files).
Introduces two new store modules for the pipe-upgrade feature: - assignment-store: First-class Assignment entity with 9-state lifecycle (assigned→notified→acknowledged→payload_fetched→submitted, plus expired/reassigned/superseded/cancelled), state machine enforcement, optimistic concurrency, reassignment chains, stale access policy, TTL cleanup, event-sourced recovery, and injectable clock. - payload-store: Authoritative payload storage with SHA-256 integrity hashing, content versioning, 2MB size limit, soft-delete with metadata preservation, archive/GC lifecycle, bulk pipe archival, storage stats, event-sourced recovery, and injectable clock. Shared types (AssignmentStatus, PayloadStatus, transition rules) added to types.ts. 70 tests covering both modules.
1. Recovery timestamp fidelity: rehydrateFromEvents() in both assignment-store and payload-store now restores original event timestamps after replay instead of stamping fresh ones. This preserves TTL calculation accuracy, audit trail fidelity, and correct recovery semantics. 2. Add retryAssignment() that creates a new attempt for the same assignee, marking the old assignment as 'superseded'. This is distinct from reassignAssignment (which changes the assignee). The 'superseded' status is now reachable in the implementation. 5 new tests covering retry, superseded lifecycle, and timestamp fidelity during recovery. All 75 tests pass.
…cement Task q4enb4g6 — Enforce lease-aware submit/read authorization: - PIPE_LEASE_EXPIRED error code for expired-deadline rejection - isLeaseExpired() using injectable clock - submitStage() rejects submissions after lease deadline - readPipeOutput() rejects reads from expired-lease holders Task iwixg6lh — Client/tool contracts for assignment-based pipes: - pipe-assignment-queries.ts: getAssignmentsForParticipant(), getAssignmentForPipe() with lease status (active/expired/none), deadline, role visibility - pipe_list_assignments + pipe_get_assignment MCP tools (in mcp.ts) - GET /pipes/assignments + GET /pipes/:id/assignment REST endpoints (in chat.ts) - pipe_submit updated with optional assignmentId parameter 6 new tests covering lease expiry and assignment queries, all passing.
Remove duplicate ParticipantAssignment/getAssignmentsForParticipant from pipe-assignment-queries.ts — re-export from pipe-store.ts (authoritative). Only getAssignmentForPipe remains as new logic in the queries module.
…endpoints Review fixes for q4enb4g6 and iwixg6lh: - chat-registry.ts: lease-aware read guard in readPipeOutput() rejects expired-lease reads; listAssignments/getAssignment wrapper functions; import for pipe-assignment-queries - mcp.ts: pipe_list_assignments + pipe_get_assignment MCP tools; pipe_submit updated with optional assignmentId parameter - chat.ts router: GET /pipes/assignments + GET /pipes/:id/assignment REST endpoints; assignmentId added to submit schema Note: includes claude-13's delivery integration changes (storePayload, pipeDelivery hooks) and claude-11's reconnect recovery that were in the working tree at commit time.
…reminder - Add mobile FAB + bottom drawer for pipe monitoring on small screens - Extract removeDevglideSectionsFromToml into bin/codex-config.js with tests - Remove PTY_INTERACTION_REMINDER from chat delivery to LLM participants - Add listAssignments mock to chat router tests
Move mobile FAB/drawer render calls above desktop collapse guard so the mobile surface refreshes independently. Extract getMobilePipeFabState as a testable pure function and add 7 focused tests for FAB badge state and drawer data independence.
- Typography: introduce IBM Plex Mono as display font for brand, headings, modal titles — adds visual hierarchy distinct from JetBrains Mono body text - Sidebar: enhanced active indicator with inset glow, better hover states with border accent, CSS tooltips for truncated service names - Animations: page transition (df-view-enter) for app content, shimmer loading skeleton (df-skeleton), staggered list entrance (df-stagger), spinner for app loading state - Accessibility: skip-to-content link, ARIA labels on sidebar/main, focus-visible ring on service items for keyboard navigation - Mobile: 44px min touch targets on service items, project selector, project list items - Token enforcement: fix z-index values to use design tokens, replace hardcoded modal overlay color with token-based color-mix, remove fallback hex values from toast notification styles - Scrollbar: thin styled scrollbars on sidebar, service nav, dropdown
User requested removal of the mobile pipe monitoring drawer. Removes FAB button, overlay, drawer markup, all associated CSS, JS functions (renderMobilePipeFab, renderMobilePipeDrawerContent, openPipeDrawer, closePipeDrawer), getMobilePipeFabState helper, and 7 related tests.
Invite Agent: - Add "+" button in members toolbar to open invite modal - Fetches available CLIs from /invite/available API - Shows agent cards with permission mode launch buttons - Calls POST /invite to launch agent into chat room - Glassmorphism modal matching df-modal design system Rules of Engagement modal restyling: - Replace hardcoded colors with design tokens - Add glassmorphism (backdrop-filter blur), rounded corners - Use df-font-display for header typography - Add slide-up entrance animation - Fix z-index to use --df-z-index-overlay token - Align focus states with df-input patterns
…uto-accept The previous -a never flag only disabled Codex's own approval prompts but did not bypass the sandbox layer, preventing real file changes.
Remove invite-agent modal from chat UI and consolidate agent launching under shell's "Add LLM" button. Reorder shell mount() to wire UI events before xterm.js load so interactions work even if CDN fetch fails.
…ckground - Update design tokens: darker neutral scale (near-black base) + sky blue (#7dd3fc) replacing teal - Swap IBM Plex Mono fonts for Orbitron (headings) + Exo 2 (UI text) - Add animated aurora ambient blobs behind app shell
- Delivery now resolves recipients from `to` param plus body @mentions combined; `@all` is the explicit broadcast token - LLM messages with no recipients in either field are persisted but not PTY-delivered (token noise reduction) - `expandToRecipients` tracks unresolved @mention tokens (unknown names, offline agents, unsupported @team-* until Phase 2) - Dashboard shows inline warning on user messages when @mentions don't resolve: ⚠ @name not found — message not delivered via PTY - Status side-effects use concreteAssignees only — @ALL does not mark all agents as working - Option B migration: unaddressed user messages still broadcast - Updated MCP tool descriptions, Rules of Engagement (rule 11), and CLAUDE.md template to reflect new delivery semantics - Added @ALL to mention autocomplete with broadcast hint - Reduced font-size of empty pipes hint text
…nt UI Adds the full team orchestration layer to the chat app: Backend: - team-store: durable per-project team with member/role assignments - team-roles: built-in role templates (Tech Lead, Implementer, Reviewer, Tester, Kanban) - team-command-parser: /team slash command parser (create, run, add, remove, status, ...) - team-run-store/playbook: playbook dispatch and run tracking - team-safeguards: execution guard rails - team-pty-briefings: role briefing injection on chat_join - team-assist-router: intercept unaddressed imperatives in assist mode - chat.ts: /team REST endpoints, MCP team tools wired up UI (page.js / page.css): - Team panel: roster, proposals, run chip, pause/resume/disband controls - Members dialog: role assignment dropdown, × remove button on roster rows - Fixed participantName field lookup (was checking name/participant/member, missing participantName) - Added /team to slash-command hint popup - Members dialog: removed redundant Done button, moved Close to bottom-right footer
- Reduce member list and team roster density; remove row dividers - Flatten team proposals to inline rows with subtle separators - Normalize role/status chips to lighter token-based styling - Roles popup: remove Done button, move Close to bottom-right - disbandTeam: clear members array on disband - renderTeam: treat disbanded teams as no-team (hide card/badge/meta)
Removes the full team orchestration layer (team-assist-router, team-command-parser, team-pty-briefings, team-roles, team-run-playbook, team-run-store, team-safeguards, team-store) and replaces it with a lightweight capability-based role system. - roles.ts: new catalog with exclusive/multi cardinality, no handoff/delegation semantics - chat-registry: assignRole now validates the target is a connected LLM participant, preventing phantom holder assignments - mcp.ts: updated role tool descriptions to match new catalog (tech-lead, not planner) - page.js/css: Team panel removed, role assignment wired into Members list - 71/71 tests pass
Snapshot of in-flight work captured as a recoverable checkpoint before the role/team-orchestration layer is stripped: - chat: role expansion (queueRoleBriefing, deliverRoleBriefing, getParticipantRoleTemplate, role briefing reminder throttling, rule of engagement #12 "Stay in role scope", expanded #2/#3, scoped projectId on chat REST endpoints, mcp-session-id header on /roles/assign) - chat tests: new roles.test.ts, expanded chat-registry tests, expanded routers/chat tests - ui: design-tokens updates, src/public/style.css, page.css/js - docs/old/: 36 styleguide demo HTML pages - CLAUDE.md: scoped projectId chat REST documentation
Strips the persistent participant role layer from the chat system, restoring the chat surface to its pre-roles shape. The replacement coordination model will be designed in a follow-up brainstorm. Removed (role-only): - src/apps/chat/services/roles.ts - src/apps/chat/services/roles.test.ts - src/apps/chat/services/chat-registry.roles.test.ts Surgically stripped from shared files (non-role behavior preserved): - chat-registry.ts: removed assignRole/unassignRole, rolesByProject map, getParticipantRoleSlug/Template, queueRoleBriefing + deliverRoleBriefing + buildRoleBriefingBody, role briefings on join/reclaim/leave, Your role/Assigned by:user PTY header tags, role lookup in listParticipants. Lease watchdog, per-stage deadline timers, pipe machinery, targeted PTY delivery, and session unification all preserved. - chat-rules.ts: dropped rule #12 "Stay in role scope", removed Tech Lead / @Implementer references from rules #2/#3. - mcp.ts: removed role_assign / role_unassign / role_list_roles tools, removed role help text from instructions block, removed unused getChatMcpHttpSessionEntry helper. - pipe-delivery.ts: removed chatRole parameter and "| Your role: X" header suffix from formatCompactNotification. - types.ts: removed role field from ChatParticipant. - routers/chat.ts: removed /roles/templates, /roles/assign, and /roles/:participantName REST endpoints + listRoles/isValidRoleSlug imports. - public/page.js: removed _roleTemplates state, role select dropdown in member list, /roles/templates fetch on init, role assignment change handler. - public/page.css: removed .chat-member-role-select styles. Tests updated: - chat-registry.test.ts: removed role-related tests, simplified pty() helper to drop role/tech-lead authority options. - chat-rules.test.ts: removed Rule 12 / role-boundary contract test. - mcp.test.ts: removed role_list_roles + MCP-session-id role assign tests. - routers/chat.test.ts: removed self-role-assignment rejection test + role mock helpers. - pipe-delivery.test.ts: removed assignee-role compact-header test. Untouched: - All pipe primitives (pipe_submit, pipe_read_output, pipe_get_assignment, pipe_list_assignments) and pipe-stage role labels (fan-out, stage-output, final, etc. — pipe mechanism, not user persona). - Targeted PTY delivery + unresolved-target warning. - Lease watchdog + per-stage deadline enforcement in chat-registry.ts. - REST/MCP session unification, pane collision handling. - Per-project chat history JSONL and per-pipe JSONL. - Per-project rules-of-engagement override mechanism. Verification: - pnpm build: passes (type-check clean, all MCP bundles built). - chat test suite: 539 passing, 1 failing (the failing test — pipe-store.test.ts isLeaseExpired returns true when past deadline — is pre-existing on the WIP checkpoint and unrelated to roles). Migration: - Run `devglide teardown && devglide setup` after upgrade to refresh ~/.claude/CLAUDE.md if it carries stale role-coordination text. - Address by name (@claude-n, @codex-N) — no @Reviewer / @Implementer / @Tech-lead until the replacement design lands.
Defensive checkpoint so the upcoming KB removal is git-recoverable. Captures the untracked compose-lane work before deletion.
Removes the entire knowledge-base app, its routers, server mounts, MCP
registration, dashboard nav, manifest entries, and structural cleanup
machinery. The compose-lane wiki builder is gone with it.
Files deleted:
- src/apps/knowledge-base/ (entire app tree, 24 files)
- src/routers/knowledge-base.ts + 2 router test files
Files updated (line ending normalization or already restored to HEAD):
- src/server.ts: drop KB router import, static mount, API mount, MCP mount
- bin/devglide.js: drop knowledge-base from mcpServers
- bin/claude-md-template.js: drop devglide-knowledge-base + KB v2 sections
- devglide.manifest.json: drop knowledge-base app entry
- scripts/build-mcp.mjs: drop knowledge-base from servers list
- scripts/check-structure.mjs: keep hyphenated-key parser, drop KB example
- src/packages/paths.ts: drop KNOWLEDGE_BASE_DIR
- src/public/index.html: drop /app/knowledge-base/page.css link
- src/public/app.js: drop knowledge-base nav entry
- CLAUDE.md: drop Knowledge Base bullet, scoping table row, dir tree node
- pnpm-lock.yaml: regenerated after workspace removal
Verified post-removal:
- pnpm build (typecheck, structure check, MCP bundle build) — clean
- dist/mcp/knowledge-base.mjs stale bundle removed
- repo-wide grep across src/, bin/, scripts/, CLAUDE.md, manifest, package.json
— zero residual references
- global ~/.claude/CLAUDE.md devglide-knowledge-base section removed
The compose-lane work is preserved in checkpoint commit c752310 in case
recovery is wanted.
Feature/implement pipe
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.