feat(logbook): automatic work journal plugin with Control UI timeline tab#99930
Conversation
Dependency GuardThis PR changes dependency-related files. Maintainers should confirm these changes are intentional. Changed files:
Maintainer follow-up:
|
Dependency graph changes notedThis PR includes dependency graph changes. The dependency guard is informational because the PR author is a repository admin or a member of
Security review is still recommended before merge when the dependency graph change is intentional. |
|
Codex review: needs real behavior proof before merge. Reviewed July 5, 2026, 2:49 PM ET / 18:49 UTC. Summary Reproducibility: yes. for the remaining review finding at source level: an older loadLogbook request can apply its timeline after state.day has changed. I did not run the macOS capture flow in this read-only review. Review metrics: 3 noteworthy metrics.
Stored data model Root-cause cluster Members:
Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything. Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Proof guidance:
Mantis proof suggestion Risk before merge
Maintainer options:
Next step before merge
Maintainer decision needed
Security Review findings
Review detailsBest possible solution: Land only after the stale timeline response bug is fixed, redacted real-behavior proof is attached, and maintainers explicitly accept the bundled disabled-by-default screen-journal product/security boundary. Do we have a high-confidence way to reproduce the issue? Yes for the remaining review finding at source level: an older loadLogbook request can apply its timeline after state.day has changed. I did not run the macOS capture flow in this read-only review. Is this the best way to solve the issue? No: the owner-boundary approach is plausible, and prior blockers are fixed, but this is not the best merge state until stale timeline responses are guarded and inspectable live proof is available. Full review comments:
Overall correctness: patch is incorrect AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 3f380635f59b. Label changesLabel justifications:
Evidence reviewedWhat I checked:
Likely related people:
What the crustacean ranks mean
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics. How this review workflow works
Review history (9 earlier review cycles; latest 8 shown)
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a7f04bab19
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…d Control UI tab Squash of PR #99930 work for rebase onto the Control UI route refactor: - extensions/logbook: Dayflow-style capture -> observations -> timeline cards pipeline with SQLite store, node capture commands, standup/ask, retention - plugin SDK/gateway seam: surface "tab" Control UI descriptors projected into hello-ok controlUiTabs (scope-filtered, deterministic order) - Control UI: dynamic plugin tabs with bundled Logbook view - docs, tests, labeler wiring
a7f04ba to
6964095
Compare
|
All review findings are addressed on the rebased branch (now on top of the Control UI route refactor). Summary of what changed: Security / privacy hardening
Correctness
Rebase / port
Proof
Bundled (disabled-by-default) distribution is per the maintainer's direction to land this PR. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6964095678
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
7ae026d to
4a73f28
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4a73f284bc
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| day: status.today, | ||
| }); | ||
| } else { | ||
| state.timeline = timeline; |
There was a problem hiding this comment.
Ignore stale Logbook loads after day changes
When a silent poll or an earlier refresh is still in flight and the user navigates to another day, this assignment can apply the old timeline response to the new state.day because loadLogbook never records the requested day or checks it before mutating state. In that race, a previous/today poll that finishes after the user's day navigation renders cards for the wrong day until a later refresh happens; discard responses whose requested day no longer matches the current day (as the standup/ask paths already do).
Useful? React with 👍 / 👎.
Land-ready proofMaintainer repair complete. The branch is rebased onto current Key repairs:
Focused proof:
Exact-head hosted proof:
Direct Codex contract verification used source at
Known proof gaps: none. |
|
Merged via squash.
|
… tab (openclaw#99930) * feat(logbook): automatic work journal plugin with a plugin-contributed Control UI tab Squash of PR openclaw#99930 work for rebase onto the Control UI route refactor: - extensions/logbook: Dayflow-style capture -> observations -> timeline cards pipeline with SQLite store, node capture commands, standup/ask, retention - plugin SDK/gateway seam: surface "tab" Control UI descriptors projected into hello-ok controlUiTabs (scope-filtered, deterministic order) - Control UI: dynamic plugin tabs with bundled Logbook view - docs, tests, labeler wiring * feat(ui): port plugin tabs and Logbook to the route-owned Control UI architecture - shared /plugin route carries the tab id in the query (?id=<tab>), matching the router's exact-path contract - openclaw-plugin-page renders bundled views (Logbook), sandboxed plugin frames (descriptor path), or the unavailable card - sidebar renders hello controlUiTabs after each group's static routes - Logbook view/controller live under ui/src/pages/plugin/ * fix(ui): namespace plugin tabs by pluginId to prevent cross-plugin tab id collisions * fix(logbook): prefer app capture nodes and rotate off failing nodes * fix(plugins): reject protocol-relative Control UI tab paths * fix(logbook): harden automatic journal * docs(changelog): remove maintainer self-credit * chore(ui): refresh locale metadata after rebase * fix(logbook): preserve analysis window boundaries * fix(logbook): align status privacy and timezone * fix(ui): stop hidden plugin tab polling
Closes #99867
What Problem This Solves
There is no way to look back at a day and see what you actually did on your machine. Time trackers log app names; they miss what the work was. Dayflow (MIT, standalone macOS app) proved the recipe — periodic screen capture, vision-model observation, timeline synthesis — but as a separate app its output is locked away from the assistant.
This PR adds Logbook, a bundled (disabled-by-default) plugin that turns screen snapshots from a paired node into a reviewable timeline of the day, surfaced in a new Control UI sidebar tab, with a daily-standup generator and timeline-grounded Q&A.
Why This Change Was Made
OpenClaw already owns every capability the idea needs — node screen capture, media-understanding providers, plugin services, gateway RPC, plugin SQLite state, the dashboard. Composing them as a plugin keeps the data local, makes it queryable by the assistant later, and exercises existing seams:
screen.snapshot(app nodes) or the new plugin-providedlogbook.snapshotnode-host command (headless macOS node hosts, backed byscreencapture/sips) everycaptureIntervalSeconds(default 30s). A node-invoke policy addslogbook.snapshotto the default macOS allowlist while the plugin is enabled. Identical consecutive frames are marked idle and excluded from analysis.api.runtime.mediaUnderstanding.extractStructuredWithModel, e.g.codex/gpt-5.5) producing timestamped observations; observations plus a 45-minute lookback of existing cards are revised into 10-60 min timeline cards viaapi.runtime.llm.complete(default agent model), with one JSON-repair retry. Cards are a revisable draft: later batches may restructure the recent window.node:sqlite, same pattern as memory-core/imessage) under<state-dir>/logbook/; frames pruned afterretentionDays(default 14); batches stuck inrunningreset topendingon restart.Logbooktab following the Workboard/Dreams precedent (core view calling plugin-registeredlogbook.*gateway methods; plugin-disabled callout when off). Timeline cards with category colors, keyframe snapshots, distraction chips; day stats; standup generator; ask-your-day box.Architecture notes: owner boundary respected (all product logic in
extensions/logbook; the core diff is generic tab wiring + i18n). No new core config; plugin config has 8 clamped keys. Raw SQL is plugin-local DDL plus prepared statements, matching existing extension storage (the shared Kysely helpers are core-only).User Impact
openclaw plugins enable logbook.Evidence
extensions/logbook/src/analyze.test.ts(time parsing, JSON repair contract, overlap trimming, batch windowing/gap split, sampling, keyframe pick) andextensions/logbook/src/store.test.ts(idle exclusion, crash recovery, revision-window replacement, stats, retention pruning) — 21 tests green vianode scripts/run-vitest.mjs extensions/logbook.src/plugins/contracts/package-manifest.contract.test.ts,src/plugins/contracts/extension-runtime-dependencies.contract.test.ts,src/plugins/bundled-plugin-naming.test.ts,test/extension-import-boundaries.test.ts.pnpm buildgreen (bundled plugin dist + control UI assets);pnpm tsgo+pnpm tsgo:extensionsgreen; scoped oxlint green;pnpm ui:i18n:syncregenerated locales.logbook.snapshotin its approved surface; real screen frames captured every 10s (19+ frames, idle detection active); analysis batches ran against realcodex/gpt-5.5(chatgpt.com/backend-api/codex/responsestransport) producing timestamped observations and merged timeline cards that correctly described the on-screen work; the Logbook tab rendered cards with keyframe snapshots, day stats (focus bar, categories, apps), a generated Daily Standup (Done/Today/Blockers), and an answered ask-your-day question. Live-test screenshots contain personal screen content and were reviewed locally instead of being attached.node.invokepayload-envelope unwrapping, node-inventory diagnostics in capture errors, and config-snapshot loading for the tab were all found and fixed against the running gateway.Release-note context: feat(plugins): add Logbook automatic work journal plugin with Control UI timeline tab (screen snapshots via paired nodes, Dayflow-style two-stage analysis, daily standup, ask-your-day).