Skip to content

fix(builder): allow Enter key to create new lines in Additional Info textareas (#763) - #788

Closed
Frankli9986 wants to merge 1 commit into
srbhr:mainfrom
Frankli9986:fix-763-textarea-enter-key
Closed

fix(builder): allow Enter key to create new lines in Additional Info textareas (#763)#788
Frankli9986 wants to merge 1 commit into
srbhr:mainfrom
Frankli9986:fix-763-textarea-enter-key

Conversation

@Frankli9986

@Frankli9986 Frankli9986 commented May 5, 2026

Copy link
Copy Markdown
Contributor

Closing: the underlying textarea/Enter-key fix was already merged via upstream main (see #763). The remaining branch changes were unrelated and have been cleaned up separately.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

3 issues found across 11 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="apps/frontend/components/resume/resume-two-column.tsx">

<violation number="1" location="apps/frontend/components/resume/resume-two-column.tsx:422">
P2: Section visibility checks use unfiltered array length, so whitespace-only additional fields can render empty sections with a title but no content</violation>
</file>

<file name="apps/frontend/components/resume/resume-single-column.tsx">

<violation number="1" location="apps/frontend/components/resume/resume-single-column.tsx:397">
P2: Whitespace-only additional items can still pass the raw length checks, so the section/rows render even though the joined display text is empty.</violation>
</file>

<file name="apps/backend/app/llm.py">

<violation number="1" location="apps/backend/app/llm.py:920">
P2: Removing DeepSeek's timeout multiplier regresses a supported provider by lowering its timeout budget from 1.3x to the default 1.0x, which can cause avoidable request timeouts.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Comment thread apps/frontend/components/resume/resume-two-column.tsx
Comment thread apps/frontend/components/resume/resume-single-column.tsx Outdated
Comment thread apps/backend/app/llm.py
Frankli9986 pushed a commit to Frankli9986/Resume-Matcher that referenced this pull request May 9, 2026
- Filter whitespace-only items in section visibility checks (two-column & single-column)

- Restore deepseek 1.3x timeout multiplier in llm.py
@Frankli9986
Frankli9986 force-pushed the fix-763-textarea-enter-key branch from 44640df to aebefdf Compare June 18, 2026 09:23
@Frankli9986
Frankli9986 force-pushed the fix-763-textarea-enter-key branch from aebefdf to b76abcf Compare June 18, 2026 09:24
detail="Confirmation required. Pass confirm=RESET_ALL_DATA in request body.",
)
await db.reset_database()
db.reset_database()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

CRITICAL: Missing await on async function call

db.reset_database() is defined as async def reset_database(self) (line 749 in database.py). Calling it without await creates a coroutine object that is never awaited — the database reset never executes. The endpoint returns success but no data is actually deleted. This was previously await db.reset_database().

Suggested change
db.reset_database()
await db.reset_database()

Reply with @kilocode-bot fix it to have Kilo Code address this issue.

cleaned = (request.api_base or "").strip()
stored["api_base"] = cleaned or None
if request.api_key is not None:
stored["api_key"] = request.api_key

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

WARNING: API key written to plaintext config

This writes the API key into config.json as plaintext via the stored dict. The previous version explicitly avoided writing API keys through this endpoint to prevent shadowing across providers. Now any API key sent to PUT /config/llm-api-key persists in plaintext on disk — weaker than the previous encrypted SQLite store.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

db.replace_api_keys(ciphertexts)
config = load_config_file()
config["api_keys"] = api_keys
save_config_file(config)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

WARNING: API keys persisted in plaintext to disk

save_config_file (line 38) now writes config directly to config.json without stripping api_keys. The previous version of save_config_file explicitly called config.pop('api_keys', None) and config.pop('api_key', None) before writing. All provider API keys are now stored as plaintext JSON on disk — a regression from the encrypted SQLite key store.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

@@ -403,25 +396,25 @@ const AdditionalSection: React.FC<{
{technicalSkills.length > 0 && (

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

SUGGESTION: Visibility check inconsistent with rendering — empty section headers possible

technicalSkills.length > 0 uses raw array length, but the rendering at line 399 uses technicalSkills.filter((s) => s.trim()).join(', '). If the array contains only empty/whitespace strings (e.g. from blank Enter lines), the condition is true but the rendered content is empty — causing an orphaned section label "Technical Skills:" with no value.

The same issue applies to languages, certificationsTraining, and awards in this component, and to the hasContent check at lines 384-388 which also uses raw .length > 0 instead of filtered length.

Consider filtering before the length check:

{technicalSkills.filter((s) => s.trim()).length > 0 && (

Reply with @kilocode-bot fix it to have Kilo Code address this issue.


{/* Awards Section */}
{isSectionVisible('additional') && awards.length > 0 && (
{isSectionVisible('additional') && additional?.awards && additional.awards.length > 0 && (

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

SUGGESTION: Awards visibility check inconsistent with rendering

additional.awards.length > 0 uses raw length, but the rendering at line 406 applies .filter((s) => s.trim()). If awards contains only empty strings, the section header "Awards" renders with an empty list. The certificationsTraining, technicalSkills, and languages checks in this same component use .filter((s) => s.trim()).length > 0 for consistency — awards should match.

Suggested change
{isSectionVisible('additional') && additional?.awards && additional.awards.length > 0 && (
{isSectionVisible('additional') && additional?.awards && additional.awards.filter((s) => s.trim()).length > 0 && (

Reply with @kilocode-bot fix it to have Kilo Code address this issue.

@kilo-code-bot

kilo-code-bot Bot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: 5 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 1
WARNING 2
SUGGESTION 2
Issue Details (click to expand)

CRITICAL

File Line Issue
apps/backend/app/routers/config.py 593 db.reset_database() missing await — the async function returns a coroutine that is never executed. Database reset endpoint silently does nothing.

WARNING

File Line Issue
apps/backend/app/routers/config.py 136 API key written to plaintext config.json via PUT /config/llm-api-key — reverts previous design that kept keys out of this endpoint.
apps/backend/app/config.py 59 save_api_keys_to_config persists API keys as plaintext JSON. Previous version of save_config_file stripped api_keys/api_key before writing.

SUGGESTION

File Line Issue
apps/frontend/components/resume/resume-modern.tsx 396 Visibility checks (technicalSkills.length > 0, hasContent at 384) use raw array length but rendering uses .filter((s) => s.trim()) — array of only empty strings shows orphaned section headers.
apps/frontend/components/resume/resume-modern-two-column.tsx 398 Awards visibility uses additional.awards.length > 0 (raw) while rendering uses .filter((s) => s.trim()) — inconsistent with the other sections in the same component.
Other Observations (not in diff)

Issues found in unchanged code that cannot receive inline comments:

File Line Issue
apps/frontend/components/resume/resume-modern.tsx 384-388 hasContent uses .length > 0 on raw arrays (not filtered), so a section with only empty/whitespace entries will render a header with no content.
apps/backend/app/database.py 749 reset_database is async def — any caller that drops the await creates a silent no-op. Consider adding type checking or a non-async wrapper.
Files Reviewed (10 files)
  • apps/backend/app/config.py - 1 issue (plaintext API key persistence)
  • apps/backend/app/routers/config.py - 2 issues (missing await, plaintext API key)
  • apps/backend/app/schemas/models.py - No issues
  • apps/frontend/app/(default)/settings/page.tsx - No issues
  • apps/frontend/components/builder/forms/additional-form.tsx - No issues
  • apps/frontend/components/resume/resume-modern-two-column.tsx - 1 issue
  • apps/frontend/components/resume/resume-modern.tsx - 1 issue
  • apps/frontend/components/resume/resume-single-column.tsx - No issues (filtering is consistent)
  • apps/frontend/components/resume/resume-two-column.tsx - No issues (filtering is consistent)
  • apps/frontend/lib/api/config.ts - No issues

Fix these issues in Kilo Cloud


Reviewed by qwen3.7-plus-20260602 · 633,075 tokens

@Frankli9986 Frankli9986 closed this Jul 9, 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