Chronological release updates for the DiviDen Command Center. Latest releases first.
Task Economy overhaul. Developer Portal single-page rebuild. Admin Command Center (19 sections, 23 routes, 7,529 lines). Action tag audit. Test suite expansion. Four major systems rebuilt in one version.
May 30, 2026 11:59 PM CT
Replaced the entire job board system (v2.5.105) with a conversation-native task economy. Providers declare capabilities through chat, clients discover and hire through Divi, and the full project lifecycle (hiring, updates, deliverables, reviews, payment) happens inside the conversation.
ProviderCapability model (task type, pricing model, turnaround, sample work). User reputation engine with separate provider/client averages. Project-linked contracts via JobContract.projectId FK. Dual-seat scoped projects with client/provider roles.
declare_capability, list_my_capabilities, remove_capability, find_providers, hire_provider, project_update, request_info, submit_deliverable, add_project_scope, suggest_close_project, close_project, dispute_project, submit_project_review, manage_review_visibility.
Consolidated 12 developer portal page files into a single 1,420-line DeveloperPortal.tsx component with client-side section routing via searchParams. 10 sections: Overview, Instances, Instance Detail, Agents, Agent Detail, Billing, Earnings, Keys, Settings, Team. Old page URLs redirect to the SPA with correct parameters. Dashboard now includes Developer Portal link in user menu.
DeveloperAccountsTab with search, filtering, plan tier badges, API key status, team/agent/instance counts. UserDetailPanel slide-out with full user profile, linked developer account, subscription status, conversation and task counts.
AgentDetailPanel (4 sub-tabs: overview, configuration, widgets, activity). WidgetLibraryTab with template browsing. ReviewsTab for moderation. FederationTopologyTab for relay paths and latency. InstanceDetailPanel with traffic stats and health.
TaskEconomyTab dashboard with total tasks, completion rate, average value, revenue trends, breakdowns by status/category/pricing model. Enhanced TasksTab and WorkflowsTab with search, filters, and priority indicators.
Sparklines in MetricCards (SVG trend charts). Keyboard shortcuts (g+key navigation). Anomaly detection (2-sigma alerts). shared.tsx utility module (MetricCard, StatusBadge, EmptyState, Sparkline, useAdminFetch, timeAgo). AdminSidebar with 6 nav groups and 19 sections.
React Hooks ordering violation fixed (useRef/useEffect after early returns). Keyboard shortcut timeout (pendingKey stuck forever). Sparkline NaN on single data point. Duplicate timeAgo removed. Missing withTelemetry on 3 routes. Unused imports cleaned across 5 files. AdminSidebar pendingCounts wired. typeof Briefcase type fix.
Last admin route without withTelemetry found and wrapped (marketplace/agents). Auth guard moved outside try block in task-economy. Raw fetch() replaced with useAdminFetch in TaskEconomyTab. ~20 hardcoded text-zinc-*/border-zinc-*/bg-zinc-* classes replaced with CSS variable tokens. Zero hardcoded colors remaining.
Full audit across 12 handler files. cancel_execution added. DiviSprite activity map updated to cover every tag with correct flight targets and animations.
15 test files. New: action-tags (25 cases), divi-activity (48 cases), tag-error-classify (6 cases), tag-registry (8 cases). Full registry completeness checks.
Platform totals: 81 database models, 281 API routes, 172 components, 57 pages, 103 changelog entries. 81 tag handlers across 12 handler files. 199 test cases across 15 test files.
Changelog entries #100-103. -- Jon
59 widget types across 11 categories. 5 independent delivery paths. Multi-step conversational flows. Agents can now build entire applications inside a conversation.
May 30, 2026 8:00 AM CT
form_wizard, file_upload, star_rating, nps_slider, checklist_progress, signature_pad, subscription_selector, code_editor, rich_text_editor, address_autocomplete, meeting_notes_template, kyc_verification, two_factor_confirm, collaborative_canvas, barcode_scanner
data_table, comparison_table, progress_bar_eta, confidence_meter, source_citations, sms_notification_preview, approval_chain, kanban_mini_board, timeline_gantt, spreadsheet, org_chart, live_counter, live_feed, typing_preview
choice_card, action_list, info_card, payment_prompt, qr_code_generator, before_after_slider, ab_variant_picker, oauth_connect
audio_player, image_carousel, video_player, voice_memo_recorder, camera_capture, screen_recording, ar_preview
checkout_card, cart_builder, invoice_preview, calendar_picker, time_range_selector, recurring_schedule_builder, timezone_multi_poll
markdown_preview, pdf_viewer, document_diff, slide_deck_viewer, live_chart, map_with_pins, email_composer, social_post_composer
file_upload + data_table + approval_chain + kanban_mini_board + document_diff
kyc_verification + two_factor_confirm + approval_chain + source_citations
calendar_picker + timezone_multi_poll + map_with_pins + invoice_preview + live_feed
image_carousel + before_after_slider + star_rating + timeline_gantt + ab_variant_picker
kanban_mini_board + comparison_table + live_counter + checkout_card + markdown_preview
camera_capture + barcode_scanner + map_with_pins + signature_pad + spreadsheet
Widget interactions fire callbacks to the agent, which can respond with new widgets. Terminal actions (submit, confirm, purchase, approve, reject, decline) end the flow. Continuing actions (select, next, back, toggle, copy, download, open_url) keep it alive. The platform tracks step numbers and previous widget state automatically.
Six lifecycle phases: hub concurrency with atomic locking, Stripe payment holds, 48h review flow, owner bypass, stale timeout cleanup, and denial retry. The hub owns all lifecycle state; spokes just execute and return.
May 30, 2026 8:30 AM CT
POST /api/v2/federation/executeSpokes have zero knowledge of locks, queue positions, payment status, review windows, or timeouts.
UPDATE ... WHERE currentExecutionId IS NULL prevents race conditions. Zero rows = agent busy, task queues.queuedAt ASC. Positions recomputed after every dispatch.availability field (available/unavailable/maintenance) blocks before lock attemptreleaseAndDispatchNext at 6 locations: success (sync+async), failure, timeout, denial, queued dispatch failnone → held → captured (on confirm) or released (on deny/fail/timeout)reviewWidgetShownAt (when widget is presented), not task completion timePOST /api/marketplace/lifecycle with action: "sweep" runs auto-confirm + stale cleanupagent.developerId === userId, ALL lifecycle gates are skippedreleaseAndDispatchNext is safe for owner tasks -- conditional update affects 0 rows (no-op)failed with timeout error, releases lock, dispatches nextreleaseAndDispatchNext triggers immediate dispatch if agent is freeartifact_linked activity entriesdocuments and docs as valid Drive tab destinationsComms threads now open inline on the dashboard. No more navigating away. Full split-pane experience with agent execution and relay detail views.
May 29, 2026
type: 'manual' fallbackagent_execution_started (dispatch) and task_completed (completion)queue/[id]/route.ts and queue-dispatch.tsLink navigation, no route changes/dashboard/comms page kept for backward compatibilityThe queue and kanban are now connected. Every task lifecycle event is reflected on the linked card's checklist with a review loop.
May 30, 2026
Cards and column headers show an amber badge (eye icon + count) when they have pending reviews. At a glance, the operator knows which cards have unreviewed results.
cardId to QueueItem modelqueue (task tracking) or queue_review (review/retry)The biggest federation update yet. Full inbound execute contract documented. Every task now posts to comms. Google Drive files render inline.
May 29-30, 2026
This build is named after Jaron at Ignited Agency OS, who reverse-engineered the federation execute contract that we should have documented months ago. He handed us a clean, structured document covering the exact endpoint path, auth headers, body schema, response shape, timeout ceilings, and every gotcha he hit along the way. The DiviDen team is treating this as a gift. Thank you, Jaron.
Thank you to mAInClaw for holding it down with us today — grinding through debugging sessions, testing federation flows, and keeping the energy up when we needed it.
timeoutMs field in response bodyin_progress now creates a comms entry immediatelydone_today) now creates a comms entrycomms-refresh on every status change so the feed updates instantlyagent_execution_started) and new (agent_task_in_progress) metadata types/preview and /embed endpointsgetViewerUrl to handle docs.google.com URLs (was only matching drive.google.com)src/app/api/marketplace/[id]/execute/route.ts — owner bypass + timeout errorssrc/app/api/v2/federation/execute/route.ts — timeout constant + 504 statussrc/app/docs/federation-setup/page.tsx — inbound contract, inputFormat, debugging sectionssrc/app/api/queue/[id]/route.ts — comms on all status transitionssrc/lib/queue-dispatch.ts — comms for all dispatched taskssrc/components/dashboard/QueuePanel.tsx — comms-refresh eventssrc/components/dashboard/CommsTab.tsx — new metadata type recognitionsrc/components/dashboard/DriveView.tsx — embedded viewer + URL handlingsrc/lib/google-sync.ts — content preservation during syncAgent-aware task picker with guided chat assembly and cross-connection relay support.
May 28, 2026
GET /api/smart-tasks/available endpoint aggregates tasks from installed agents, built-in capabilities, and marketplace capabilitiesSmartTaskPicker overlay with category grouping, search, and multi-taskType sub-rowsrequiredInputSchema, contextInstructions, executionNotes, samplePromptsrelay_request to the target connection's Divi. Federated connections supported.Glass design system, premium animations, floating mini-chat with full agent parity, system prompt optimization, and infrastructure hardening.
May 23, 2026
Twenty consecutive builds focused on visual identity, interaction quality, and always-accessible AI. The Command Center has never looked or felt this good.
Hybrid glass system: solid structural panels with frosted glass accents on overlays, modals, dropdowns, and floating surfaces.
.glass — semi-transparent dark background, backdrop-filter blur (16px), saturation (1.2), thin luminous border..glass-elevated — stronger variant: 20px blur, 1.3 saturation, deeper box-shadow. Used on modals and critical floating surfaces.Seven CSS-only animation primitives. No JS animation libraries, no layout thrash.
bubble-breathe — pulsing box-shadow on idle DiviBubble button.bubble-msg-entrance — scale + slide-up for mini-chat messages.panel-active-glow — breathing border animation on active expanded panels.stagger-entrance — cascading slideUp with 40ms stagger per child (up to 8).toast-entrance — elastic slide-in-right for notifications.tab-slide-left / tab-slide-right — directional crossfade for tab transitions.shimmer — gradient sweep on layout transitions.Persistent floating chat bubble with full ChatView parity. Portal to Divi from any view.
/api/chat/send endpoint. Handles token, tags_executed, done, error events./api/chat/messages. One conversation across both surfaces.renderMarkdownLite + healStreamingMarkdown + stripTagsClient.credentials: include on all fetch calls.system-prompt.ts into src/lib/prompt-groups/. From 2,010 to 698 lines.LLMError instances with classification.createMany() replaces sequential inserts.Image generation, voice interaction, task decomposition, quality scoring, and infrastructure hardening.
May 23, 2026
Five consecutive sprints of platform upgrades. The biggest leap since federation launched.
Divi can now generate images inline during conversation via the Abacus RouteLLM API with modalities: ["image"].
handlers-media.ts — generate_image action tag. Accepts prompt, aspect, style, numImages (up to 4).MessageBubble.Bidirectional voice: record → transcribe → Divi processes → TTS response.
VoiceInput — mic button with recording states, audio level viz, duration display.POST /api/chat/voice — audio blob transcription via Abacus AI (up to 25MB).decompose_task action tag — ordered subtask QueueItems with dependsOn dependency chains.task_decomposed activity events.POST /api/agent-quality) — behavioral signals for continuous quality profiling.withTelemetry wrapper for structured observability.Acknowledgment: Huge thanks to Jaron Ray Hinds for his continual contribution — registering agents, running a federation instance, and stress-testing the protocol.
Download a plain-text copy of this page
Last updated: May 23, 2026
Divi now has inbox context when you ask about email, even if all messages are read.
April 20, 2026
Spotted during Andre’s onboarding: Divi couldn’t access inbox context after connecting Google. Two root causes fixed:
1. Signal gating bug — Inbox data was only injected into the system prompt when the schedule signal fired (calendar keywords). Asking “what’s in my inbox” triggered capabilities_triage instead — which loaded triage instructions but not the actual email data. Fixed: inbox context now loads when either signal is relevant.
2. Read-only inbox — The system prompt only showed unread emails. If you’re a zero-inbox person, Divi saw nothing. Fixed: now fetches the 10 most recent emails regardless of read status, deduped against unread.
3. Discover page crash — /api/discover was failing with a Prisma validation error: visibility was incorrectly nested in the profile relation filter.
Download a plain-text copy of this page
Last updated: April 20, 2026
Feature-flagged HMAC-SHA256 signing for all federation payloads, with a 13-point self-test suite.
All federation traffic (relays, notifications, relay-acks) can now be HMAC-SHA256 signed per-connection. When Connection.hmacEnabled is true, outbound payloads are signed with the federationToken as the HMAC key, and inbound payloads are verified before processing. Timing-safe comparison prevents timing attacks. The feature is off by default — flip it per-connection when both sides are ready.
To enable HMAC on a connection, set hmacEnabled: true on the Connection row. Both sides must enable it simultaneously — once enabled, unsigned payloads from that connection will be rejected. The federationToken serves dual duty as both the bearer token and the HMAC key.
Download a plain-text copy of this page
Last updated: April 19, 2026
Promote/demote on projects and teams now emit the full four-signal pattern with federation push.
Role changes on both project members and team members now follow the same four-signal doctrine: DB update + QueueItem + AgentRelay (intent='notify', payload.kind='project_role_change' or 'team_role_change') + CommsMessage. Federated members get a notification push to the remote instance with scope on the wire.
With v2.3.5, every coordination mutation in the platform now emits all four signals: task routing (v2.1.2), project invites (v2.3.1), team invites (v2.3.4), and role changes (v2.3.5). The next milestone is HMAC enforcement (v2.4.0).
Download a plain-text copy of this page
Last updated: April 19, 2026
Team invites now emit the full four-signal pattern with round-trip relay status stamping.
Team invitation flows now parallel project invitations with the full four-signal pattern: TeamInvite DB row, QueueItem, AgentRelay (intent='introduce', payload.kind='team_invite', teamId scope), and CommsMessage. On accept/decline, the paired relay is stamped completed or declined with a round-trip CommsMessage back to the inviter.
Team invitations were still running the legacy single-signal flow. This brings team coordination to full parity with projects — every team invite is now auditable, federated, threaded in Comms, and stamped with a lifecycle status.
Download a plain-text copy of this page
Last updated: April 18, 2026
The full Comms page (/dashboard/comms) now surfaces the same team/project scope context that we shipped in the CommsTab and QueuePanel in v2.3.2. Scope chips appear at three levels: the thread list (compact emoji hint), the thread header (aggregate distinct project/team badges across the thread), and each individual relay (per-message chips). Mobile overlay matches desktop.
_scope) contains projectId or teamId.src/app/dashboard/comms/page.tsx — scope extraction + chip rendering in thread list, thread header, per-relay bubble, mobile overlayContinuity: v2.3.2 put scope on the wire. v2.3.3 makes it visible everywhere humans look at relays. Next up (v2.3.4): the four-signal pattern extends from project invites to team invites — parallel surface, same invariants.
Download a plain-text copy of this page
Last updated: April 18, 2026
teamId and projectId now ride every relay payload end-to-end — outbound mutation → federation wire → inbound handler → persisted row → gating cascade → UI chips. Federated project invites finally deliver cross-instance. FVP (Build 522) unblocked.
pushRelayToFederatedInstance, pushRelayAckToFederatedInstance, and pushNotificationToFederatedInstance all accept optional teamId / projectId. Hydrated from the stored relay when not provided.scopeDropped if peer sends unknown IDs.{type,title,body} and legacy {action,summary}).{ topic?, projectId?, teamId? }, all specified fields must match. Legacy string filters still work.v2.3.1 emitted the four signals for local invitees but never pushed to federation for cross-instance ones. v2.3.2 calls pushRelayToFederatedInstance + pushNotificationToFederatedInstance with projectId, keeps the relay pending until peer ACKs, and skips local CommsMessage (peer owns their side). Symmetry restored.
/api/federation/notifications was pushing {type,title,body} but reading {action,summary}. Handler now accepts both.status: 'open' which isn't valid. Now uses status: 'ready'.QueuePanel and CommsTab now render a compact scope badge in item metadata rows: abc123 for project, xyz789 for team. Last 6 chars of ID, tooltip shows full ID. Only rendered when scope exists.
cd nextjs_space && npx tsx scripts/check_federation_scope.ts 100
Walks the most recent N AgentRelay / QueueItem / KanbanCard rows and reports what fraction carry scope. Spot-check after any deploy that touches federation.
All changes are purely additive. Old peers that don't send teamId / projectId continue to work unchanged. No schema migration required on DiviDen side (columns were already present on AgentRelay, QueueItem, KanbanCard, NetworkJob). Peer instances can upgrade on their own schedule.
Download a plain-text copy of this page
Project invites are no longer silent DB writes — they're AgentRelay + CommsMessage events with ghost avatars on cards, Accept / Decline inline in the queue, a duplicate guard with 409 ALREADY_INVITED, a clean force: true reinvite path, and a renamed "Contributors" section that opens expanded by default inside each card.
POST /api/projects/[id]/invite now writes 4 records atomically: ProjectInvite, QueueItem, AgentRelay (intent='introduce'), CommsMessage (sender='divi').{ kind: 'project_invite', inviteId, projectId, projectName, role, message, inviterName }. Federation-ready via existing pushRelayToFederatedInstance.QueuePanel detects metadata.type === 'project_invite' and renders real Accept / Decline buttons wired to PATCH /api/project-invites. Pinned "Pending Invites" section stays at top.409 { error, code: 'ALREADY_INVITED', inviteId }. Prevents double-fire from repeated clicks or stale UIs.{ force: true } to cancel the old invite + clean up its queue item, relay, and comms message, then create a fresh set. Response includes replacedInviteId.ProjectMember.role enum values unchanged for compatibility.Connection records. Pick someone, set role, optional message, invite.ProjectMember on accept, cancels queue item + comms thread on decline.Full recipe for invoking or extending this flow — including federated delivery, event listeners (dividen:board-refresh, dividen:comms-refresh), and the canonical relay payload shape — in the new Project Invites Integration Guide.
Download a plain-text copy of this page
Twelve bug pass against the Relay Protocol — the mechanism for agent-to-agent messaging. Rewires component UX, kills the relay-loop, adds a dismiss control, and rewrites the ambient surfacing directives so Divi holds context silently and weaves on topic match rather than announcing relays as notifications.
status='delivered' so pushRelayToFederatedInstance could re-run for the same relay, duplicating peer records.RelayFootnote component: new src/components/dashboard/RelayFootnote.tsx. Tiny metadata strip — sender · type (direct/ambient) · timestamp · status — with optional dismiss (×). Used by ChatView green cards, Comms thread rows, and Comms page bubbles so every relay surface carries the same footnote.POST /api/relays/[id]/dismiss. Marks relay as declined with a (dismissed by operator) marker, logs activity, pushes state-change webhook, and fires ack-back to federated peers so their Divi also sees it resolved. Dismiss buttons appear next to every active footnote.pushRelayToFederatedInstance now checks peerRelayId / status before pushing and skips if the relay is already delivered/completed/declined. On successful ack it also stamps status='delivered', not just peerRelayId. This kills the duplicate-delivery cascade.relay_respond in background. Operator may never even hear about the relay if the topic doesn't come up.subject → responseText → message → question → note plus recipient line (→ to) and consistent footnote. No more empty outgoing cards.Download a plain-text copy of this page
Targeted behavior fix for how Divi identifies relay senders and weaves relay content into conversation. Resolves three upstream issues reported against the v2.2.0 surfacing pass.
AgentRelay.fromUserId stores connection.requesterId as a placeholder — which resolves back to the operator themselves. Divi was surfacing inbound relays as if they came from the operator's own contact list.POST /api/federation/relay now writes payload._sender = { name, email, instanceUrl, connectionId, isFederated } into every inbound federated relay, so the real sender identity survives the placeholder fromUserId.resolveSender() / resolveRecipient() helpers in system-prompt.ts layer 17. Priority: connection nickname → payload._sender.name → connection.peerUserName → fromUser.name → fallback. For federated peers, produces a federation hint like "your FVP account" derived from the instance hostname.include: { connection: { nickname, peerNickname, peerUserName, peerUserEmail, isFederated, peerInstanceUrl, requesterId, accepterId } }.Download a plain-text copy of this page
Comms Threading & Bidirectional Federation — Thread-Grouped Inbox, Intent-Flexible Ambient Relays, Federated Kanban Sync, Attachments Passthrough
Comms re-thought around threads. The main Comms tab used to show one row per relay — 5 messages with the same person meant 5 cards cluttering the list. Now every peer collapses to a single row with a live count of open/active relays, the latest subject preview, and a direct link to the expanded thread view. Meanwhile, ambient relays are no longer question-only — they carry any intent: share updates, drop an intro, acknowledge a schedule, voice an opinion. FVP Build 524/525 parity on cross-instance Kanban sync + attachments passthrough.
The Comms surface on the main dashboard is now grouped by peer (connectionId), matching the expanded /dashboard/comms view. Every peer shows as a single row with:
/dashboard/comms?thread=<connectionId> which auto-opens that threadThe main tab also now surfaces open outbound relays (previously hidden when no inbound), so you always see what's in flight.
relay_ambient used to accept only params.question and hardcoded intent: 'ask'. That collapsed the entire surface to "one agent asking another agent a question." Ambient was supposed to be the broader concept: any fire-and-forget message the peer agent can weave into conversation naturally.
Now accepts:
params.message (new) · params.subject · params.question (legacy)params.intent — default 'custom', but explicitly supports: ask, share_update, intro, schedule, opinion, noteRule of thumb: if the user would be fine waiting hours/days for a natural reply, use ambient. If they need an answer now or a commitment tracked, use relay_request (still tracked, status-bearing, ack-required).
New POST /api/federation/card-update endpoint (FVP Build 524 parity). When a peer moves a card that's linked to ours via CardLink, they push the delta to us and our card advances too. Lookup precedence: localCardId → CardLink.externalCardId → AgentRelay.peerRelayId → AgentRelay.cardId.
Symmetric: our PATCH /api/kanban/[id] and POST /api/kanban/[id]/move now call a new pushCardUpdate() helper that fires the same payload outbound to any federated peer whose CardLink.externalInstanceUrl matches. Changelog entries (max 50) are persisted on both sides for audit.
Consistent envelope: success returns { success: true, matched: true, localCardId, newStage, ... }; failure returns { success: false, error, code } where code ∈ ['missing_token', 'federation_disabled', 'invalid_payload', 'connection_not_found', 'card_not_found', 'internal_error'].
Inbound /api/federation/relay now reads optional threadId and parentRelayId from the body. parentRelayId is resolved against AgentRelay.peerRelayId on our side, and we inherit the parent's threadId (or fall back to the remote-supplied value). Thread-root relays get threadId = self.id.
Outbound pushRelayToFederatedInstance auto-hydrates threadId/parentRelayId from the local AgentRelay row if not passed in. So replies (via relay_respond with parentRelayId) now carry the parent's thread identity across the federation hop automatically. Response echoes threadId + parentRelayId so peers can thread on their side.
Inbound federation relays now parse body.attachments or payload.attachments as an array of {name, url, size?, mimeType?}. Capped at 10 entries per FVP spec. Folded into the AgentRelay payload JSON for round-trip, rendered in the CommsMessage body as a markdown list (Attachments: • [name](url)) so links are clickable.
Attachments are passed through only — we don't re-host or proxy. The peer's storage URLs are used directly. Response includes attachmentCount.
When Divi sends a relay, the green confirmation card in the chat stream sometimes showed empty/wrong content — especially for ambient relays that returned question instead of subject. Now falls back through a robust chain: subject → responseText → message → question → note. Also surfaces the to/recipient name on the card so you can tell at a glance where it went.
Download a plain-text copy of this page
FVP Build 522 Compliance — Federation Idempotency, Ambient Preference Gates, Inbound Task → Kanban, Marketplace Queue Gate
Symmetry audit complete. Audited every behavior in Jon's Comms Unification Vision against the FVP Build 522 architecture spec. Found 4 gaps on our side, fixed all of them, and shipped a reply. Same six behaviors now hold whether you're on dividen.ai or cc.fractionalventure.partners.
/api/federation/relay now dedupes on peerRelayId + connectionId at the top of the handler. Duplicate requests return { success: true, duplicate: true, relayId } with HTTP 200 — no double-creation on transient retries.
Aligns with FVP Build 522 §4. Recommended that peer instances adopt the same shape for retry safety with exponential backoff.
Inbound ambient relays (those carrying payload._ambient: true) are now silently filtered against the recipient's UserProfile preferences before any DB rows are written:
relayMode === 'off' → reason: relay_mode_offrelayMode === 'minimal' → reason: relay_mode_minimal_blocks_ambientallowAmbientInbound === false → reason: ambient_inbound_disabledrelayTopicFilters → reason: topic_filtered:<topic>relayQuietHours → reason: quiet_hoursBlocked relays return { ok: true, filtered: true, reason } with HTTP 200. Allowed ambient relays land as priority=low, state=read with a prefix — designed to be woven into the next Divi message rather than generate a notification (Jon's Comms Vision behavior #3).
When a federated peer pushes a relay with intent in ['assign_task', 'delegate', 'schedule', 'request_approval'], our inbound handler now auto-creates a KanbanCard at the leads stage on the recipient's board, linked back to the AgentRelay via sourceRelayId + cardId.
Implements Jon's Comms Vision behavior #2: tasks from other Divis land directly on your Kanban board rather than requiring you to manually triage from a notification. The associated comms entry includes linkedCardId for quick navigation.
The execute_agent action tag now respects the user's queueAutoApprove preference. When auto-approve is off, the call creates a pending_confirmation queue item with kind: 'marketplace_execute' instead of immediately POSTing to the agent endpoint.
When the user approves and the queue dispatcher fires the item, dispatchNextItem calls execute_agent with skipQueue: true to bypass the gate and run the agent.
Implements Jon's Comms Vision behavior #5: outbound tasks to marketplace agents pass through the same approval gate as outbound tasks to people.
Drafted and sent a section-by-section reply covering all of FVP's §9 open questions: FVP Build 522 Reply (PDF). Headlines: key threads off email not display name, adopt threadId/parentRelayId for cross-instance threading, merge multi-instance peer by email, and offered a new /api/federation/card-update endpoint for bi-directional Kanban stage sync if useful.
src/app/api/federation/relay/route.ts (rewritten — ambient gates, idempotency, Kanban creation)src/lib/action-tags.ts (execute_agent queue gate)src/lib/queue-dispatch.ts (handles marketplace_execute kind)FVP_BUILD_522_REPLY.md (+ PDF)Universal @username Routing, Stuck Relay Fix, Outbound Response Display, Ambient Pattern Synthesis, Federated Developer Profiles
The relay_request action tag now accepts username / handle parameters and resolves them against the federated connection set with exact-match priority. Saying "send to @alvaro" in chat now resolves directly to Alvaro's federated connection regardless of nickname or display name drift.
Connection queries in action-tags.ts and system-prompt.ts now include username: true on both requester and accepter sides for symmetric resolution.
Inbound and outbound relay queries in layer17_connectionsRelay_optimized() are now fetched separately via Promise.all. An old unresolved outbound relay (e.g., a stale agent_handling from days ago) no longer blocks newer inbound relays from reaching Divi's system prompt context.
inbound uses FIFO ordering; outbound uses most-recent-first for awareness only.
The green relay_respond card in chat now shows the operator's actual response content rather than the original inbound subject. The card now includes an italicized "Re: <original subject>" line above the response, with line-clamp-2 on the response text for readability.
data.subject = response text; data.originalSubject = inbound relay subject; data.responsePayload = full structured response.
Ambient relay outcomes (latency, response quality, disruption level, topic relevance) are now captured in AmbientRelaySignal rows on every relay-ack. Cross-user patterns are synthesized into AmbientPattern rows that feed back into the system prompt — making ambient communication progressively better at picking moments to weave in.
Trigger via /api/ambient-learning/synthesize. Fed by pushRelayAckToFederatedInstance with quality metadata from the recipient.
Marketplace agent developer profiles are now resolvable across federated DiviDen instances. When a peer's Divi recommends an agent built by a developer on another instance, the developer card renders with full context (name, instance, profile link) instead of a bare ID.
Ambient Relays Live, Federation Auto-Accept Fix, Agent Card Updates, 6 UI Bug Fixes, Sequential Relay Handling, FVP Architecture Docs
Shoutout to Jaron — massive thanks for your help stress-testing federation, flagging the auto-accept bug, and surfacing all the UI rough edges. This release is way tighter because of you.
The ambient relay system is officially live across the federation. Divi can now send low-priority, context-aware observations to connected agents — and receive them back. These aren't tasks; they're shared awareness.
_ambient: true in the payload — same transport layer, different handling semantics.relay_broadcast) now correctly push to all federated connections, not just local ones.When DiviDen auto-accepts an inbound federation connection request (requireApproval: false), it now correctly fires the acceptance callback to the requesting instance. Previously, the callback was silently skipped — leaving the requesting side stuck in pending forever.
Fixed in /api/federation/connect. The acceptance POST now sends {connectionId, status: "active", token} back to the requester's callback URL.
/.well-known/agent-card.json now advertises two new federation endpoints:
connectAccept — /api/federation/connect/accept — Callback endpoint for accepting connection requests.relayAck — /api/federation/relay-ack — Acknowledgment endpoint for relay delivery confirmation.Answered all 45 integration questions from the FVP team covering relay lifecycle, ambient vs. direct semantics, connection trust, pattern sharing, and error handling. Available at FVP Integration Answers (PDF).
Divi's system prompt now injects one relay at a time instead of batching up to 20. This prevents context overload and ensures each relay gets proper attention.
take: 10/5/5 to take: 1.relayId in the respond template for instant action.From Jaron's testing feedback:
behavior_learning items no longer appear in the task queue. They belong in Settings → Learnings.<input> to auto-resizing <textarea>. Grows vertically up to 160px, resets on send.invite_to_project now uses score-based matching (exact → contains → first-name) across all connection fields.Expired stuck test relays and archived their associated comms messages from the federation bridge testing phase. Production DB is clean.
Project Management Tags, Queue-First Task Routing, Federation Relay Push, Directory Discovery Fix, FVP Cross-Operability Guide
Two new action tags let Divi create projects and invite members directly from conversation:
create_project — Creates a Project record, adds the creator as lead, and auto-invites listed members. Members are resolved by name/username/email against active connections.invite_to_project — Invites members to an existing project by name (fuzzy match) or ID. Each invitee gets a ProjectInvite record, a queue item, and a comms notification.Example: "create a project called Debugging DiviDen and add @jaron and @alvaro" → project created, both invited with queue items.
The task_route tag now creates a queue item instead of immediately firing relays. The full pipeline (relay → comms → kanban card on recipient board) executes only when the item is dispatched — either manually or via Chief of Staff mode.
Flow: task_route → queue (READY) → dispatch → relay + comms + recipient card + sender tracking + checklist on source card.
DiviDen now pushes relays to federated instances. When a task_route dispatch targets a federated connection, the relay payload is POSTed to the remote instance's /api/federation/relay endpoint with the shared federation token. Fire-and-forget with 10s timeout.
Project invites also push notifications to federated instances via /api/federation/notifications.
New utility: src/lib/federation-push.ts — shared pushRelayToFederatedInstance() and pushNotificationToFederatedInstance() helpers.
/api/v2/network/discover now returns profiles with visibility: 'connections' (not just 'public'). Also returns basic entries for users without profile records. Test accounts excluded.
Abacus AI (Claude) is now the primary LLM provider. GPT-4o doesn't reliably emit [[tag:params]] action tags. User OpenAI keys are fallback only. Max tokens increased to 8192 for Abacus.
Comprehensive guide for FVP integration: full event taxonomy (relay + notification types), payload schemas, authentication, endpoint reference, and implementation checklist. Available at /docs/fvp-cross-operability-v2.2.md.
Cross-User Task Routing, Relay Pipeline, Bubble Store Promotion, Settings Overhaul, Installed Manager, Capabilities Resilience
Task routing is now a core capability — not a Bubble Store install. When you say "assign this to Alvaro", Divi emits a [[task_route:...]] tag that creates a full delivery pipeline:
cardId is now optional. Tasks can be routed standalone without a specific kanban card.cardTitle added as an alternative — looks up cards by name (case-insensitive partial match).[[task_route:{"tasks":[{"title":"...","to":"Name","dueDate":"..."}]}]]to field bypasses skill matching — direct assignment always works regardless of profile skills.to target, falls back to searching all active connections.relay_respond now syncs delegation status back to the sender's checklist item (accepted/declined).assign_task relays instruct the recipient's Divi to create a card on their board.[[task_route:...]] examples added to CRITICAL EXECUTION RULES to prevent phantom work.upsert_card for cross-user assignment.assigneeType, assigneeName, delegationStatus, dueDate, and sourceType/sourceId/sourceLabel.[[accept_connection:...]] action tags.operatorName hidden from directory — only operators with profiles show.Team @Mentions, Codebase Refactoring, Performance Optimizations, Accessibility, Documentation Audit
@ trigger in chat now searches people, teams, and agents in parallel.@ops-team)./api/users/resolve now resolves both usernames and kebab-cased team names./api/chat/mentions?type=teams — new endpoint for team search in inline autocomplete.layer18_profileAwareness_optimized) from system prompt. Removed unused LoopBackArrow SVG component (38 lines).next-auth.d.ts type augmentation — session.user.id now typed without as any casting.authenticateAgent(), federation routes use token auth, public routes are intentional./api/chat/send: Message save + user fetch now run in parallel. System prompt build + message history fetch also parallelized. Saves ~2 DB round-trips per chat message.role="combobox", aria-expanded, aria-activedescendant for inline search dropdown.role="listbox" + role="option" with aria-selected.role="region" with descriptive aria-label. Add-card buttons labeled.TabErrorBoundary (desktop + mobile).Covers v1.9.0 → v1.9.1 — Realtime Dashboard, Catch-Up Rewrite, Activity Feed v2
Every dashboard panel now refreshes instantly when a related action completes in chat. Lightweight custom DOM event system — no WebSockets or SSE required.
dividen:now-refresh — universal trigger, all panels listendividen:board-refresh — kanban board re-fetchdividen:queue-refresh — queue panel re-fetchdividen:comms-refresh — comms tab re-fetchdividen:activity-refresh — activity stream re-fetchChatView dispatches relevant events after settings saves, chat completions, setup task advances. NOW panel poll interval reduced from 120s to 60s as a backstop.
getCatchUpPrompt() in signals.ts completely rewritten. The old prompt was a task router — it told the LLM to create cards and dispatch queue items. The new prompt produces a FVP-style phased status briefing:
The catch_up action tag is now handled client-side: fires sync_signal in the background, waits 1.5s for data freshness, then sends the briefing prompt to the LLM. Onboarding "Run Your First Catch-Up" now uses catch_up instead of sync_signal.
Activity stream replaced static tabs with a dropdown checkbox filter supporting 10 categories:
Queue · Board · CRM · Calendar · Goals · Comms · Connections · Drive · Settings · Sync
Multiple categories can be selected simultaneously. Badge count shows active filter count. New activity logging added for: settings changes, Google connections, action tag executions, sync completions, checklist completions/unchecks.
API: GET /api/activity?categories=board,queue,sync — comma-separated category filter parameter.
dividen:now-refresh event + refreshKey propsync_signal (sync only), now uses two-step catch_up flow (sync + brief)/api/inbox and /api/drive 404s — badge count endpoints were missing entirely. Added both — query EmailMessage and Document respectivelyCovers v1.6.1 → v1.6.2 → v1.7.0 → v1.8.0 → v1.8.1
Federated instances can now sync capabilities to DiviDen's managed marketplace — not just agents.
POST /api/v2/federation/capabilities — sync capabilities from a federated instance (max 50 per call). Accepts promptGroup, signalPatterns, tokenEstimate, alwaysLoad.GET /api/v2/federation/capabilities — list capabilities currently synced from your instance.promptGroup, sourceInstanceId, sourceInstanceUrl, remoteCapabilityId to MarketplaceCapability.pending_review — no auto-approve, even for trusted instances.Federated developers (people who build agents on other DiviDen instances) now have a presence on the managed platform.
/developer/{slug} — shows developer name, purple Federated via {instance} badge, all their agents and capabilities on DiviDen.person results in search and as federated_developer entries in the directory.pricePerTask, pricingAmount, or price — with string→float coercion.accessPassword now passes through federation agent sync (was silently dropped before). Users on DiviDen can unlock agents using developer-shared passwords.pricePerTask and pricingModel for debugging.Canonical naming conventions established for the federation protocol — instances sending agents and capabilities should use these values:
| Legacy / Alias | DiviDen Canonical | Notes |
|---|---|---|
per_execution | per_task | Both accepted, stored as per_task |
pending_approval | pending_review | Canonical status for all submissions |
pricingAmount | pricePerTask | Alias accepted and mapped automatically |
currency field supported (ISO 4217, default USD).status: 'pending_review' added to federation sync response.pending_review.developerName + developerUrl. No bio, title, company, or industry fields.capabilities object parsed on agent submissions (identity, taskTypes, contextInstructions).reviewedAt, reviewedById, reviewNotes in the database — full audit trail.ActivityLog when marketplace agents or capabilities are submitted for review.ActivityLog on approval, rejection, or suspension.reviewedAt, reviewedById, reviewNotes on both MarketplaceAgent and MarketplaceCapability.Phase 2 of the modular capability system — marketplace capabilities are now data-driven modules that integrate with the relevance engine.
CapabilityModule interface in src/lib/capability-module.ts — scoring, loading, prompt injection.scoreCapabilityModule() uses same weights as static groups — message match (+0.6), context match (+0.3), baseline (+0.05), threshold (0.3).loadRelevantCapabilityModules(userId, message, context) fetches installed caps, scores them, returns only those above threshold.signalPatterns, tokenEstimate, alwaysLoad, moduleVersion, revenue tracking fields on MarketplaceCapability.calculateRevenueSplit().GET /api/v2/prompt-groups — exposes all 17 static prompt groups, signal patterns, scoring params, and the CapabilityModule spec. For federation alignment.POST /api/marketplace/webhook — receives agent_approval events from the managed marketplace. Validates X-Federation-Token.Complete rewrite of how new users get set up — project-based, conversational, and non-blocking.
onboardingPhase field still exists but is no longer read.The monolithic buildCapabilitiesAndSyntax() function dumped 7,219 tokens into every single message — triage protocol, routing logic, federation commands, marketplace operations — regardless of what the user actually asked. "Good morning" got the same payload as "run my triage catch-up."
The monolith is now split into 5 purpose-built functions. Only capabilities_core loads on every message. The rest load on-demand based on relevance scoring:
| Module | Tokens | Loads When |
|---|---|---|
capabilities_core | ~3,200 | Always — Card CRUD, checklists, people, queue, goals, widgets, Linked Kards, task awareness |
capabilities_triage | ~1,200 | Triage, catch-up, morning briefing, signal processing |
capabilities_routing | ~800 | Task routing, delegation, relay, connection handling |
capabilities_federation | ~200 | Cross-instance resolution, serendipity, network briefing |
capabilities_marketplace | ~200 | Agent listing, install/uninstall, subscribe, execute |
selectRelevantGroups() now manages 17 prompt groups (up from 13). Each group has regex signal patterns in SIGNAL_PATTERNS. The engine scores each module against the current message + recent context. Groups with empty patterns (like capabilities_core) always score 1.0.
Assembly wires modules as groups 7 (core), 7b (triage), 7c (routing), 7d (federation), 7e (marketplace).
layer16_platformSetupAssistant_optimized — 130-line function defined but never called. Gone.~5,000-6,000 tokens saved per typical message (non-triage, non-routing). That's roughly 30% of the old always-on payload. Triage messages still get the full protocol — loaded on-demand instead of wasting context window when you're talking about something else.
Phase 2 is now live: a formal CapabilityModule interface where marketplace capabilities are data-driven, per-user installable modules that integrate with the relevance engine. See v1.8.1 release notes above for details.
The ActivityLog model gains two new fields and a composite index for card-scoped queries:
cardId String? — FK to KanbanCard. Promotes card context from metadata JSON to a queryable, indexed column.isCrossUser Boolean @default(false) — Flags entries that were mirrored from a linked card owned by another user.@@index([cardId, createdAt]) — Composite index for fast card-scoped feed retrieval.mirrorActivityToLinkedCards() fires automatically (fire-and-forget) when logActivity() is called with a cardId. For each CardLink pointing to a card owned by a different user, it creates a mirror ActivityLog entry:
isCrossUser: true and the acting user's name as actorAll card-related activity now writes cardId:
POST /api/kanban → card_createdPATCH /api/kanban/[id] → card_updatedDELETE /api/kanban/[id] → card_deletedPOST /api/kanban/[id]/move → card_movedaction-tags.ts: task_completed, task_routed, task_decomposedcard-auto-complete.ts: card_auto_completedGET /api/kanban/[id]/activity — Card-scoped activity feed with cursor pagination.
?limit=50&cursor=<id>isCrossUser) entries, ordered by createdAt descCollapsible Activity section in the card detail modal. Lazy-loads on first expand.
/api/activity + SSE) remains user-scoped — no cross-user bleedTeams are a grouping mechanism — a convenient way to add multiple users to a project as an organized bundled unit. CoS delegation still operates at the ProjectMember level.
Team model: name, description, ownerId, originInstanceUrl, isSelfHostedTeamMember join table with role enum: OWNER, ADMIN, MEMBERTeamProject join table links teams → projects, auto-syncs members to ProjectMemberoriginInstanceUrl tracks which DiviDen instance the team was created on — drives billing boundary/api/v2/teams (GET, POST), /api/v2/teams/[id] (GET, PATCH, DELETE)Token-based invite system with email + role + expiry. Invite page at /team/invite/[token] handles acceptance for both existing and new users.
TeamInvite model: email, role, token (unique), expiresAt, status (PENDING / ACCEPTED / EXPIRED)POST /api/v2/teams/[id]/invites (create), POST /api/v2/teams/invites/accept (accept by token)isSelfHosted: true → unlimited teams, invites, members)TeamMember and syncs to all TeamProject linked projectsWhen CoS dispatches a task scoped to a project, it now resolves project contributors (via team membership sync) and selects the best-fit member using strategy priority:
ProjectMember are first-class contributors — no separate delegation pathcosExecution.delegationStrategy on each queue itemBilling follows team origin, not member origin. Platform-hosted teams are subject to feature gates; self-hosted teams bypass all gates.
isSelfHosted: true → all gates bypassed, unlimited everythingSelf-hosted DiviDen instances can implement the full teams architecture at zero cost. See the Teams API reference and Open Source page for details.
isSelfHosted: true on all team records → feature gates bypassedoriginInstanceUrl to your instance's public URL/team/invite/[token]/team/[id], user profiles at /profile/[userId]Nothing enters the execution queue without explicit user approval. New pending_confirmation status sits above ready.
pending_confirmation — user sees ✓ Approve / ✕ Reject in Queue panelready (enters execution pipeline). Reject → deleteddispatch_queue and queue_capability_action action tagsqueueAutoApprove: true via PATCH /api/v2/settingsUser.queueAutoApprove field (default: false)CoS mode now proactively executes tasks — capability invocation, agent delegation via relay, or direct generic execution.
cosExecution on queue item3 new action tags let users manage queue items entirely from conversation with Divi:
confirm_queue_item — approve pending items from chatremove_queue_item — delete items from chatedit_queue_item — update title/description/priority, triggers Smart Prompter re-optimizationAgent-aware optimization engine that structures tasks for their target execution agent:
displaySummary (≤120 chars for queue card) + optimizedPayload (structured for agent input schema){task, context, deliverables, files, constraints} when no agent schemaoptimizedPayload when availableComplete rewrite of the onboarding flow — no more wizard walkthrough. Divi guides through setup in chat.
[[show_settings_widget]] action tagFixed a critical bug where users stuck in mid-onboarding (phases 1–5) had their queue, NOW panel, and Divi context blocked.
PUT /api/settings now supports onboardingPhase updates directlyPOST /api/v2/queue/{id}/confirm — approve/reject pending items (Bearer auth)GET /api/v2/settings — read mode, queueAutoApprove, diviName, goalsEnabledPATCH /api/v2/settings — update mode + queue behavior. CoS auto-dispatches on switch.pending_confirmation statusFlowchart redesigned from linear (1→5) to continuous loop architecture reflecting the actual system:
Marketplace agents now support four pricing models — from free through dynamic, agent-quoted pricing.
free, per_task, tiered, and dynamicimmediate → quoted → approved / declinedMarketplaceExecution fields: pricingPhase, quoteAmount, quoteCurrency, quoteMetadata, quotedAt, approvedAtparsePricingConfig, serializePricingConfig, resolveExecutionPricePOST /api/marketplace/:id/execute/:executionId — approve or decline a quoted pricepricingPhase: 'declined' with no chargeGET .../:executionId returns full execution status including quote detailsonAction handler wired for purchase / decline actionsThe agent sync endpoints now accept comprehensive configuration during registration.
pricingModel, pricingConfig object (tiers, min/max for dynamic), pricePerTask, subscriptionPrice, taskLimittaskTypes, contextInstructions, requiredInputSchema, outputSchema, usageExamples, executionNotesinstallGuide, commands, samplePrompts, version, agentCardUrlsupportsA2A, supportsMCPPUT /api/v2/federation/agents/:remoteId — register or update a single agent (upsert)GET /api/v2/federation/agents/:remoteId — retrieve agent details + revenue statsDELETE /api/v2/federation/agents/:remoteId — remove agent, cascade-delete subscriptions and executions409 with actionable errorpublisherName, publisherType (platform / community / partner), publisherUrlapprovalStatus (pending / approved / rejected) with admin PATCH controlskillFormat: true, source: agentskills.io)free (emerald), per_task (amber), subscription (purple), tiered (blue), dynamic (pink)/api/network/status endpoint; FederationManager triggers automatic registration check/federation/agents batch and single-agent endpointspricingConfig, integration kit fields, and protocol flagsA new system for discovering, installing, customizing, and creating skill packs that extend what Divi can do for you.
integrationConnected boolean per capability422 INTEGRATION_REQUIRED with actionable error messageintegrationType: null) install without restriction[[suggest_marketplace:...]]GET /api/marketplace-capabilities — Browse all or installed only (?installed=true)POST /api/marketplace-capabilities — Install capability (with integration gating) or create custom (action: 'create')GET /api/marketplace-capabilities/:id — Detail view (prompt hidden until installed)PATCH /api/marketplace-capabilities/:id — Update customizations, resolves prompt templateDELETE /api/marketplace-capabilities/:id — Uninstall capabilityMarketplaceCapability — name, slug, description, icon, category, tags, integrationType, pricingModel, price, editableFields (JSON), prompt, promptVersion, status, featured, totalPurchases, avgRating, isSystemSeedUserCapability — userId, capabilityId, status, customizations (JSON), resolvedPrompt, installedAt, lastUsedAtapiKey and name fields/.well-known/agent-card.json no longer returns 500 when the federation config table is emptydispatch_queue action tag now queue-gated — fails if no handler availablesuggest_marketplace action tag for inline capability suggestions in chatstatus field and endpoints.agentSyncPOST /api/v2/federation/validate-payment endpointmarketplace-config.ts and recruiting-config.tsCalendarEvent.accountEmail, Document.accountEmail, Document.mimeType, Document.fileSize, Document.thumbnailUrlmarketplace_browse — Search and filter marketplace agents by category, pricing, skillsmarketplace_unlock — Unlock paid agents with developer-shared access passwordsmarketplacePasswordAccess and persistentConversationmarketplacePasswordAccess: true, persistentConversation: truetask_dispatched, new_message, wake, queue_changed, relay_state_changedpropose_task action tag: creates agent suggestions for human review before network postingTasksTab: shows ALL tasks across users with filters/searchUsageTab: feature adoption heatmap, per-user engagement, daily trendsSystemPromptTab: read-only inspector with token estimates per group/documentation14 FVP proposals, Agent Integration Kit, Install/Uninstall lifecycle, dynamic MCP tools, and marketplace coherence.
Four migrations since last push:
Migration: 20260411_add_relay_threading_and_artifacts
-- FVP Brief Proposals #2 and #3: Relay Threading + Structured Artifacts
ALTER TABLE "agent_relays" ADD COLUMN "threadId" TEXT;
ALTER TABLE "agent_relays" ADD COLUMN "artifactType" TEXT;
ALTER TABLE "agent_relays" ADD COLUMN "artifacts" TEXT;
CREATE INDEX "agent_relays_threadId_idx" ON "agent_relays"("threadId");Migration: 20260411_add_portable_reputation
-- FVP Brief Proposal #7: Portable Reputation ALTER TABLE "reputation_scores" ADD COLUMN IF NOT EXISTS "isFederated" BOOLEAN NOT NULL DEFAULT false; ALTER TABLE "reputation_scores" ADD COLUMN IF NOT EXISTS "endorsements" TEXT; ALTER TABLE "reputation_scores" ADD COLUMN IF NOT EXISTS "federatedScore" DOUBLE PRECISION NOT NULL DEFAULT 0;
Migration: 20260411_add_agent_integration_kit
-- Agent Integration Kit: 7 new fields on MarketplaceAgent ALTER TABLE "marketplace_agents" ADD COLUMN "taskTypes" TEXT; ALTER TABLE "marketplace_agents" ADD COLUMN "contextInstructions" TEXT; ALTER TABLE "marketplace_agents" ADD COLUMN "requiredInputSchema" TEXT; ALTER TABLE "marketplace_agents" ADD COLUMN "outputSchema" TEXT; ALTER TABLE "marketplace_agents" ADD COLUMN "usageExamples" TEXT; ALTER TABLE "marketplace_agents" ADD COLUMN "contextPreparation" TEXT; ALTER TABLE "marketplace_agents" ADD COLUMN "executionNotes" TEXT;
Migration: 20260411_add_agent_install_management
-- Agent Install/Uninstall lifecycle on MarketplaceSubscription ALTER TABLE "marketplace_subscriptions" ADD COLUMN "installed" BOOLEAN NOT NULL DEFAULT false; ALTER TABLE "marketplace_subscriptions" ADD COLUMN "installedAt" TIMESTAMP(3); ALTER TABLE "marketplace_subscriptions" ADD COLUMN "uninstalledAt" TIMESTAMP(3);
threadId String? — Groups multi-turn relay conversationsartifactType String? — One of: text, code, document, data, contact_card, calendar_invite, email_draftartifacts String? — JSON-encoded structured artifact payloadisFederated Boolean @default(false) — Whether score includes cross-instance dataendorsements String? — JSON array of HMAC-signed attestation objectsfederatedScore Float @default(0) — Weighted federation reputation scoretaskTypes String? — JSON array of task type strings this agent handlescontextInstructions String? — How to prepare context before invoking this agentrequiredInputSchema String? — JSON schema describing required input fieldsoutputSchema String? — JSON schema describing output formatusageExamples String? — JSON array of example invocations with expected resultscontextPreparation String? — Steps Divi should take before delegating to this agentexecutionNotes String? — Runtime notes — timeouts, retries, known limitationsinstalled Boolean @default(false) — Whether agent is actively installed in user memoryinstalledAt DateTime? — Timestamp of last installuninstalledAt DateTime? — Timestamp of last uninstall| File | Purpose |
|---|---|
entity-resolution.ts | Universal entity resolution across contacts, connections, cards, events, emails, relays, team members |
task-exchange.ts | Auto-propose tasks to best-matched connections by skill/capacity/reputation |
webhook-push.ts | Push relay state changes to connected instances via webhook |
relay-queue-bridge.ts | Bidirectional sync between relays and queue items |
ambient-learning.ts | Signal capture, pattern synthesis, ambient relay learning loop |
activity.ts | logActivity() — universal event logger, fire-and-forget |
now-engine.ts | Dynamic NOW scoring: priority, impact, deadline, calendar gaps, relay freshness |
brief-assembly.ts | Context brief assembly + skill matching + project context |
telemetry.ts | Request/error logging, client IP tracking |
job-matcher.ts | Job-to-profile matching engine |
queue-dedup.ts | Queue item deduplication |
queue-dispatch.ts | Chief of Staff auto-dispatch |
cos-sequential-dispatch.ts | Sequential task dispatch in CoS mode |
| File | Purpose | Key Exports |
|---|---|---|
federation/pattern-sharing.ts | Cross-instance ambient learning pattern exchange | exportShareablePatterns(), importSharedPatterns(), getNetworkLearningDigest() |
federation/graph-matching.ts | Serendipity engine — triadic closure, complementary expertise, structural bridges | buildLocalGraph(), findSerendipityMatches(), exportGraphTopology() |
federation/composite-prompts.ts | Network briefing aggregation from federated peers | generateLocalBriefingContribution(), compileNetworkBriefing() |
federation/task-routing.ts | 7-signal weighted scoring for network-level task routing | routeTask(), getRoutingIntelligenceDigest() |
skill match: 30% completion rate: 20% capacity: 15% trust: 10% reputation: 10% latency: 5% domain proximity: 10%
| Route | Methods | Auth | Purpose |
|---|---|---|---|
/api/federation/patterns | GET, POST | x-federation-token | Exchange anonymized ambient learning patterns |
/api/federation/briefing | GET, POST | Session / x-federation-token | Network briefing aggregation |
/api/federation/routing | GET, POST | Session / x-federation-token | Intelligent task routing with 7-signal scoring |
/api/federation/graph | GET, POST | Session / x-federation-token | Serendipity matches + graph topology export |
/api/federation/mcp | POST | x-federation-token | Cross-instance MCP tool invocation (trust-gated) |
/api/federation/entity-search | GET, POST | x-federation-token | Privacy-respecting cross-instance entity lookup |
/api/federation/jobs/apply | POST | x-federation-token | Remote job application routing |
/api/federation/reputation | GET, POST | x-federation-token | Portable reputation with HMAC-signed attestations |
/api/federation/project/[id]/context | GET | x-federation-token | Cross-instance project dashboard |
| Route | Methods | Auth | Purpose |
|---|---|---|---|
/api/marketplace | GET, POST | Session | List / register marketplace agents (POST auto-installs own agents) |
/api/marketplace/[id] | GET, PUT, DELETE | Session | Agent detail, update, remove |
/api/marketplace/[id]/install | POST, DELETE | Session | Install (POST) / Uninstall (DELETE) — payment-gated for paid agents |
/api/marketplace/[id]/execute | POST | Session | Execute agent task with input payload |
/api/marketplace/[id]/subscribe | POST, DELETE | Session | Subscribe/unsubscribe — unsubscribe cascades to uninstall + memory clear |
/api/marketplace/[id]/rate | POST | Session | Rate an agent (1-5 stars) |
/api/marketplace/earnings | GET | Session | Agent creator earnings dashboard |
/api/marketplace/fee-info | GET | Public | Platform fee structure |
| Route | Methods | Purpose |
|---|---|---|
/api/entity-resolve | GET, POST | Universal entity resolution |
/api/jobs | GET, POST | Network job board CRUD |
/api/jobs/match | GET | Job-to-profile matching |
/api/jobs/[id] | GET, PUT, DELETE | Individual job operations |
/api/jobs/[id]/apply | POST | Job applications |
/api/reputation | GET, POST | Reputation scores |
/api/briefs | GET | Brief assembly receipts |
/api/now | GET | Dynamic NOW engine scored items |
/api/activity | GET | Universal activity feed (filterable by category) |
/api/ambient-learning/synthesize | GET, POST | Trigger pattern synthesis |
/api/mcp | GET, POST | MCP Server v1.4.0 |
/api/a2a | POST | A2A protocol endpoint |
/api/a2a/playbook | GET | Operational playbook |
/api/main-connect | POST | Connection ceremony |
/api/main-disconnect | POST | Disconnection |
/api/main-handoff | GET | Handoff brief |
/api/status | GET | Enhanced health check (DB + migrations + env) |
File: src/app/api/mcp/route.ts
| Tool | Description |
|---|---|
relay_thread_list | List relay threads for the current user |
relay_threads | Get all relays in a specific thread |
relay_send | Send a relay to a connection |
entity_resolve | Cross-surface entity resolution (contacts, connections, cards, events, emails, relays, teams) |
serendipity_matches | Graph topology matching — "you should meet X" recommendations |
route_task | Network-level task routing with 7-signal weighted scoring |
network_briefing | Composite cross-instance network pulse |
tools/list now dynamically includes installed marketplace agents as tools. Each installed agent becomes a marketplace_{slug} tool.tools/call handles marketplace_* prefixed tools — proxies to agent endpoint.
tools/listmarketplace_{slug} (e.g., marketplace_research_agent)requiredInputSchema# Static tools (20)
queue_list, queue_add, queue_update,
contacts_list, contacts_search,
cards_list, mode_get, briefing_get, activity_recent,
job_post, job_browse, job_match, reputation_get,
relay_thread_list, relay_threads, relay_send,
entity_resolve,
serendipity_matches, route_task, network_briefing
# Dynamic tools (per-user, based on installed agents)
marketplace_{slug} — one per installed agentFile: src/app/.well-known/agent-card.json/route.ts
streaming: true pushNotifications: true stateTransitionHistory: true threading: true structuredArtifacts: true statusUpdates: true webhookPush: true
tasks/send tasks/get tasks/list tasks/respond tasks/cancel tasks/update_status agent/info
Skills array now dynamically includes installed marketplace agents. Each installed agent becomes a skill entry with its task types, and mcpTools includes marketplace_{slug} entries.
federation.connect /api/federation/connect federation.relay /api/federation/relay federation.jobs /api/federation/jobs federation.jobApply /api/federation/jobs/apply federation.reputation /api/federation/reputation federation.mcp /api/federation/mcp federation.entitySearch /api/federation/entity-search federation.patterns /api/federation/patterns federation.briefing /api/federation/briefing federation.routing /api/federation/routing federation.graph /api/federation/graph
New sections added: Federation Intelligence (FVP Brief) + Marketplace Agent Loading (Layer 11)
| Action Tag | Syntax | Purpose |
|---|---|---|
entity_resolve | [[entity_resolve:{"query":"email/name/domain"}]] | Cross-surface entity resolution |
serendipity_matches | [[serendipity_matches:{}]] | Graph topology matching for connection recommendations |
route_task | [[route_task:{"taskDescription":"...","taskSkills":["..."],"taskType":"..."}]] | Network-level intelligent task routing |
network_briefing | [[network_briefing:{}]] | Composite cross-instance network pulse |
installed: true[[install_agent:...]] when relevantNew event: relay_state_changed
pushRelayStateChanged() fires when relay status transitions (pending → delivered → completed). Wired into:
Webhook config stored in ServiceApiKey with service='webhook_push'.
Complete agent lifecycle: register → browse → subscribe → install → execute → uninstall. Agents are only loaded into Divi's context when explicitly installed.
Seven new fields on MarketplaceAgent that tell Divi how to use an agent — not just that it exists.
taskTypes — what this agent can docontextInstructions — how to prepare contextrequiredInputSchema — JSON schema for inputoutputSchema — JSON schema for outputusageExamples — example invocationscontextPreparation — pre-delegation stepsexecutionNotes — timeouts, retries, limitsagent:{id}:identity (tier 1)
agent:{id}:task_types (tier 1)
agent:{id}:context_instructions (tier 2)
agent:{id}:preparation_steps (tier 2)
agent:{id}:input_schema (tier 2)
agent:{id}:output_schema (tier 2)
agent:{id}:usage_examples (tier 3)
agent:{id}:execution_notes (tier 3)| Action | What Happens |
|---|---|
Install (free agent) | Auto-creates subscription + sets installed=true + loads all Integration Kit memory keys |
Install (paid agent) | Requires active subscription — sets installed=true + loads memory |
Uninstall | Sets installed=false + uninstalledAt timestamp + deletes all memory keys for agent |
Unsubscribe | Cascades to uninstall + clears memory + removes subscription |
Register own agent | Auto-installs immediately — your own agents are always available |
isOwnAgent: true flag in list responsesmarketplace_{slug} toolsinstalled: true agents into contextTwo entries in src/lib/updates.ts:
Install / Uninstall — Divi Only Learns What You Need (NEW)
April 11, 2026
FVP Integration Brief — 14 Proposals, One Build
April 11, 2026 @ 11:45 PM
@media (display-mode: standalone) {
html {
height: 100%;
overflow: hidden;
overscroll-behavior: none;
}
body {
height: 100%;
overflow: hidden;
overscroll-behavior: none;
padding-top: env(safe-area-inset-top, 0px);
padding-bottom: env(safe-area-inset-bottom, 0px);
}
.app-shell {
height: 100%;
}
}| File | Purpose |
|---|---|
scripts/setup.sh | One-command setup for macOS/Linux/WSL |
scripts/setup.ps1 | One-command setup for Windows PowerShell |
docker-compose.yml | Local PostgreSQL 16 via Docker |
.env.example | Clear Required/Optional variable documentation |
README.md | Quick Start-first, troubleshooting FAQ sections |
GET /api/status now returns: database connection status + user count, migration validation, environment variable validation. Returns 200 (healthy) or 503 (unhealthy).
| File | Purpose |
|---|---|
public/mcp-registry/server.json | Official MCP Registry format |
public/mcp-registry/README.md | Copy-paste submission kit for 5 registries (Official, Smithery, PulseMCP, Glama, mcp.so) |
# Federation Intelligence (FVP) src/lib/federation/pattern-sharing.ts src/lib/federation/graph-matching.ts src/lib/federation/composite-prompts.ts src/lib/federation/task-routing.ts src/lib/entity-resolution.ts src/lib/task-exchange.ts src/app/api/federation/patterns/route.ts src/app/api/federation/briefing/route.ts src/app/api/federation/routing/route.ts src/app/api/federation/graph/route.ts src/app/api/federation/mcp/route.ts src/app/api/federation/entity-search/route.ts src/app/api/federation/jobs/apply/route.ts src/app/api/federation/reputation/route.ts src/app/api/entity-resolve/route.ts # Marketplace Install/Uninstall src/app/api/marketplace/[id]/install/route.ts # Migrations prisma/migrations/20260411_add_relay_threading_and_artifacts/ prisma/migrations/20260411_add_portable_reputation/ prisma/migrations/20260411_add_agent_integration_kit/ prisma/migrations/20260411_add_agent_install_management/
prisma/schema.prisma — AgentRelay (3), ReputationScore (3), MarketplaceAgent (7), MarketplaceSubscription (3) src/app/api/mcp/route.ts — v1.4.0, dynamic marketplace tools src/app/.well-known/agent-card.json/route.ts — dynamic skills + marketplace MCP tools src/app/api/marketplace/route.ts — auto-install on registration, Integration Kit memory loading src/app/api/marketplace/[id]/subscribe/route.ts — unsubscribe cascades to uninstall + memory clear src/lib/system-prompt.ts — Layer 11 marketplace agent loading + install suggestions src/lib/action-tags.ts — install_agent, uninstall_agent, list_marketplace, execute_agent, subscribe_agent src/lib/webhook-push.ts — relay_state_changed event src/lib/updates.ts — Install/Uninstall changelog entry src/components/dashboard/MarketplaceView.tsx — Install/Uninstall toggle, Installed badge src/app/globals.css — PWA viewport fix src/app/layout.tsx — overflow-x-hidden on body src/app/dashboard/page.tsx — Mobile flex layout fix src/components/dashboard/ChatView.tsx — flex-shrink-0 on header/input
# 1. Pull latest code
git pull origin main
# 2. Install dependencies
yarn install
# 3. Generate Prisma client
yarn prisma generate
# 4. Apply migrations
yarn prisma migrate deploy
# 5. Build
yarn build
# 6. Verify
curl https://os.dividen.ai/api/status
curl https://os.dividen.ai/.well-known/agent-card.json | jq '.version'
curl -s https://os.dividen.ai/api/mcp -X POST \
-H 'Content-Type: application/json' \
-d '{"method":"server/info"}' | jq '.result.version'/api/status → 200 with all checks passing0.5.01.6.0tools/list → 22 static tools + dynamic marketplace toolsDownload a plain-text copy of this page
Last updated: May 30, 2026
DiviDen Command Center -- Last updated May 30, 2026