You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This is the coordination thread for the in-chat widget system workstream of
the LifeOps Personal Assistant MVP (GitHub project 15). Chat is the primary
surface; we are moving functionality from views/plugins into chat, rendered as
widgets that show information and accept input.
Research doc (committed in-repo, read it before touching anything): packages/docs/ongoing-development/research/02-chat-widget-system.md
Decisions adopted
No new registry, no new widget framework. The system exists:
Out-of-band sensitive-request pipeline with a hosted cloud page: packages/core/src/sensitive-requests/, packages/cloud/api/v1/sensitive-requests/, packages/ui/src/cloud/public-pages/pages/sensitive-requests/.
MVP work is fixing, testing, and verifying this — not building parallel
infrastructure. If you find yourself writing a new registry, stop and re-read
the research doc.
Closed widget vocabulary.form, choice, followups, task, secret/oauth (out-of-band), [CONFIG:pluginId]. Confirmations = choice.
Pickers = form field types (date/time being added). Lists = markdown or choice. Status cards = the task-card pattern + slot widgets. Plugins
parameterize these; they do not mint new marker kinds for MVP. registerInlineWidget remains the display-renderer escape hatch — a
registration adds zero prompt text.
Context efficiency stays structural. Markers are emitted by action code
(zero prompt cost); the model-facing guide is a dynamic: true,
relevance-gated provider excluded from default composition
(packages/core/src/runtime.ts:4088). Nothing you add may inject
per-widget prompt text into default composition.
Secrets never transit chat as text. In-app → inline secure form
(SensitiveRequestBlock); connectors → single link-out button to the hosted
authenticated page. This is doctrine, already implemented — our job is
proving it on real connectors.
Fail fast, no fabricated affordances. Malformed blocks render as plain
text; a widget must never render a healthy-looking control for a broken
pipeline (the dead /forms/:id connector link is the standing violation —
first issue below).
UI doctrine applies: minimal UI, no card chrome, orange accent only, no
blue, uniform top bar, no suggestion chips outside the [FOLLOWUPS] widget.
Issues (most important first)
#
Priority
Title
1
P0
[chat-widgets] Connector [FORM] link-out points at a nonexistent /forms/:id page — suppress the dead URL, use free-text fallback
[chat-widgets] Add date/time/datetime field types to the interaction FORM vocabulary
4
P1
[chat-widgets] Slim the uiCatalog provider: markers first, GenUI catalog split into its own dynamic provider
5
P1
[chat-widgets] Verify settings-in-chat end to end: [CONFIG:pluginId] card + SETTINGS action with rendered evidence
6
P1
[chat-widgets] Prove the sensitive-request hosted-page flow on a real connector (DM link-out → hosted page → agent sees the result)
7
P2
[chat-widgets] Refresh WIDGET_MATRIX.md to match the code (stale D1 divergence, coverage table)
Sequencing notes: #1 is independent and small — take it first if you're new to
the area. #2 is the heart of the workstream; #3 and #5 build on its harness, so
coordinate if you take them in parallel. #7 should land after #1 so the docs
describe the fixed behavior once, not twice.
How to claim work
Comment on the issue: "claiming — <your session/agent id>".
Move the card on project 15 to In Progress.
Branch fix/<issue#>-<slug> or feat/<issue#>-<slug> off develop; PR back
to develop. Sync (git fetch origin && git rebase origin/develop) before
opening/updating the PR; run bun run verify + the relevant test lanes.
One issue per PR. If your work reveals an out-of-scope defect, file a new
issue with evidence instead of widening the PR.
If you stall or hand off, comment with state + branch name so the next agent
can resume. Push early, push often — unpushed work does not exist.
Evidence rules (binding — read PR_EVIDENCE.md)
Evidence is posted inline in the GitHub issue/PR (not committed to .github/issue-evidence/):
MP4 for videos (renders inline on GitHub) — a full walkthrough of the flow,
start to finish, on the real surface (dashboard chat, mobile overlay, real
Telegram/Discord where the issue touches connectors).
JPG for screenshots (size) — before AND after, desktop AND mobile; for
bugs, the BEFORE must show the wrong behavior.
Real-LLM trajectories for anything touching agent/provider/prompt/marker
behavior — captured with scenario-runner against a live model, hand-reviewed,
and the relevant excerpts quoted in the PR.
Backend structured logs ([ClassName] …) and frontend console+network
logs proving the real code path fired.
Domain artifacts — the scheduled-task row, the settings write, the stored
secret (masked) — inspected and shown, not asserted.
Each evidence type is attached or explicitly marked N/A — <reason>. Never
blank. Stale evidence (captured before a develop rebase that changed
behavior) must be re-captured.
No page/flow a PR touches may ship needs-work/broken in the app visual
audit (bun run --cwd packages/app audit:app) where applicable.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
This is the coordination thread for the in-chat widget system workstream of
the LifeOps Personal Assistant MVP (GitHub project 15). Chat is the primary
surface; we are moving functionality from views/plugins into chat, rendered as
widgets that show information and accept input.
Research doc (committed in-repo, read it before touching anything):
packages/docs/ongoing-development/research/02-chat-widget-system.mdDecisions adopted
packages/ui/src/components/chat/widgets/inline-registry.tsx(
registerInlineWidget— the plugin extension point;plugin-task-coordinatoralready uses it).
packages/core/src/types/interactions.tspackages/core/src/messaging/interactions/(parse/serialize/layout/callback).packages/core/src/sensitive-requests/,packages/cloud/api/v1/sensitive-requests/,packages/ui/src/cloud/public-pages/pages/sensitive-requests/.MVP work is fixing, testing, and verifying this — not building parallel
infrastructure. If you find yourself writing a new registry, stop and re-read
the research doc.
form,choice,followups,task,secret/oauth(out-of-band),[CONFIG:pluginId]. Confirmations =choice.Pickers =
formfield types (date/time being added). Lists = markdown orchoice. Status cards = the task-card pattern + slot widgets. Pluginsparameterize these; they do not mint new marker kinds for MVP.
registerInlineWidgetremains the display-renderer escape hatch — aregistration adds zero prompt text.
(zero prompt cost); the model-facing guide is a
dynamic: true,relevance-gated provider excluded from default composition
(
packages/core/src/runtime.ts:4088). Nothing you add may injectper-widget prompt text into default composition.
(
SensitiveRequestBlock); connectors → single link-out button to the hostedauthenticated page. This is doctrine, already implemented — our job is
proving it on real connectors.
text; a widget must never render a healthy-looking control for a broken
pipeline (the dead
/forms/:idconnector link is the standing violation —first issue below).
blue, uniform top bar, no suggestion chips outside the
[FOLLOWUPS]widget.Issues (most important first)
[FORM]link-out points at a nonexistent/forms/:idpage — suppress the dead URL, use free-text fallback[CONFIG]emission)[CONFIG:pluginId]card + SETTINGS action with rendered evidenceSequencing notes: #1 is independent and small — take it first if you're new to
the area. #2 is the heart of the workstream; #3 and #5 build on its harness, so
coordinate if you take them in parallel. #7 should land after #1 so the docs
describe the fixed behavior once, not twice.
How to claim work
fix/<issue#>-<slug>orfeat/<issue#>-<slug>offdevelop; PR backto
develop. Sync (git fetch origin && git rebase origin/develop) beforeopening/updating the PR; run
bun run verify+ the relevant test lanes.issue with evidence instead of widening the PR.
can resume. Push early, push often — unpushed work does not exist.
Evidence rules (binding — read PR_EVIDENCE.md)
Evidence is posted inline in the GitHub issue/PR (not committed to
.github/issue-evidence/):start to finish, on the real surface (dashboard chat, mobile overlay, real
Telegram/Discord where the issue touches connectors).
bugs, the BEFORE must show the wrong behavior.
behavior — captured with scenario-runner against a live model, hand-reviewed,
and the relevant excerpts quoted in the PR.
[ClassName] …) and frontend console+networklogs proving the real code path fired.
secret (masked) — inspected and shown, not asserted.
N/A — <reason>. Neverblank. Stale evidence (captured before a
developrebase that changedbehavior) must be re-captured.
No page/flow a PR touches may ship
needs-work/brokenin the app visualaudit (
bun run --cwd packages/app audit:app) where applicable.Filed issues
Design doc · MVP board
Beta Was this translation helpful? Give feedback.
All reactions