Search and notifications
Workspace-scoped global search (⌘K) and the derived notification inbox.
Global search finds workspace objects and jumps to a view. It does not run Command Center actions. The notification inbox is a derived list (runs, schedules, deployments, credentials, documents) with in-process read/archive state.
HTTP: Search, Notifications.
Global search
Press ⌘K or Ctrl+K anywhere, or call GET /api/search /
GET /api/v1/search.
The query is lowercased and split on non-alphanumeric characters. Tokens of length 1 are
dropped. If no token remains, results is []. Scoring: each remaining term adds 1 if it
appears in indexed fields and 2 if it appears in the title. Results with score > 0 sort by
score desc, then title, then slice to a limit.
Default limit is 20. Session search has no limit query param (always 20). v1 accepts
limit; non-positive or non-numeric values fall back to 20. There is no upper clamp on v1.
Indexed types and default targetView:
type | Typical jump |
|---|---|
workspace | home |
workflow | workflow |
document | docs |
knowledgeBase | knowledge |
table | databases (includes cell text) |
run | logs (targetId is workflow id) |
schedule | schedules |
webhook | workflow |
credential | settings / secrets |
apiKey | settings / api-keys (masked) |
aiProvider | settings / byok |
mcpServer | settings / workflow-mcp-servers |
customTool | settings / custom-tools |
skill | settings / skills |
mailerRoute | settings / mailer |
chat | home (indexes message bodies) |
notification | notifications |
auditEvent | settings / audit-logs |
Search uses getPlatformSnapshotForWorkspace for the caller’s user. Session access to another
workspace requires membership (403 Cannot access search results for another workspace.).
Notifications
GET lists workspace-scoped rows. Types: run, schedule, deployment, credential,
document. Priority: critical, warning, info, success. Status: unread, read,
archived.
PATCH actions:
| Body | Effect |
|---|---|
{ "all": true } | Mark every non-archived row read |
{ "id", "action": "read" } | Mark one read (action may be omitted) |
{ "id", "action": "archive" } | Mark archived and also record as read |
Unknown action (for example delete): 400 Notification action must be read or archive.
Missing id when not all: 400 Notification id is required. Unknown id: 404.
Read and archive ids live in process memory (readNotificationIds /
archivedNotificationIds). A new web instance or restart forgets those marks; the derived rows
reappear as unread. There is no create/delete notification API and no pagination.
Human Task notifications
Human Task assignment, reminder, escalation, and orphan (no-eligible-user) alerts are delivered
through a transactional notification outbox, not this derived inbox. The outbox record commits in
the same durable boundary as the task and checkpoint, and dispatch begins only after commit, so an
early response is never lost. Delivery is retried with backoff; on exhaustion the record becomes
failed (never silently dropped), and the Tasks inbox remains the source of truth. Outbox records
carry only a bounded payload and digests — never raw draft/form values or resume secrets. Watch the
humanTask.outbox.retryExhausted counter for channel outages and see the
Human Task recovery runbook.
Gaps
- Session search cannot raise the 20-result cap.
- v1 search does not reject huge
limitvalues. - Notification read/archive is not durable across processes.
- Inbox rows are generated from the platform snapshot, not a first-class notification store.
