Skip to content

fix: WebUI form consistency, tasks, markdown#191

Open
iret77 wants to merge 3 commits into
mainfrom
fix/webui-form-and-layout
Open

fix: WebUI form consistency, tasks, markdown#191
iret77 wants to merge 3 commits into
mainfrom
fix/webui-form-and-layout

Conversation

@iret77

@iret77 iret77 commented Apr 8, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Select/Input height mismatch — explicit 38px height on all form controls
  • Project + Agent fields — now datalist dropdowns with autocomplete from /api/projects and /api/agents
  • Tags field — new /api/tags endpoint, datalist autocomplete from existing tags
  • Active Tasks — moved from invisible page-bottom (3rd column responsive collapse) into sidebar, always visible
  • Markdown rendering — detail view renders formatted Markdown instead of raw monospace <pre>
  • Layout — simplified from 3-column to 2-column (sidebar + content)

Test plan

  • New Entry form: select and input fields have identical heights
  • Project/Agent fields show autocomplete suggestions from existing data
  • Tags field suggests existing tags
  • Active Tasks visible in sidebar without scrolling to bottom
  • Entry detail view renders headings, bold, lists, code blocks as formatted HTML

🤖 Generated with Claude Code

- Fix select/input height mismatch in New Entry form (explicit 38px)
- Convert Project + Agent fields to datalist with autocomplete from API
- Add /api/tags endpoint + tags datalist for autocomplete
- Move Active Tasks from invisible page-bottom to sidebar (always visible)
- Render detail body as formatted Markdown instead of raw monospace
- Simplify layout from 3-column to 2-column (tasks now in sidebar)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@iret77

iret77 commented Apr 8, 2026

Copy link
Copy Markdown
Collaborator Author

🤖 Codex Review

OpenAI Codex v0.117.0 (research preview)

workdir: /home/dev/projects/palaia-plugin
model: gpt-5.4
provider: openai
approval: never
sandbox: read-only
reasoning effort: none
reasoning summaries: none
session id: 019d6cc8-c1f7-7180-aae7-0fd05bd18c0d

user
changes against 'origin/main'
→ Inspect diff against merge base
• Analyze changes for actionable bugs
• Return prioritized findings JSON
2026-04-08T11:09:59.832702Z ERROR codex_core::tools::router: error=exec_command failed for /bin/bash -lc 'git diff 198cc50fcb226021c886619aaefc995357207b46': CreateProcess { message: "Codex(Sandbox(Denied { output: ExecToolCallOutput { exit_code: 1, stdout: StreamOutput { text: "", truncated_after_lines: None }, stderr: StreamOutput { text: "bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted\n", truncated_after_lines: None }, aggregated_output: StreamOutput { text: "bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted\n", truncated_after_lines: None }, duration: 0ns, timed_out: false }, network_policy_decision: None }))" }
2026-04-08T11:10:04.395783Z ERROR codex_core::tools::router: error=exec_command failed for /bin/bash -c 'git diff 198cc50fcb226021c886619aaefc995357207b46': CreateProcess { message: "Codex(Sandbox(Denied { output: ExecToolCallOutput { exit_code: 1, stdout: StreamOutput { text: "", truncated_after_lines: None }, stderr: StreamOutput { text: "bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted\n", truncated_after_lines: None }, aggregated_output: StreamOutput { text: "bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted\n", truncated_after_lines: None }, duration: 0ns, timed_out: false }, network_policy_decision: None }))" }
2026-04-08T11:10:09.999188Z ERROR codex_core::tools::router: error=exec_command failed for /bin/sh -c pwd: CreateProcess { message: "Codex(Sandbox(Denied { output: ExecToolCallOutput { exit_code: 1, stdout: StreamOutput { text: "", truncated_after_lines: None }, stderr: StreamOutput { text: "bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted\n", truncated_after_lines: None }, aggregated_output: StreamOutput { text: "bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted\n", truncated_after_lines: None }, duration: 0ns, timed_out: false }, network_policy_decision: None }))" }
mcp: codex/list_mcp_resources started
mcp: codex/list_mcp_resources (completed)
mcp: codex_apps/github_search_installed_repositories_v2 started
mcp: codex_apps/github_search_installed_repositories_v2 (completed)
mcp: codex_apps/github_list_repositories started
mcp: codex_apps/github_list_repositories (completed)
mcp: codex_apps/github_search_repositories started
mcp: codex_apps/github_search_repositories (failed)
mcp: codex_apps/github_search_repositories started
mcp: codex_apps/github_search_repositories (failed)
mcp: codex_apps/github_search_repositories started
mcp: codex_apps/github_search_repositories (completed)
mcp: codex_apps/github_search_commits started
mcp: codex_apps/github_search_commits (completed)
mcp: codex_apps/github_get_user_login started
mcp: codex_apps/github_get_user_login (completed)
mcp: codex_apps/github_get_users_recent_prs_in_repo started
mcp: codex_apps/github_get_users_recent_prs_in_repo (completed)
mcp: codex_apps/github_search started
mcp: codex_apps/github_search (completed)
mcp: codex_apps/github_fetch_file started
mcp: codex_apps/github_fetch_file (completed)
mcp: codex_apps/github_fetch_file started
mcp: codex_apps/github_fetch_file (completed)
mcp: codex_apps/github_search started
mcp: codex_apps/github_search (completed)
mcp: codex_apps/github_search started
mcp: codex_apps/github_search (completed)
mcp: codex_apps/github_fetch_file started
mcp: codex_apps/github_fetch_file (completed)
✓ Inspect diff against merge base
✓ Analyze changes for actionable bugs
→ Return prioritized findings JSON
codex
The patch introduces a new scope-bypassing /api/tags endpoint and a Markdown code-fence parser that can delete the first line of valid content. Both are user-visible regressions that should be fixed before considering the change correct.

Full review comments:

  • [P2] Keep tag suggestions scoped to visible entries — /home/dev/projects/palaia-plugin/palaia/web/routes/status.py:103-106
    In multi-agent setups, this endpoint now enumerates tags from all_entries_unfiltered(), so the new autocomplete can reveal tags attached to entries the current agent cannot read (for example, private entries from another agent). The rest of the WebUI intentionally applies scope filtering, so /api/tags should do the same or users will learn about otherwise-hidden content just by opening the form.

  • [P2] Avoid stripping the first line of untyped fenced code blocks — /home/dev/projects/palaia-plugin/palaia/web/static/app.js:89-92
    The fenced-code renderer removes the first line whenever it is only word characters, because replace(/^\w*\n/, "") runs on every block after slice(3, -3). That is correct for a language hint like js, but it also drops real content from common blocks such as text with a first line like hello or SELECT, so some entry details will silently lose code/output lines in the new Markdown view.
    The patch introduces a new scope-bypassing /api/tags endpoint and a Markdown code-fence parser that can delete the first line of valid content. Both are user-visible regressions that should be fixed before considering the change correct.

Full review comments:

  • [P2] Keep tag suggestions scoped to visible entries — /home/dev/projects/palaia-plugin/palaia/web/routes/status.py:103-106
    In multi-agent setups, this endpoint now enumerates tags from all_entries_unfiltered(), so the new autocomplete can reveal tags attached to entries the current agent cannot read (for example, private entries from another agent). The rest of the WebUI intentionally applies scope filtering, so /api/tags should do the same or users will learn about otherwise-hidden content just by opening the form.

  • [P2] Avoid stripping the first line of untyped fenced code blocks — /home/dev/projects/palaia-plugin/palaia/web/static/app.js:89-92
    The fenced-code renderer removes the first line whenever it is only word characters, because replace(/^\w*\n/, "") runs on every block after slice(3, -3). That is correct for a language hint like js, but it also drops real content from common blocks such as text with a first line like hello or SELECT, so some entry details will silently lose code/output lines in the new Markdown view.


Automated review by OpenAI Codex on devhost

Entries now carry a source tag indicating how they were created:
- webui: created via WebUI (human, 1.3× boost)
- cli: created via palaia add/write (human, 1.3× boost)
- auto-capture: passively captured (no boost)
- no source tag: agent-created via MCP/tool (no boost)

Updates badge display, detail panel, and OpenClaw recall ranking.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@iret77

iret77 commented Apr 9, 2026

Copy link
Copy Markdown
Collaborator Author

🤖 Codex Review

OpenAI Codex v0.117.0 (research preview)

workdir: /home/dev/projects/palaia-plugin
model: gpt-5.4
provider: openai
approval: never
sandbox: read-only
reasoning effort: none
reasoning summaries: none
session id: 019d6fa3-fe45-7662-a176-9bb707971945

user
changes against 'origin/main'
2026-04-09T00:28:39.571152Z ERROR codex_core::tools::router: error=exec_command failed for /bin/bash -lc 'git diff 198cc50fcb226021c886619aaefc995357207b46': CreateProcess { message: "Codex(Sandbox(Denied { output: ExecToolCallOutput { exit_code: 1, stdout: StreamOutput { text: "", truncated_after_lines: None }, stderr: StreamOutput { text: "bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted\n", truncated_after_lines: None }, aggregated_output: StreamOutput { text: "bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted\n", truncated_after_lines: None }, duration: 0ns, timed_out: false }, network_policy_decision: None }))" }
2026-04-09T00:28:43.051427Z ERROR codex_core::tools::router: error=exec_command failed for /bin/bash -c 'git diff 198cc50fcb226021c886619aaefc995357207b46': CreateProcess { message: "Codex(Sandbox(Denied { output: ExecToolCallOutput { exit_code: 1, stdout: StreamOutput { text: "", truncated_after_lines: None }, stderr: StreamOutput { text: "bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted\n", truncated_after_lines: None }, aggregated_output: StreamOutput { text: "bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted\n", truncated_after_lines: None }, duration: 0ns, timed_out: false }, network_policy_decision: None }))" }
mcp: codex/list_mcp_resources started
mcp: codex/list_mcp_resources (completed)
mcp: codex_apps/github_search_repositories started
mcp: codex_apps/github_search_repositories (failed)
mcp: codex_apps/github_search_repositories started
mcp: codex_apps/github_search_repositories (completed)
mcp: codex_apps/github_list_repositories started
mcp: codex_apps/github_list_repositories (completed)
mcp: codex_apps/github_search_installed_repositories_v2 started
mcp: codex_apps/github_search_installed_repositories_v2 (completed)
mcp: codex_apps/github_search_repositories started
mcp: codex_apps/github_search_repositories (failed)
mcp: codex_apps/github_search_repositories started
mcp: codex_apps/github_search_repositories (completed)
mcp: codex_apps/github_search_commits started
mcp: codex_apps/github_search_commits (completed)
mcp: codex_apps/github_search_prs started
mcp: codex_apps/github_search_prs (completed)
mcp: codex_apps/github_fetch_pr_patch started
mcp: codex_apps/github_fetch_pr_patch (completed)
mcp: codex_apps/github_get_pr_info started
mcp: codex_apps/github_get_pr_info (completed)
mcp: codex_apps/github_fetch_file started
mcp: codex_apps/github_fetch_file (completed)
mcp: codex_apps/github_search started
mcp: codex_apps/github_search (completed)
mcp: codex_apps/github_fetch_file started
mcp: codex_apps/github_fetch_file (completed)
codex
The patch introduces regressions in source classification: legacy manual entries are reclassified as agent/unboosted, and search results no longer render the new source badges correctly. Those issues affect existing data and visible UI behavior after upgrade.

Full review comments:

  • [P1] Preserve manual boost for pre-source-tag entries — /home/dev/projects/palaia-plugin/packages/openclaw-plugin/src/hooks/recall.ts:379-381
    This changes the recall boost heuristic from “not auto-capture” to “has webui/cli tag”. Any entry created before this patch was stored without those source tags, so previously manual memories now lose their 1.3× boost and rank below auto-captured noise until they are rewritten. Unless there is a migration elsewhere, upgrading will immediately degrade recall quality for existing user-authored data.

  • [P2] Keep untagged legacy entries out of the new agent bucket — /home/dev/projects/palaia-plugin/palaia/web/routes/entries.py:61-68
    _detect_source() now treats every entry without webui/cli/auto-capture as agent, but older manual entries were also untagged. After upgrade, /api/entries, /api/search, and the detail view will misclassify those existing human-authored memories as agent/non-manual, and source=manual will silently stop matching them. This needs a backward-compatible fallback (or a data migration) before the source model changes.

  • [P2] Preserve source when rendering search result badges — /home/dev/projects/palaia-plugin/palaia/web/static/app.js:311-314
    The new badge rendering depends on e.source, but search-mode entries are still mapped without that property. As a result, every search hit falls back to the 'auto' label, and agent-authored hits also miss the new agent badge styling, even though /api/search now returns source. Please either pass r.source through in doSearch() or keep the old manual/auto fallback here.
    The patch introduces regressions in source classification: legacy manual entries are reclassified as agent/unboosted, and search results no longer render the new source badges correctly. Those issues affect existing data and visible UI behavior after upgrade.

Full review comments:

  • [P1] Preserve manual boost for pre-source-tag entries — /home/dev/projects/palaia-plugin/packages/openclaw-plugin/src/hooks/recall.ts:379-381
    This changes the recall boost heuristic from “not auto-capture” to “has webui/cli tag”. Any entry created before this patch was stored without those source tags, so previously manual memories now lose their 1.3× boost and rank below auto-captured noise until they are rewritten. Unless there is a migration elsewhere, upgrading will immediately degrade recall quality for existing user-authored data.

  • [P2] Keep untagged legacy entries out of the new agent bucket — /home/dev/projects/palaia-plugin/palaia/web/routes/entries.py:61-68
    _detect_source() now treats every entry without webui/cli/auto-capture as agent, but older manual entries were also untagged. After upgrade, /api/entries, /api/search, and the detail view will misclassify those existing human-authored memories as agent/non-manual, and source=manual will silently stop matching them. This needs a backward-compatible fallback (or a data migration) before the source model changes.

  • [P2] Preserve source when rendering search result badges — /home/dev/projects/palaia-plugin/palaia/web/static/app.js:311-314
    The new badge rendering depends on e.source, but search-mode entries are still mapped without that property. As a result, every search hit falls back to the 'auto' label, and agent-authored hits also miss the new agent badge styling, even though /api/search now returns source. Please either pass r.source through in doSearch() or keep the old manual/auto fallback here.


Automated review by OpenAI Codex on devhost

P0: Fix renderMarkdown double-encoding in code blocks (extract before
esc), resolve merge conflict from stash/pop.
P0: Filter webui/cli/auto-capture from edit form tag input.
P1: Add source field to search result JS mapping.
P1: Re-apply cli.py source tag injection (lost during stash/pop).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@iret77

iret77 commented Apr 9, 2026

Copy link
Copy Markdown
Collaborator Author

🤖 Codex Review

OpenAI Codex v0.117.0 (research preview)

workdir: /home/dev/projects/palaia-plugin
model: gpt-5.4
provider: openai
approval: never
sandbox: read-only
reasoning effort: none
reasoning summaries: none
session id: 019d71cc-62eb-7e10-a4e2-87fef4ca4ef5

user
changes against 'origin/main'
→ Inspect diff against merge base
• Analyze changed files for discrete bugs
• Produce prioritized review findings JSON
2026-04-09T10:32:02.295184Z ERROR codex_core::tools::router: error=exec_command failed for /bin/bash -lc 'git diff 198cc50fcb226021c886619aaefc995357207b46': CreateProcess { message: "Codex(Sandbox(Denied { output: ExecToolCallOutput { exit_code: 1, stdout: StreamOutput { text: "", truncated_after_lines: None }, stderr: StreamOutput { text: "bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted\n", truncated_after_lines: None }, aggregated_output: StreamOutput { text: "bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted\n", truncated_after_lines: None }, duration: 0ns, timed_out: false }, network_policy_decision: None }))" }
2026-04-09T10:32:08.313650Z ERROR codex_core::tools::router: error=exec_command failed for /bin/bash -c 'git diff 198cc50fcb226021c886619aaefc995357207b46': CreateProcess { message: "Codex(Sandbox(Denied { output: ExecToolCallOutput { exit_code: 1, stdout: StreamOutput { text: "", truncated_after_lines: None }, stderr: StreamOutput { text: "bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted\n", truncated_after_lines: None }, aggregated_output: StreamOutput { text: "bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted\n", truncated_after_lines: None }, duration: 0ns, timed_out: false }, network_policy_decision: None }))" }
mcp: codex/list_mcp_resources started
mcp: codex/list_mcp_resources (completed)
mcp: codex_apps/github_search_installed_repositories_v2 started
mcp: codex_apps/github_search_installed_repositories_v2 (completed)
mcp: codex_apps/github_list_repositories started
mcp: codex_apps/github_list_repositories (completed)
2026-04-09T10:32:27.365411Z ERROR codex_core::tools::router: error=exec_command failed for /bin/sh -c pwd: CreateProcess { message: "Codex(Sandbox(Denied { output: ExecToolCallOutput { exit_code: 1, stdout: StreamOutput { text: "", truncated_after_lines: None }, stderr: StreamOutput { text: "bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted\n", truncated_after_lines: None }, aggregated_output: StreamOutput { text: "bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted\n", truncated_after_lines: None }, duration: 0ns, timed_out: false }, network_policy_decision: None }))" }
mcp: codex_apps/github_search_repositories started
mcp: codex_apps/github_search_repositories (failed)
mcp: codex_apps/github_search_repositories started
mcp: codex_apps/github_search_repositories (failed)
mcp: codex_apps/github_search_repositories started
mcp: codex_apps/github_search_repositories (completed)
mcp: codex_apps/github_search_repositories started
mcp: codex_apps/github_search_repositories (completed)
mcp: codex_apps/github_search_commits started
mcp: codex_apps/github_search_commits (completed)
mcp: codex_apps/github_search_prs started
mcp: codex_apps/github_search_prs (completed)
mcp: codex_apps/github_fetch_pr started
mcp: codex_apps/github_fetch_pr (completed)
mcp: codex_apps/github_list_pr_changed_filenames started
mcp: codex_apps/github_list_pr_changed_filenames (completed)
mcp: codex_apps/github_fetch_file started
mcp: codex_apps/github_fetch_file (completed)
mcp: codex_apps/github_fetch_file started
mcp: codex_apps/github_fetch_file (completed)
mcp: codex_apps/github_fetch_file started
mcp: codex_apps/github_fetch_file (completed)
mcp: codex_apps/github_fetch_file started
mcp: codex_apps/github_fetch_file (completed)
mcp: codex_apps/github_fetch_pr_file_patch started
mcp: codex_apps/github_fetch_pr_file_patch (completed)
mcp: codex_apps/github_fetch_pr_file_patch started
mcp: codex_apps/github_fetch_pr_file_patch (completed)
mcp: codex_apps/github_fetch_pr_file_patch started
mcp: codex_apps/github_fetch_pr_file_patch (completed)
mcp: codex_apps/github_fetch_pr_file_patch started
mcp: codex_apps/github_fetch_pr_file_patch (completed)
mcp: codex_apps/github_fetch_file started
mcp: codex_apps/github_fetch_file (completed)
mcp: codex_apps/github_fetch_file started
mcp: codex_apps/github_fetch_file (completed)
mcp: codex_apps/github_fetch_file started
mcp: codex_apps/github_fetch_file (completed)
codex
The patch introduces several user-visible regressions: legacy manual entries are reclassified and de-boosted, WebUI edits can silently corrupt source tags, and the new tags/Markdown features have correctness issues. These should be fixed before treating the change as correct.

Full review comments:

  • [P1] Preserve manual boost for pre-source-tag entries — /home/dev/projects/palaia-plugin/packages/openclaw-plugin/src/hooks/recall.ts:379-381
    This changes the recall boost heuristic from “not auto-capture” to “has webui/cli tag”. Existing user-authored entries created before this patch were stored without any source tag, so after upgrade they immediately lose the 1.3× manual boost and can rank below auto-captured noise until they are rewritten or migrated. If the new source model is intended, this needs a backward-compatible fallback for untagged legacy data.

  • [P1] Keep source tags when saving edits from the WebUI — /home/dev/projects/palaia-plugin/palaia/web/static/app.js:512-512
    The edit form now strips auto-capture, webui, and cli out of form-tags, and the PATCH request sends only the visible tags back. That means editing any existing entry in the browser silently deletes its hidden source tag, so auto-captured entries become agent, CLI entries lose their manual boost, and subsequent UI/filtering behavior changes just from pressing Save.

  • [P2] Keep untagged legacy entries out of the new agent bucket — /home/dev/projects/palaia-plugin/palaia/web/routes/entries.py:61-68
    _detect_source() now classifies every entry without webui/cli/auto-capture as agent, but older manual entries were also untagged. On an upgraded store, /api/entries, /api/search, the detail view, and source=manual filtering will all misclassify those existing human-authored memories until a migration runs, so this needs a legacy fallback instead of treating all untagged entries as agent-authored.

  • [P2] Scope tag suggestions to entries the current agent can see — /home/dev/projects/palaia-plugin/palaia/web/routes/status.py:103-106
    This new endpoint builds autocomplete suggestions from all_entries_unfiltered(), so in multi-agent setups it can reveal tags attached to private or otherwise invisible entries just by opening the form. The rest of the WebUI applies scope filtering, so /api/tags should follow the same visibility rules instead of exposing metadata from hidden records.

  • [P2] Avoid re-wrapping unordered lists as ordered lists — /home/dev/projects/palaia-plugin/palaia/web/static/app.js:113-116
    After converting - item lines into <ul>...</ul>, the second /<li>.../ pass matches those same <li> nodes again and wraps them in <ol>. As a result, any unordered list in the new Markdown detail view renders with invalid nested list markup (<ul><ol>...), which visibly breaks bullet formatting for common note content.
    The patch introduces several user-visible regressions: legacy manual entries are reclassified and de-boosted, WebUI edits can silently corrupt source tags, and the new tags/Markdown features have correctness issues. These should be fixed before treating the change as correct.

Full review comments:

  • [P1] Preserve manual boost for pre-source-tag entries — /home/dev/projects/palaia-plugin/packages/openclaw-plugin/src/hooks/recall.ts:379-381
    This changes the recall boost heuristic from “not auto-capture” to “has webui/cli tag”. Existing user-authored entries created before this patch were stored without any source tag, so after upgrade they immediately lose the 1.3× manual boost and can rank below auto-captured noise until they are rewritten or migrated. If the new source model is intended, this needs a backward-compatible fallback for untagged legacy data.

  • [P1] Keep source tags when saving edits from the WebUI — /home/dev/projects/palaia-plugin/palaia/web/static/app.js:512-512
    The edit form now strips auto-capture, webui, and cli out of form-tags, and the PATCH request sends only the visible tags back. That means editing any existing entry in the browser silently deletes its hidden source tag, so auto-captured entries become agent, CLI entries lose their manual boost, and subsequent UI/filtering behavior changes just from pressing Save.

  • [P2] Keep untagged legacy entries out of the new agent bucket — /home/dev/projects/palaia-plugin/palaia/web/routes/entries.py:61-68
    _detect_source() now classifies every entry without webui/cli/auto-capture as agent, but older manual entries were also untagged. On an upgraded store, /api/entries, /api/search, the detail view, and source=manual filtering will all misclassify those existing human-authored memories until a migration runs, so this needs a legacy fallback instead of treating all untagged entries as agent-authored.

  • [P2] Scope tag suggestions to entries the current agent can see — /home/dev/projects/palaia-plugin/palaia/web/routes/status.py:103-106
    This new endpoint builds autocomplete suggestions from all_entries_unfiltered(), so in multi-agent setups it can reveal tags attached to private or otherwise invisible entries just by opening the form. The rest of the WebUI applies scope filtering, so /api/tags should follow the same visibility rules instead of exposing metadata from hidden records.

  • [P2] Avoid re-wrapping unordered lists as ordered lists — /home/dev/projects/palaia-plugin/palaia/web/static/app.js:113-116
    After converting - item lines into <ul>...</ul>, the second /<li>.../ pass matches those same <li> nodes again and wraps them in <ol>. As a result, any unordered list in the new Markdown detail view renders with invalid nested list markup (<ul><ol>...), which visibly breaks bullet formatting for common note content.


Automated review by OpenAI Codex on devhost

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