feat: live card refresh, list checkboxes, minichat width cap

KnowledgeView:
- Watch streamingToolCalls; call fetchItems+fetchTags on create/update
  note or task so the card grid reflects changes made via the minichat
- Cap minichat to max-width: var(--page-max-width) so it matches chat column width

WorkspaceView + WorkspaceNoteEditor:
- Expose reload() from WorkspaceNoteEditor via defineExpose
- Call noteEditorRef.reload() alongside taskPanelRef.reload() when
  create_note/update_note tools succeed in the SSE watcher

KnowledgeView list cards:
- Backend: parse markdown task list into list_items [{text, checked}] + body
- Card renders up to 6 items with real checkboxes; toggleListItem()
  does an optimistic update then PATCHes /api/notes/:id
- Progress bar kept below items; "+N more" shown when list is long

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-01 21:30:28 -04:00
parent 23a7ed7822
commit 9549eb85bc
4 changed files with 129 additions and 10 deletions
+11 -5
View File
@@ -34,12 +34,18 @@ def _note_to_item(note: Note) -> dict:
item["phone"] = meta.get("phone", "")
item["hours"] = meta.get("hours", "")
elif note.entity_type == "list":
# Count checked / total items from markdown task list syntax
# Parse markdown task list syntax into structured items
body = note.body or ""
total = body.count("- [ ]") + body.count("- [x]") + body.count("- [X]")
checked = body.count("- [x]") + body.count("- [X]")
item["item_count"] = total
item["checked_count"] = checked
list_items = []
for line in body.split("\n"):
stripped = line.strip()
if stripped.startswith("- [ ] ") or stripped.startswith("- [x] ") or stripped.startswith("- [X] "):
checked_item = not stripped.startswith("- [ ] ")
list_items.append({"text": stripped[6:], "checked": checked_item})
item["list_items"] = list_items
item["item_count"] = len(list_items)
item["checked_count"] = sum(1 for i in list_items if i["checked"])
item["body"] = body
return item