UserProfileFull
userobject · requiredsettingsobject · requiredonboardingobject · requiredPer-user onboarding state. Stores draft user input + wizard progress. Step "completion" is derived from real product state, not stored here. No secrets — vault tokens stay in AppSettings.vaultProviders.
UserProfile
idstring · requiredlastProjectIdstring · requiredmanualBalancenumber · requiredsubscriptionBalancenumber · required
stripeCustomerIdstringprojectIdToAgentIdobjectConstruct a type with a set of properties K of type T
AppSettings
idstring · requiredthemestring · requireddiffControlstring · requiredshellExecutionstring · requiredemailNotificationsboolean · requiredpushNotificationsboolean · requireddataAnalyticsboolean · requiredplaySoundOnTaskCompleteboolean · requiredshowTodoCompletionToastboolean · required
previewAutoColumnsnumberPreferred column count used by the automatic preview-window layout. Defaults to 3.
todoListThemeshowOpenElsewherebooleanOpt-in: board cards show which of my other frontends (tab / desktop app / phone) have the todo open. Off = this frontend neither reports nor tracks presence.
tabNotificationModeHow the browser-tab red "done" dot behaves after a TODO finishes.
todoOpenModeWhat opening a TODO from the board does: a floating preview window over the board (default, the advanced workspace) or the full-page chat.
disabledMentionSourcesstring[]Disabled
keyboardBindingsobjectConstruct a type with a set of properties K of type T
keyboardShortcutsEnabledbooleandefaultViewModestringmodelMentionAliasesstring[]Enabled model-mention aliases (e.g. 'claude', 'gpt') for
showDiffMergeControlsbooleanShow accept/reject chunk controls in the diff (merge) view. Off by default — with auto-apply the diff is just a record of what got applied, so the controls are unnecessary noise.
showAgentColorsbooleanshowAgentNameInComposerbooleanShow the selected agent's name (with an expand chevron) on the collapsed composer trigger instead of the plain settings cog icon.
showAllowAllButtonbooleanshowAutoDoneButtonbooleanShow the Auto-Done toggle in the message toolbar. When the toggle is on, the next run's successful completion lands the todo in DONE instead of READY.
showSystemPromptbooleanShow the agent's system prompt (and its diffs) inline in chat. Also makes the backend ask the agent for it: the prompt is only attached to a finished message when this is on (or an x-tfa-debug turn), since it is tens of KB per message.
developerModebooleanDeveloper mode: reveals the Developer group in View settings (debug-only toggles). Purely cosmetic — it gates no capability, every toggle inside works on its own. Staff-granted:
adminUser.setDeveloperModeis the only writer — updateUserSettings drops the key, so no client can reveal the group for itself.showAgentJsonExportbooleanShow the JSON export button in the agent settings modal header.
surfaceModeHow much of the machine layer the UI exposes — see
SurfaceMode. Unset meansbasicfor accounts with no paired machine andadvancedonce one exists, so existing users never lose their cards.useDeviceWallpaperbooleanPaint each device card with that machine's real desktop wallpaper, captured by the bridge when it reconnects. Off keeps every card on the built-in OS-themed gradient. Individual devices can still opt out on their own via
Device.metadata.wallpaper.mode. Default off — the wallpaper is a personal image, so uploading it is opt-in.showProjectPickerInSidebarProject picker at the top of the todo sidebar (team plan only).
offhides it,autoshows it only when you have more than one project,alwayskeeps it pinned. Defaults toauto.toolDisplayVerbosityDesktopTool-block display density, resolved per viewport.
collapsedkeeps non-essential tool blocks collapsed (one-line summary, click to expand).normalopens them by default.debugadditionally surfaces internal fields (pid, timeout, …) on shell/bash blocks. Desktop defaults tonormal, mobile tocollapsed.toolDisplayVerbosityMobilegroupToolDisplaybooleanCollapse consecutive tool-only assistant messages into a single group row. Backend defaults to true (the recommended workflow); set false to render each tool block individually. Independent of verbose tool display.
showThinkingTracesWhich finished reasoning ("Thinking") blocks stay in chat. Default 'last'; hidden reason blocks render nothing, which also lets more consecutive tool messages collapse into a single group.
showShellFileChangesbooleanShow the files a shell command touched (edge/bridge git tracking) under Shell blocks. Default off: the heuristic can pick up unrelated concurrent edits. When on, each diff still renders collapsed.
vaultProvidervaultConfigvaultProvidershostDesktopItemsobjectPer-host desktop layout, keyed by host id (device/edge id, or "cloud"). An ordered list of items; array index IS the order. Items absent from a host's list are appended (in the host's default order) on render, and items whose key no longer exists are dropped.
todoContributorFilterobjectPer-project people filter for the todo list, keyed by project id: user ids whose todos are shown. Absent key = everyone.
aiDataConsentAtnumberWhen the user agreed that their content is sent to the provider of the AI model they pick.
companyNamestringvatNumberstringaddressLine1stringaddressLine2stringcitystringstatestringpostalCodestringcountryISOstringaddressValidbooleanvatStatusRead-only: set from Stripe, never accepted from the client.
Recordstring__type
configobject · requiredConstruct a type with a set of properties K of type T
enabledboolean · required
RecordstringArrayHostDesktopItem
keystring · requiredTile identity.key (e.g. "filesystem", "gh") or widget id (e.g. "widget:activity").
wnumberColumn span (default 1).
hnumberRow span (default 1).
kindDiscriminates render path. Defaults to 'tile' when omitted.
HostDesktopItem
keystring · requiredTile identity.key (e.g. "filesystem", "gh") or widget id (e.g. "widget:activity").
wnumberColumn span (default 1).
hnumberRow span (default 1).
kindDiscriminates render path. Defaults to 'tile' when omitted.
Onboarding
idstring · requiredid === userId
versionnumber · requiredSchema version for future migrations
updatedAtnumber · requiredLast server-side write timestamp (last-write-wins)
startedAtnumbercompletedAtnumbertodoIdstringThe board's setup todo (ONBOARDING_AGENT); kept (DONE) after finishing, '' on restart.
currentStepstringStepper step id the user is on
websiteUrlstringboardModePersonal board (no brand UI) or business board (brand card, analyzer, voice).
AccountDataExport
exportedAtstring · requireduserrequiredprofilerequiredsettingsrequiredonboardingrequiredauthSessionsarray · requiredauthAccountsarray · requiredprojectsarray · requiredprojectSettingsarray · requiredtodosarray · requiredmessagesarray · requiredagentSettingsarray · requirededgesarray · requireddevicesarray · requiredapiKeysarray · requiredtasksarray · requiredscheduledTasksarray · requiredusagearray · requiredtransactionsarray · requiredexternalDataSourcesarray · requiredtodoCostsarray · requiredhexGridsarray · requiredgridTilesarray · requiredattachmentsarray · requiredbusinessContextsarray · requiredvaultobject · required
DailyUsage
dayTSnumber · requiredtotalSpentnumber · requiredtotalAddednumber · requiredmessageCountnumber · requiredmcpUsageCountnumber · requiredmodelUsageobject · requiredConstruct a type with a set of properties K of type T
updatedAtnumber · required
todoCountnumberTodos started this day. Missing on records from before the counter existed.
toolCallCountnumberTool blocks completed this day. Missing on records from before the counter existed.
TeamUsageQueryInput
startDatestringendDatestringownerIdstringTeam to act on, identified by its owner's user id.
TeamUsageResponse
startTSnumber · requiredInclusive day range actually covered, ms timestamps at day start.
endTSnumber · requiredtotalSpentnumber · requiredSum of
members[].spent— what the team pool paid out in the window.membersobject[] · required
TeamMemberUsage
userIdstring · requiredemailstring · requiredrolerequiredRole of a user within a team (IAM). owner: billing + full control; admin: manage members; member: belongs only.
spentnumber · requiredSpend funded by the team pool in the window, in $.
messageCountnumber · required
namestringformerbooleanSpent from the pool while on the team, but no longer a member.
TeamRole
Decision Table
| Variant | Matching Criteria |
|---|---|
| No specific criteria | |
| No specific criteria | |
| No specific criteria |
ProjectFull
projectobject · requiredA project organizes todos.
settingsobject · requireddoneCountnumber · requiredCount of todos in the DONE stage — O(1) ZCARD, kept accurate independent of what the paginated todo list has loaded. Todo count = todoIds.length - doneCount.
boardCountnumberTodos the board list (
todo.list) can actually page: shared, visible, not dismissed — any status. Optional for older backends.supportsPrivateTodosbooleanRuntime server capability, response-only (never persisted): this backend enforces
MY_PRIVATE_GROUPprivacy. Clients MUST fail closed — hide the private lane when absent — so a new frontend against an old backend can't create shared "private" todos.
Project
idstring · requirednamestring · requireddescriptionstring · requiredprojectSettingsIdstring · requiredownerIdstring · requiredownerEmailstring · requiredisPublicboolean · requiredtodoIdsstring[] · requiredreadAccessIdsstring[] · requiredUser IDs with read access
writeAccessIdsstring[] · requiredUser IDs with write access
readAccessEmailsstring[] · requiredwriteAccessEmailsstring[] · requiredstatusrequiredisDefaultboolean · requiredcreatedAtnumber · requiredupdatedAtnumber · required
teamOwnerIdstringThe team this project belongs to, identified by its owner's user id. Set = a shared team project: every member of that team holds write access, and AI spend inside it is billed to that team's pool. This is the switch that decides WHOSE quota a member burns, so a project belongs to at most one team (enforced atomically in setTeamProjectAtomic).
Being replaced by
organizationId: the migration writes both, and once every reader is on organizationId this field goes away.organizationIdstringThe organization (better-auth organization plugin) this project belongs to. Same semantics as teamOwnerId — members get write access, spend bills to the org owner's pool — but keyed by the org's own id, so an org can outlive / change its owner. At most one per project.
businessContextIdstringThe project IS the brand: this is the attachment id of its brand page (markdown). Absent = a personal board (no brand card, analyzer or voice).
killSwitchobjectThe latch that applies TO THE CALLER, projected per request: the project-wide one if the owner pressed it, otherwise this user's own. A teammate's personal latch is never visible here — it stops their runs, not the board.
archivedAtnumberdeletedAtnumber
ProjectStatus
Decision Table
| Variant | Matching Criteria |
|---|---|
| No specific criteria | |
| No specific criteria | |
| No specific criteria |
KillSwitch
scoperequireduser:by's own runs, latched inby's own slot — invisible to teammates, released byby.project: everyone's runs (owner presses and releases).bystring · requiredatnumber · required
autoconstLatch tripped by the running limit rather than by a person.
Const value:
KillSwitchScope
Decision Table
| Variant | Matching Criteria |
|---|---|
| No specific criteria | |
| No specific criteria |
ProjectMember
idstring · requiredemailstring · required
namestringimagestringAvatar attachment id (same as the profile picture).
ShareProjectInput
emailstring · email · requiredprojectIdstring · requiredcanWriteboolean · required
CreateTodoInput
projectIdstring · requiredcontentstring · requiredagentSettingsobject · requiredAI AgentSettings configuration including model, system prompt, and MCP tools.
attachmentsobject[]scheduledTimestampnumbertodoIdstringgroupTagstringGroup slug. Empty/absent means ungrouped.
MY_PRIVATE_GROUPcreates a private todo owned by the authenticated creator (no separate visibility input).groupNamestringOptional display name to upsert for groupTag. Ignored for
MY_PRIVATE_GROUP.visiblebooleanVisible in the project's default todo list. Defaults to true; subagent runs (tfa-*) pass false. Hidden todos are still accessible by id.
autoDonebooleanWhen true, successful completion lands in DONE (strikethrough/terminal) instead of READY. For plumbing todos that don't need user ack.
parentTodoIdstringTodo whose agent shell spawned this one (tfa-cli reads $TODOFORAI_TODO_ID).
kind'orchestrator' forces visible:false and manual start (no agent run).
originHow the first message was produced (orchestrator threads).
AgentSettings
idstring · requirednamestring · requiredownerIdstring · requirededgesMcpConfigsobject · requiredEdge device MCP configurations by edgeId
createdAtnumber · requiredupdatedAtnumber · required
systemMessagestringCustom system prompt for the agent
modelstringLLM model identifier (e.g., 'claude-3-opus')
thinkingLeveltemperaturenumbersystemMessageMode'default_coder' uses built-in coding prompt, 'custom_w_tools' uses systemMessage + auto-injected capability sections, 'raw' uses systemMessage verbatim (no global prepend, no tool/routing/workspace sections).
smartSystemPromptbooleanAuto-enhance system prompt based on context
memoryEnabledbooleanPut the user's file memory (
todoforai:memory/: index + pinned files) in the system prompt. Default on.contextDocumentsobject[]Reference files (PDF, images, text/office docs) pinned to every conversation of this agent: sent natively as the first user message (PDF/image as document/image blocks), prompt-cached. Metadata only — the agent fetches bytes by attachment id.
devicesConfigobjectBridge device workspace + cwd config by deviceId. Parallel to
edgesMcpConfigs.permissionsobjectTool permission allowlist
specIdstringSpec this agent was created from
colorstringHex color (e.g. '#10b981') used to tint todos assigned to this agent
AttachmentFrame
idstring · requireduristring · requiredResource URI - always required. Format: "todoforai:todos/{todoId}/{id}"
originalNamestring · requiredmimeTypestring · requiredfileSizenumber · requiredIn bytes
createdAtnumberisPublicbooleanstatusmodifiedAtnumberLast modified time (mtime), milliseconds epoch
permissionsnumberUnix permission bits (e.g. 0o644 = 420 decimal)
blockIdstringBlock ID that produced this attachment (for mapping tool results back to tool_calls)
toolCallIdstringLLM tool_call ID — for stamping results back to the originating tool call
textstringAgent → backend only: small text results travel inline here instead of a separate binary frame. Consumed at registration; never persisted.
MCPEdgesSettings
deviceTypeEdge device type — used by the Julia agent for capability checks (e.g. has_shell).
installedToolsobjectConstruct a type with a set of properties K of type T
enabledbooleanPer-agent edge on/off.
falseremoves this edge from the agent's tool spec at run time (filtered in AgentSettingsService.prepareForAgent). Undefined/true = on.namestringEdge identity surfaced at submit time (enrichWithOnlineEdges) so the agent can use it for the tool-alias suffix (bash_
) and the ### <name>heading in## Available Machines. TODO: revisit — questionable whether this belongs here. (1) For real edgesnameis an auto-generated junk label (e.g. "PC_8814" = {deviceType}_{rand}), which gives the agent no useful alias/heading; only bridge devices have a meaningful user-given name. (2) name/metadata duplicate Edge.* and bloat every per-agent record. Consider passing identity out-of-band instead of stuffing it into edgesMcpConfigs.metadataobjectConstruct a type with a set of properties K of type T
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = string | |
| type = boolean | |
| type = object | |
| type = object |
MCPSettings
deviceTypeEdge device type — used by the Julia agent for capability checks (e.g. has_shell).
installedToolsobjectCatalog tool states injected by the backend at submit time.
enabledbooleanPer-agent edge on/off.
falseremoves this edge from the agent's tool spec at run time (filtered in AgentSettingsService.prepareForAgent). Undefined/true = on.namestringEdge identity surfaced at submit time (enrichWithOnlineEdges) so the agent can use it for the tool-alias suffix (bash_
) and the ### <name>heading in## Available Machines. TODO: revisit — questionable whether this belongs here. (1) For real edgesnameis an auto-generated junk label (e.g. "PC_8814" = {deviceType}_{rand}), which gives the agent no useful alias/heading; only bridge devices have a meaningful user-given name. (2) name/metadata duplicate Edge.* and bloat every per-agent record. Consider passing identity out-of-band instead of stuffing it into edgesMcpConfigs.metadataobjectConstruct a type with a set of properties K of type T
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = string | |
| type = boolean | |
| type = object | |
| type = object |
RecordstringCatalogToolState
installedboolean · requiredWhether the binary is found on PATH
versionstringOutput of versionCmd (e.g. "v1.2.3"), undefined if not run or no versionCmd
statusOutputstringOutput of statusCmd (e.g. logged-in user), undefined if not run or no statusCmd
authenticatedbooleanWhether statusCmd exited 0 (authenticated/ready)
requestedbooleanThe user explicitly asked for this tool on this device (Connect / Add). Hosts with a preinstalled catalog (cloud VMs) list only requested or connected tools — the rest is clutter — and a requested tool that later lost its credentials stays visible as "Not linked" so it can be fixed. Sticky across rescans; cleared by the
forgettool op.descriptionstringUser description override from the edge's ~/.todoforai/custom_tools.json, folded into the scan result edge-side. Takes precedence over the catalog description in the agent's bash tool CLI list, and lets non-catalog binaries (found on PATH) be advertised. Deliberately ONE field for both audiences, unlike the catalog's summary/description pair: the user writes this line themselves, in their own words, about their own binary — asking them for two takes of the same sentence buys less than it costs. It is shown as-is in the tile and sent as-is to the agent.
labelstringUser label override (custom_tools.json), same mechanism as
description.
CatalogToolState
installedboolean · requiredWhether the binary is found on PATH
versionstringOutput of versionCmd (e.g. "v1.2.3"), undefined if not run or no versionCmd
statusOutputstringOutput of statusCmd (e.g. logged-in user), undefined if not run or no statusCmd
authenticatedbooleanWhether statusCmd exited 0 (authenticated/ready)
requestedbooleanThe user explicitly asked for this tool on this device (Connect / Add). Hosts with a preinstalled catalog (cloud VMs) list only requested or connected tools — the rest is clutter — and a requested tool that later lost its credentials stays visible as "Not linked" so it can be fixed. Sticky across rescans; cleared by the
forgettool op.descriptionstringUser description override from the edge's ~/.todoforai/custom_tools.json, folded into the scan result edge-side. Takes precedence over the catalog description in the agent's bash tool CLI list, and lets non-catalog binaries (found on PATH) be advertised. Deliberately ONE field for both audiences, unlike the catalog's summary/description pair: the user writes this line themselves, in their own words, about their own binary — asking them for two takes of the same sentence buys less than it costs. It is shown as-is in the tile and sent as-is to the agent.
labelstringUser label override (custom_tools.json), same mechanism as
description.
ServerSettings
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = boolean | |
| type = array | |
| type = object |
ToolConfiguration
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = null | |
| type = string | |
| type = number | |
| type = boolean | |
| type = array | |
| type = object |
ToolConfigurationValue
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = null | |
| type = string | |
| type = number | |
| type = boolean | |
| type = array | |
| type = object |
DevicesConfig
workspacePathsstring[] · required
enabledPer-agent device state. For ordinary devices, false disables and every other value enables. The hosted cloud VM additionally supports: false → Off. 'auto' → use only when no local desktop is online. 'on' → explicitly always on (overrides global Auto/Off). true / undefined → enabled, inheriting the per-user global cloud mode.
trueremains the inherited state for compatibility with existing agent records, where it was written before explicit cloud modes existed.deviceTypeDevice type — used by the agent for capability checks (e.g. has_shell vs has_cdp). Surfaced at submit time by enrichWithOnlineDevices.
namestringDevice identity surfaced at submit time so the agent can render the device in
## Available Machines(name heading, tool-alias suffix).metadataobjectConstruct a type with a set of properties K of type T
installedToolsobjectConstruct a type with a set of properties K of type T
DeviceConfig
workspacePathsstring[] · required
enabledPer-agent device state. For ordinary devices, false disables and every other value enables. The hosted cloud VM additionally supports: false → Off. 'auto' → use only when no local desktop is online. 'on' → explicitly always on (overrides global Auto/Off). true / undefined → enabled, inheriting the per-user global cloud mode.
trueremains the inherited state for compatibility with existing agent records, where it was written before explicit cloud modes existed.deviceTypeDevice type — used by the agent for capability checks (e.g. has_shell vs has_cdp). Surfaced at submit time by enrichWithOnlineDevices.
namestringDevice identity surfaced at submit time so the agent can render the device in
## Available Machines(name heading, tool-alias suffix).metadataobjectConstruct a type with a set of properties K of type T
installedToolsobjectCatalog tool states injected by the backend at submit time.
ToolPermissions
allowstring[] · requiredTools/patterns that auto-execute without approval
askstring[]Tools that require user approval (default if not in any list)
denystring[]Tools/patterns blocked from execution
Todo
idstring · requiredprojectIdstring · requiredstatusrequiredagentSettingsIdstring · requiredcontentstring · requiredmessageIdsstring[] · requiredmessagesobject[] · requiredcreatedAtnumber · requiredlastActivityAtnumber · requiredscheduledTimestampnumber · required0 if immediate
groupTagstringProject-scoped group slug.
privateOwnerIdstringSet (server-side, from the creator) when the todo lives in
MY_PRIVATE_GROUP: only this user may read or modify it. Never accepted from clients.parentTodoIdstringTodo whose agent shell spawned this one (via tfa-cli).
kind'orchestrator': a per-tab orchestrator thread — the tab runs the agent loop itself and authors the assistant turns over the frontend socket. Always created with visible:false (off the board); listed via todo.listOrchestrators.
systemMessageIdstringcheckedBlockIdsstring[]User-checked blocks
actionableBlockIdsstring[]Blocks with code, commands, etc.
archivedAtnumberdeletedAtnumberdismissedAtnumberWhen the proposal was dismissed — bounds the analyzer's feedback window.
starredAtnumberStar/favorite timestamp; absent/0 = not starred
contributorIdsstring[]Users who sent messages into the todo, in order of first appearance ([0] = creator).
workflowVersionstringFor optimistic concurrency
visiblebooleanVisible in default project listings; defaults to true.
isPublicbooleanPublicly viewable (read-only) by anyone with the link, no login required.
commentsEnabledbooleanSigned-in non-members may comment on a public todo. Members can always comment.
autoDonebooleanPre-finished: the user checked it while the agent was still working, so the run's READY lands as DONE. Cleared once the todo reaches a terminal status.
statusRevnumberPer-todo transition counter at
status— travels WITH it, so a client knows which transition it holds.hasMoreMessagesbooleanTrue when
messagesholds only the newest page — older ones via todo.getMessages.importSourceobjectSet on todos created by
todo.importSession— the external session they mirror.
TodoStatus
Decision Table
| Variant | Matching Criteria |
|---|---|
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria |
Message
idstring · requiredtodoIdstring · requiredcontentstring · requiredrolestring · required'user', 'assistant', or 'system'
agentSettingsIdstring · requiredstop_sequencestring · requiredStop sequence that ended AI response, if any
createdAtnumber · requiredblocksarray · requiredParsed content blocks (code, tool calls, text)
scheduledTimestampnumber · required0 if sent immediately
attachmentsobject[] · required
originprojectIdstringProject the todo belongs to (denormalized for search; absent on legacy messages).
userIdstringWho this turn belongs to: the submitter for a user message, the submitter of the turn being answered for an assistant/tool message. Together with
agentSettingsIdthis is the run's identity — continuations (flushToolMessage) MUST resolve from here, never fromtodo.agentSettingsId, which is last-writer-wins and gets overwritten when a second user joins the todo. Absent on legacy messages (pre multi-user attribution) — callers fall back to the project owner.queuedbooleanSent into an already-running turn, so it sits in the agent's internal queue until the turn drains it. While true the user can still retract it (Front2Agent.TODO_QUEUE_CANCEL); cleared on Agent2Server.TODO_MSG_DEQUEUED.
runMetaobject[]Token usage, model info, etc.
systemPromptstringSystem prompt used for this assistant message (dev mode / debug-dump turns)
toolSchemasstringDebug-dump turns (x-tfa-debug): native tool schemas of the LLM request that produced this assistant message, JSON-stringified.
predictedReplystringPredicted next user message (ghost text), computed once per finished assistant turn by reusing the warm prompt cache. Set only on assistant messages; throwaway, never fed back.
parentBlockIdstringIf set, this message belongs to a sub-agent spawned by the given block
MessageBlock
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +3 more | |
| type = object · requires: type, id, content +3 more | |
| type = object · requires: type, id, content +3 more | |
| type = object · requires: type, id, content +3 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, server_name, method +4 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, id, content +2 more | |
| type = object · requires: type, tool_name, id +3 more |
typeconst · requiredConst value: readidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
limitnumberoffsetnumberresultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
pathstringlanguagestring
ReadBlock
typeconst · requiredConst value: readidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
limitnumberoffsetnumberresultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
pathstringlanguagestring
BlockStatus
Decision Table
| Variant | Matching Criteria |
|---|---|
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria |
RunResultMeta
timestampnumbertool_namestringsuccessbooleanerrorstringtextstringOrchestrator (JARVIS) tools: the result text the model read.
displayTextstringOrchestrator tools whose
textis a bulk payload: the one-line transcript chip.elapsednumberargumentsinputTokensnumberoutputTokensnumber
RunMeta
costnumber · requiredtimestampnumber · required
typestringdescriptionstringelapsednumberextrasobject
CreateBlock
typeconst · requiredConst value: createidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
resultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
pathstringlanguagestringoriginalContentstringmodifiedContentstringinitialOriginalContentstring
WriteBlock
typeconst · requiredConst value: writeidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
resultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
pathstringlanguagestringoriginalContentstringmodifiedContentstringinitialOriginalContentstring
EditBlock
typeconst · requiredConst value: editidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
changesstringresultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
pathstringlanguagestringoriginalContentstringmodifiedContentstringinitialOriginalContentstring
ModifyFileBlock
typeconst · requiredConst value: modify_fileidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
changesstringresultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
pathstringlanguagestringoriginalContentstringmodifiedContentstringinitialOriginalContentstring
BashBlock
typeconst · requiredConst value: bashidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
cmdstringtimeoutnumberlanguagestringfileChangesobject[]Files changed by this command (edge git tracking; overwritten on re-run).
targetstringcwdstringpidnumberOS PID of the persistent shell inside the bridge PTY. Surfaced on RUN_STARTED so the UI can address the session for stdin / force-kill. SIGINT is delivered as
\x03through the regular stdin path — the kernel TTY line discipline forwards it to the foreground process group, so no separate fg pid is needed on the block.awaitingInputbooleanBridge reported STEP_AWAITING_INPUT — foreground command parked in n_tty_read, waiting on stdin. The shell itself is alive.
passwordPromptbooleanOnly meaningful when
awaitingInput === true: PTY slave has ECHO disabled (sudo / getpass / ssh / git credential). UI should mask input.timedOutbooleanOnly meaningful when
awaitingInput === true: the bridge parked the run because the step deadline hit, not because it saw a stdin wait (Windows/ConPTY has no such signal). The command may just be slow.subTodoIdsstring[]Sub-agent runs spawned by the command as real (hidden) todos — tfa-* CLIs stamp these via POST /todos/{id}/blocks/{id}/subtodo. One command can spawn several (
a & b & wait), so each gets its own nested trace in the UI, in link order.resultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
titlestring
subTodoIdstring · deprecated · required
FileChange
pathstring · requiredoriginalContentrequiredmodifiedContentrequired
statusWhat happened to the file (resolved from git pre/post state).
omittedWhy content is null even though the file exists on that side.
sizenumberBytes of the post-command file (pre-command size when deleted).
GrepBlock
typeconst · requiredConst value: grepidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
patternstringpathstringglobstringignore_casebooleanheadnumbermax_countnumbertimeoutnumberoutputstringresultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
ListBlock
typeconst · requiredConst value: listidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
pathstringresultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
SkillBlock
typeconst · requiredConst value: skillidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
namestringresultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
ApiBlock
typerequiredidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
resultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
titlestringtool_namestring
ApiToolType
Decision Table
| Variant | Matching Criteria |
|---|---|
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria |
ImageGenBlock
typeconst · requiredConst value: image_genidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
promptstringmodelstringresultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
attachment_idstringattachment_idsstring[]
ShowBlock
typeconst · requiredConst value: showidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
filenamestringOriginal filename, shown in the block header.
titlestringShort label shown in the block header, overriding
filename.aliasstringStable short address within the todo (
<todoId>:<alias>), for later update/lookup.mimestringMimetype of the shown bytes — decides how the block renders.
urlstringLive target for
todoforai-cli open <url>(rendered as a preview instead of bytes).cardRefstringName of a project-scoped card (reusable HTML renderer) to render the shown bytes through (
todoforai-cli show data.json --card <name>). Resolved live per-project at render time, so updating the card updates every instance.tfa/<name>is a BUILT-IN card instead: a first-party React renderer with no shown bytes (POST /resources/cards), e.g. the onboarding cards.displayconstPresentation hint: 'link' renders a compact file chip (name + size + download) instead of inline content; click expands to the normal render. Absent = render inline by mimetype as usual (
todoforai-cli show --link).Const value: linkversionsstring[]Every version this block has shown (attachment ids, oldest first; the current one is
results[0]). A re-shown alias appends.shareTokenstringSet while publicly shared (
show share):show.todofor.ai/<token>serves the latest version,/<token>/<version>a frozen one. Absent = private to whoever can read the todo. Unshare drops it; a re-share mints a new token.resultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
HtmlSnippetBlock
typeconst · requiredConst value: html_snippetidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
htmlstringBare HTML fragment authored by the LLM (no doctype/html/head/body).
titlestringShort label shown in the block header.
resultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
LivePreviewBlock
typeconst · requiredConst value: live_previewidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
urlstringA directly-openable URL. For a remote target it's the http(s) URL the agent was given; for a tunnel it's https://
.preview.todofor.ai once the frontend has lazily minted a session. localUrlstringDirect URL (http://127.0.0.1:
) for an edge-local target. The frontend probes it first and, only if unreachable, mints a tunnel session (see edgeId/port) via POST /preview/session. edgeIdstringEdge + port backing localUrl — the frontend needs them to lazily mint a tunnel session when the direct URL isn't reachable.
portnumbertitlestringShort label shown in the block header.
resultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
TextBlock
typeconst · requiredConst value: textidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
resultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
ReasonBlock
typeconst · requiredConst value: reasonidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
resultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
ErrorBlock
typeconst · requiredConst value: erroridstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
error_messagestringstacktracestringresultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
CompactBlock
typeconst · requiredConst value: compactidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
keepnumbermodestringresultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
QuestionBlock
typeconst · requiredConst value: questionidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
questionsobject[]answerstringPre-formatted user response (set by backend on approval).
resultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
QuestionItem
idstring · requiredheaderstring · requiredquestionstring · requiredoptionsobject[] · required
OpenBrowserBlock
typeconst · requiredConst value: open_browseridstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
urlstringFirst page to load (the tool's
urlarg).cdp_urlstringagent-browser CDP connect URL of the enrolled resource (set on approval → tool result).
resultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
LoginBlock
typeconst · requiredConst value: login_promptidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
reasonstringlogged_inbooleanuserstringresultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
BusinessOnboardingBlock
typeconst · requiredConst value: business_onboardingidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
reasonstringwebsitestringresultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
RequestMcpAccessBlock
typeconst · requiredConst value: request_mcp_accessidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
mcp_namestringresultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
tool_namestring
EdgeNotRunningBlock
typeconst · requiredConst value: edge_not_runningidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
resultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
tool_namestring
WebFetchBlock
typeconst · requiredConst value: webfetchidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · requiredurlstring · required
resultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
GoogleSearchBlock
typeconst · requiredConst value: google_searchidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · requiredquerystring · required
sourcesobject[]Raw search hits pushed via BLOCK_UPDATE as soon as the search API returns, before the summarizer sub-agent finishes — lets the UI show sources live.
resultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
WebSearchBlock
typeconst · requiredConst value: web_searchidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · requiredquerystring · required
resultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
VaultSearchBlock
typeconst · requiredConst value: vault_searchidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · requiredquerystring · required
resultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
VaultResolveBlock
typeconst · requiredConst value: vault_resolveidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
refstringVault reference being resolved (e.g.
vault://path#field)resultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
VaultWriteBlock
typeconst · requiredConst value: vault_writeidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
schemestringresultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
titlestring
VaultWriteBatchBlock
typeconst · requiredConst value: vault_write_batchidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
schemestringresultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
VaultUpdateBlock
typeconst · requiredConst value: vault_updateidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
uristringVault item URI being updated
resultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
McpBlock
typeconst · requiredConst value: mcpserver_namestring · requiredmethodstring · requiredidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
namestringresultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
titlestringtool_namestring
ExploreBlock
typeconst · requiredConst value: exploreidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
promptstringsubTodoIdstringWhen the sub-agent runs as a real hidden sub-todo, its todoId.
resultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
PlanBlock
typeconst · requiredConst value: planidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
promptstringresultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
ReviewBlock
typeconst · requiredConst value: reviewidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
promptstringsubTodoIdstringWhen the sub-agent runs as a real hidden sub-todo, its todoId.
resultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
DeviceListBlock
typeconst · requiredConst value: device_listidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
resultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
NamedToolBlock
typeconst · requiredConst value: named_tooltool_namestring · requiredidstring · requiredcontentstring · requiredstatusrequiredBlockStatus - lifecycle states
generationCompletedboolean · required
argsobjectConstruct a type with a set of properties K of type T
resultstringresultsobject[]runMetaobject[]generalized_patternGeneralized permission pattern for "remember" feature (e.g., "BASH(cmd: npm *)")
toolCallIdstringLLM API tool_call id — durable mapping from block to the tool_call that created it
parentBlockIdstringParent block ID — present on sub-agent child blocks (e.g., read blocks inside explore)
deviceIdstringDevice that executed this tool call. Edges and bridges both map to a device id. Stamped from internal routing context, not provided by the LLM.
_issuestringRead-time schema issue: set by the tRPC soft-output validator when this block failed output validation (e.g. legacy/malformed data). Derived on every read from the failing typia path — NEVER persisted to Redis.
approvalContextobjectEdge approval context — present when edge requests tool install approval
TodoImportSource
kindrequiredWhich external agent a session was imported from.
pathstring · requiredsha256string · requiredimportedAtnumber · requiredmessageCountnumber · requiredRows written by the import; more rows on the todo means it was continued in TODOforAI.
cwdstring
ImportSourceKind
Decision Table
| Variant | Matching Criteria |
|---|---|
| No specific criteria | |
| No specific criteria |
TodoGroup
slugstring · requirednamestring · required
descriptionstringOne-line strategic intent of the group — shown on the card and fed to the semantic router so future todos/recommendations land here.
pinnedbooleanPinned cards sort first on the wall.
archivedbooleanArchived cards leave the wall (still listed here so the picker can offer them).
ordernumberExplicit wall position (ascending). Unset groups trail in listing (creation) order.
totalnumberTodos in this group (ZCARD of the group index) — accurate regardless of what the paginated list loaded.
GroupSuggestInput
projectIdstring · minLength: 1 · requiredtextsstring[] · minItems: 1 · maxItems: 1000 · required
privateLanebooleanOffer the caller's My Private lane as a destination (composer drafts only).
GroupSuggestOutput
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = null | |
| type = object · requires: slug, name, score |
RendererCardInfo
namestring · requiredattachmentIdstring · requiredAttachment id of the card's HTML body.
updatedAtnumber · required
titlestringdescriptionstring
ProjectGroupUpsertInput
projectIdstring · requiredslugstring · required
namestringdescriptionstringOne-line strategic intent; empty string clears it, omitted = unchanged.
pinnedbooleanToggle pinned; omitted = unchanged.
archivedbooleanToggle archived; omitted = unchanged.
ordernumberExplicit wall position; omitted = unchanged.
ProjectSurface
idstring · requiredrefstring · requiredcreatedAtnumber · required
titlestringgroupstringGroup slug it renders inside; absent = its own wall card.
ordernumberWall / tile position (ascending); unset trails in creation order.
ProjectSurfaceUpsertInput
projectIdstring · requiredsurfaceIdstring · requiredClient-chosen id (like a group slug): unknown creates, known patches (omitted = unchanged).
refstringRequired on create.
titlestringEmpty string clears.
groupstringEmpty string detaches it into its own wall card.
ordernumber
ProjectGroupReorderInput
projectIdstring · requiredslugsstring[] · requiredFull wall order of the movable groups; index = order.
StartFromSpecInput
projectIdstring · requiredProject to create the TODO in
specIdstringOptional spec ID — if provided, the spec is the base
proposebooleanCreate as a PROPOSED todo (analyzer suggestion): first message queued like a draft, not yours until accepted (Start) or dismissed. Requires specId.
notestringWhy this is proposed — folded into the todo content as a "Why this matters" line (propose only; no dedicated field on the todo).
titlestringProposal title override — becomes the content's first line, i.e. the ✧ row title (propose only; defaults to the spec name).
priorityProposal priority — folded into the content's "Why this matters" line when not medium (propose only).
groupDescriptionstringOne-line strategic intent to upsert for groupTag (propose only).
contentstringUser message / TODO content. Falls back to spec name+description if omitted
systemMessagestringSystem message override. If omitted and specId provided, uses the spec's body
agentNamestringAgent name for on-the-fly TODOs (no specId). Defaults to "Custom Agent"
modelstringComposer model pick for this run only (session override) — the agent keeps its own.
thinkingLevelscheduledTimestampnumberScheduling: omit for immediate start
attachmentsobject[]Attachments
groupTagstringGroup slug. Empty/absent means ungrouped.
groupNamestringOptional display name to upsert for groupTag.
autoDonebooleanPer-run: successful completion lands in DONE instead of READY (see CreateTodoInput).
PartialOmitAppSettingsid
themestringpreviewAutoColumnsnumberPreferred column count used by the automatic preview-window layout. Defaults to 3.
todoListThemediffControlstringshellExecutionstringemailNotificationsbooleanpushNotificationsbooleandataAnalyticsbooleanplaySoundOnTaskCompletebooleanshowTodoCompletionToastbooleanshowOpenElsewherebooleanOpt-in: board cards show which of my other frontends (tab / desktop app / phone) have the todo open. Off = this frontend neither reports nor tracks presence.
tabNotificationModeHow the browser-tab red "done" dot behaves after a TODO finishes.
todoOpenModeWhat opening a TODO from the board does: a floating preview window over the board (default, the advanced workspace) or the full-page chat.
disabledMentionSourcesstring[]Disabled
keyboardBindingsobjectConstruct a type with a set of properties K of type T
keyboardShortcutsEnabledbooleandefaultViewModestringmodelMentionAliasesstring[]Enabled model-mention aliases (e.g. 'claude', 'gpt') for
showDiffMergeControlsbooleanShow accept/reject chunk controls in the diff (merge) view. Off by default — with auto-apply the diff is just a record of what got applied, so the controls are unnecessary noise.
showAgentColorsbooleanshowAgentNameInComposerbooleanShow the selected agent's name (with an expand chevron) on the collapsed composer trigger instead of the plain settings cog icon.
showAllowAllButtonbooleanshowAutoDoneButtonbooleanShow the Auto-Done toggle in the message toolbar. When the toggle is on, the next run's successful completion lands the todo in DONE instead of READY.
showSystemPromptbooleanShow the agent's system prompt (and its diffs) inline in chat. Also makes the backend ask the agent for it: the prompt is only attached to a finished message when this is on (or an x-tfa-debug turn), since it is tens of KB per message.
developerModebooleanDeveloper mode: reveals the Developer group in View settings (debug-only toggles). Purely cosmetic — it gates no capability, every toggle inside works on its own. Staff-granted:
adminUser.setDeveloperModeis the only writer — updateUserSettings drops the key, so no client can reveal the group for itself.showAgentJsonExportbooleanShow the JSON export button in the agent settings modal header.
surfaceModeHow much of the machine layer the UI exposes — see
SurfaceMode. Unset meansbasicfor accounts with no paired machine andadvancedonce one exists, so existing users never lose their cards.useDeviceWallpaperbooleanPaint each device card with that machine's real desktop wallpaper, captured by the bridge when it reconnects. Off keeps every card on the built-in OS-themed gradient. Individual devices can still opt out on their own via
Device.metadata.wallpaper.mode. Default off — the wallpaper is a personal image, so uploading it is opt-in.showProjectPickerInSidebarProject picker at the top of the todo sidebar (team plan only).
offhides it,autoshows it only when you have more than one project,alwayskeeps it pinned. Defaults toauto.toolDisplayVerbosityDesktopTool-block display density, resolved per viewport.
collapsedkeeps non-essential tool blocks collapsed (one-line summary, click to expand).normalopens them by default.debugadditionally surfaces internal fields (pid, timeout, …) on shell/bash blocks. Desktop defaults tonormal, mobile tocollapsed.toolDisplayVerbosityMobilegroupToolDisplaybooleanCollapse consecutive tool-only assistant messages into a single group row. Backend defaults to true (the recommended workflow); set false to render each tool block individually. Independent of verbose tool display.
showThinkingTracesWhich finished reasoning ("Thinking") blocks stay in chat. Default 'last'; hidden reason blocks render nothing, which also lets more consecutive tool messages collapse into a single group.
showShellFileChangesbooleanShow the files a shell command touched (edge/bridge git tracking) under Shell blocks. Default off: the heuristic can pick up unrelated concurrent edits. When on, each diff still renders collapsed.
vaultProvidervaultConfigvaultProvidershostDesktopItemsobjectPer-host desktop layout, keyed by host id (device/edge id, or "cloud"). An ordered list of items; array index IS the order. Items absent from a host's list are appended (in the host's default order) on render, and items whose key no longer exists are dropped.
todoContributorFilterobjectPer-project people filter for the todo list, keyed by project id: user ids whose todos are shown. Absent key = everyone.
aiDataConsentAtnumberWhen the user agreed that their content is sent to the provider of the AI model they pick.
companyNamestringvatNumberstringaddressLine1stringaddressLine2stringcitystringstatestringpostalCodestringcountryISOstringaddressValidbooleanvatStatusRead-only: set from Stripe, never accepted from the client.
BillingInfoInput
companyNamestringvatNumberstringaddressLine1stringaddressLine2stringcitystringstatestringpostalCodestringcountryISOstringaddressValidboolean
BillingUpdateResult
successboolean · required
addressValidbooleanmessagestringvatNumberstringThe VAT number as Stripe stored it — normalized, so the user sees the country-prefixed value that will actually appear on the invoice.
vatStatus
ProjectSettingsFull
idstring · requiredprojectIdstring · required
llmModelstringllmConfigobjectConstruct a type with a set of properties K of type T
workspacePathsstring[]skillsobjectConstruct a type with a set of properties K of type T
diffstringpreferencesobjectConstruct a type with a set of properties K of type T
ProjectSettingsUpdateInput
projectIdstring · requiredsettingsobject · requiredConstruct a type with a set of properties K of type T
ApiKey
namestring · requiredidstring · requiredNot the secret key itself
createdAtnumber · requiredisDefaultboolean · required
TodoListInput
projectIdstring · required
limitnumberPage size (default 25, max TODO_LIST_MAX_LIMIT).
cursornumberlastActivityAtof the last item from the previous page (exclusive). Omit for first page.searchstringOptional content/status substring filter; switches to a full-project scan.
starredOnlybooleanIf true, only return starred/favorite todos.
agentSettingsIdstringOnly todos run by this agent; served from the per-agent index.
groupTagstringOnly todos in this board group (slug); served from the per-group index.
MY_PRIVATE_GROUPreturns the caller's own private todos.includePrivatebooleanInclude the caller's own private todos in an otherwise unfiltered/searched board page. Default false: every project-wide listing/search hides private todos.
contributorIdsstring[]Only todos opened or written into by any of these users.
TodoPage
itemsobject[] · required
nextCursornumberlastActivityAtof the last item; pass ascursorfor the next page. Absent = last page.
TodoSummary
idstring · requiredprojectIdstring · requiredstatusrequiredagentSettingsIdstring · requiredmessageCountnumber · requiredNumber of messages in the thread (O(1) LLEN); the ids themselves come with the full Todo.
createdAtnumber · requiredlastActivityAtnumber · requiredscheduledTimestampnumber · required0 if immediate
groupTagstringProject-scoped group slug.
privateOwnerIdstringSet (server-side, from the creator) when the todo lives in
MY_PRIVATE_GROUP: only this user may read or modify it. Never accepted from clients.contentstringstarredAtnumberStar/favorite timestamp; absent/0 = not starred
contributorIdsstring[]Users who sent messages into the todo, in order of first appearance ([0] = creator).
parentTodoIdstringTodo whose agent/orchestrator spawned this one.
kindautoDonebooleanPre-finished: the user checked it while the agent was still working, so the run's READY lands as DONE. Cleared once the todo reaches a terminal status.
statusRevnumberPer-todo transition counter at
status— travels WITH it, so a client knows which transition it holds.
TodoGetInput
todoIdstring · required
messageLimitnumberIf set, include only the newest N messages (
hasMoreMessagessignals older ones). Omit for the full conversation.
MessageSearchInput
querystring · requiredSearch text (punctuation ignored).
projectIdstringRestrict to one project (must be accessible). Omit to search all accessible projects.
todoIdstringRestrict to one todo.
roleRestrict by message role.
limitnumberMax hits (default 20, max 50).
modeRanking mode.
lexical(default): all words must match, newest first.semantic: all-word matches first, then embedding KNN (relevance-cut) for paraphrases (~100ms).fused: any word may match (BM25) ∪ KNN uncut, reciprocal-rank fused — best recall, for agents that read and verify.excludestringMessage ids to leave out (already read), comma-separated.
MessageSearchPage
hitsobject[] · requiredtotalnumber · requiredTotal matches (may exceed hits.length). Fused: the lexical count.
lexicalCountnumberFused mode: how many messages contain at least one query word (index count, before
exclude). Tells the reader whether a set is larger than the page.
MessageSearchHit
messageIdstring · requiredtodoIdstring · requiredprojectIdstring · requiredrolestring · requiredcreatedAtnumber · requiredsnippetstring · requiredLeading portion of the message's searchable text (content + block texts/commands) (truncated).
scorenumberSemantic search only: cosine distance to the query (0 = identical, 2 = opposite). Absent on full-text hits.
UnifiedSearchInput
querystring · requiredSearch text; keyword and semantic retrieval are handled by memory-manager.
projectIdstringRestrict retrieval to this project's conversations; excludes account-wide curated memory.
limitnumberMax displayed results after parent collapsing (default 5, max 50).
UnifiedSearchPage
hitsobject[] · required
todosobject[]Project-scoped board rows for the displayed visible TODOs, without messages.
warningsstring[]Partial-search warnings returned by memory-manager.
UnifiedSearchHit
kindrequiredsnippetstring · requiredSnippet returned by memory-manager, unchanged.
createdAtnumber · required
scorenumberSemantic hits only: cosine distance to the query (0 = identical).
todoIdstringTodo containing the matching message.
projectIdstringProject of the displayed todo (parentTodoId ?? todoId).
statusstringStatus of the displayed todo.
titlestringFirst line of the displayed todo's content; falls back to the match snippet.
rolestringRole of this matching message.
messageIdstringparentTodoIdstringResolved visible parent to display/open for a hidden subagent match. May skip hidden ancestors; todoId/messageId still identify the original match.
addressstringMemory address
source/ref.sourcestringcontentstringFull note content (capped) for inline expansion.
TodoMessagesInput
todoIdstring · required
limitnumberPage size (default 50, max 200).
beforestringFetch messages strictly OLDER than this messageId (the oldest already loaded). Omit for the newest page.
MessagesPage
messagesobject[] · requiredhasMoreboolean · requiredTrue if older messages exist before this page.
MessagesAroundInput
todoIdstring · requiredmessageIdstring · required
beforenumberMessages before the pivot (default 2, max 200).
afternumberMessages after the pivot (default 2, max 200). A large value enumerates the rest of the todo.
MessagesAround
messagesobject[] · requiredindexnumber · requiredPosition of the pivot in the todo (0-based) and the todo's message count.
totalnumber · required
TodoPublicMeta
idstring · requiredtitlestring · requiredcreatedAtnumber · requiredlastActivityAtnumber · requiredmessageCountnumber · requiredsubagentCountnumber · requiredTodos spawned from this one (parentTodoId === id).
contributorsobject[] · requiredMessage senders in order of first appearance ([0] = creator).
projectNamestringOnly set when the parent project is itself public (private project names stay private).
agentNamestringfileChangesobjectFiles touched by file tools / shell file tracking, deduped by path. Absent when none.
TodoUpdateInput
todoIdstring · requiredThe unique identifier of the todo to update
contentstringNew content/prompt for the todo
scheduledTimestampnumberUnix timestamp to schedule the todo (0 or omit for immediate)
agentSettingsIdstringID of the agent settings to use for processing
groupTagstringGroup slug. Pass an empty string to make the todo ungrouped.
starredAtnumberStar/favorite timestamp; pass a timestamp to star, 0 to unstar
isPublicbooleanMake the todo publicly viewable (read-only) by anyone with the link
commentsEnabledbooleanLet signed-in non-members comment on the public todo
autoDonebooleanPre-finish a running todo: its READY will land as DONE. false cancels.
TodoStatusUpdateInput
todoIdstring · requiredThe unique identifier of the todo to update
statusrequiredThe new status to set. Valid values: 'idle', 'running', 'paused', 'completed', 'failed'
ImportSessionInput
projectIdstring · requiredagentSettingsIdstring · requiredtitlestring · requiredTodo title.
messagesobject[] · requiredsourceobject · required
ImportedMessage
rolerequiredcontentstring · required
timestampnumberOriginal epoch ms; missing = ordered after the previous message.
ImportSessionOutput
todoIdstring · requiredoutcomerequiredcreated = first import; updated = changed content, re-imported as a new todo; unchanged = same sha256.
messageCountnumber · required
AddMessageInput
todoIdstring · requiredprojectIdstring · requiredcontentstring · requiredagentSettingsobject · requiredAI AgentSettings configuration including model, system prompt, and MCP tools.
attachmentsobject[]Attachments metadata (content arrives separately via binary WebSocket frames or current attachments buffer).
scheduledTimestampnumberafterMessageIdstringautoDonebooleanWhen true, the next successful agent completion lands in DONE (strikethrough) instead of READY. Per-run flag — does not persist on the todo.
originOrchestrator threads: how this turn was produced.
UpdateMessageInput
todoIdstring · requiredmessageIdstring · requiredagentSettingsIdstring · required
contentstringattachmentsobject[]scheduledTimestampnumber
UpdateAndStartMessageInput
todoIdstring · requiredagentSettingsobject · requiredAI AgentSettings configuration including model, system prompt, and MCP tools.
messageIdstringThe message to update and run. Omit for an unstarted draft — the server then starts the todo's own first (and only) message, so callers that just want "press Start" don't have to fetch it first. Required when targeting a specific turn (e.g. a scheduled message).
contentstringattachmentsobject[]autoDonebooleanWhen true, the next successful agent completion lands in DONE (strikethrough) instead of READY. Per-run flag — does not persist on the todo.
TodoBlockSubTodoInput
todoIdstring · requiredmessageIdstring · requiredblockIdstring · requiredsubTodoIdstring · requiredTodo id of the sub-agent run to nest inside the block.
TodoWorkflow
workflowMetarequiredworkflowVersionrequired
lastContextSummaryThe most recent context summary (if any compaction occurred)
ContextSummary
outputTokensnumber · requiredToken count after compaction
timestampnumber · requiredWhen compaction happened
messageIdsstring[] · requiredWhich messages were summarized
summarystringPlain summary text. Kept so the divider can display the compaction result directly.
summaryAttachmentobjectThe summary as an attachment frame, ready to be attached to a message
statusStatus: 'ready' = waiting to be used, 'used' = already attached to a message
WorkflowUpdateInput
todoIdstring · requiredworkflowMetastring · requiredworkflowVersionstring · required
contextSummaryUsedbooleanSet to true to mark the pending context summary as 'used'
TransactionPage
transactionsobject[] · requiredtotalnumber · requiredpagenumber · requiredlimitnumber · requiredtotalPagesnumber · required
Transaction
idstring · requiredtyperequiredamountnumber · requireddescriptionstring · requiredcreatedAtnumber · required
totalAmountnumbersourcestringplanFundedbooleanRecorded at charge time: this movement belongs to an active PAID plan's pool — either usage drawn from it or the allowance being reset. Such rows are presented as pacing (% + reset), never as a $ figure: the pool is denominated in credits, not in money the user bought. Deliberately NOT derived from
subSpent(free tiers draw a pot too, and a mixed charge would hide its real-money half) nor from the user's current tier (which would rewrite history on cancel/upgrade).
TransactionType
Decision Table
| Variant | Matching Criteria |
|---|---|
| No specific criteria | |
| No specific criteria |
Invoice
idstring · requiredinvoiceNumberstring · requiredtotalAmountnumber · requiredcurrencystring · requiredstatusstring · requireddueDatenumber · requireditemsstring · requiredcreatedAtnumber · requiredupdatedAtnumber · required
stripeInvoiceIdstringstripeInvoiceUrlstringpaidDatenumbernotesstring
PaymentIntent
clientSecretstring · requiredsubtotalnumber · requiredtaxAmountnumber · requiredtotalAmountnumber · required
SubscriptionInfo
subscriptionIdrequiredtierrequiredscaleis legacy: no longer sold, kept so existing subscriptions resolve.statusrequiredcurrentPeriodEndrequiredusageThisMonthnumber · requiredusageLimitrequiredbillingCycleStartrequiredeverPaidboolean · requiredEver made a real Stripe payment (top-up or paid plan) — lifetime full model catalog.
intervalrequiredHow the active subscription is billed; null for free/none. Plan changes must stay on this interval, so the pricing toggle follows it.
seatsrequiredPurchased seats on a per-seat Team plan; null otherwise.
SubscriptionTier
Decision Table
| Variant | Matching Criteria |
|---|---|
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria |
SubscriptionPlan
tierrequiredscaleis legacy: no longer sold, kept so existing subscriptions resolve.namestring · requiredpriceMonthlynumber · requiredpriceYearlynumber · requiredusageLimitnumber · requiredMonthly credit pool, in USD. Equals what the plan costs — a $100 plan grants a $100 pool, so the invoice and the UI can never disagree. Per-seat plans: the legacy fixed-bundle pool, used only for owners with no purchased seats; otherwise see teamPool().
featuresstring[] · required
costMultipliernumberCredits burned per $1 of real model cost — the margin. 1 = at cost. Rises up the ladder on purpose: the heavy-usage tiers are where the model spend is, so that's where the margin sits; Starter stays the cheapest way in. Effective real usage = usageLimit / costMultiplier.
descriptionstringisFreebooleanmaxSeatsnumberperSeatbooleanlegacyboolean
CreateSubscriptionInput
tierrequiredintervalrequired
couponCodestringOptional Stripe promotion code (customer-facing, e.g. "LAUNCH100") to pre-apply at checkout.
seatsobjectPer-seat team tier: how many of each seat to buy (see TEAM_SEATS / teamSeatsError).
currencyCheckout currency; default usd. huf = the Hungarian pricing page.
BillingInterval
Decision Table
| Variant | Matching Criteria |
|---|---|
| No specific criteria | |
| No specific criteria |
SubscriptionResult
successboolean · required
subscriptionIdstringclientSecretstringcheckoutUrlstringmessagestring
UpdateSubscriptionInput
newTierrequired
intervalcouponCodestringOptional promo code — only applied when upgrading from a free tier to a first paid plan.
seatsobjectPer-seat team tier, when coming from a free/local plan (forwarded to checkout).
currencyCheckout currency when coming from a free/local plan; a live subscription keeps its own.
SubscriptionBilling
providerrequiredsubscriptionIdrequiredtierrequiredscaleis legacy: no longer sold, kept so existing subscriptions resolve.statusrequiredRaw Stripe status when provider = stripe, else the stored status.
currencyrequiredintervalrequiredrecurringSubtotalrequiredΣ unit price × quantity of the live items, minor units, before discounts/tax.
cancelAtPeriodEndboolean · requiredcurrentPeriodEndrequiredms
seatsrequiredPurchased seats per Stripe items; null on a legacy fixed Team or non-seat plan.
seatPricesrequiredLive item price per kind; a kind not on the subscription uses the configured seat price in the same currency/interval.
occupiedrequiredSeats in use, owner included — the lowest totals the editor may pick.
legacyTeamboolean · requiredFixed-price Team subscription: saving seats migrates it to Standard/Premium seat pricing.
canEditSeatsboolean · requiredseatEditBlockedReasonrequiredseatEditMessagerequiredpendingSeatChangeboolean · requiredA seat change is waiting on payment.
pendingSeatPaymentobjectHow to finish that payment (owner only — this is their own subscription).
unconfirmedQuoteIdstringA submitted seat change whose outcome is unknown; confirmTeamSeatChange with it (safe to repeat) resolves it.
TeamSeatQuoteInput
seatsobject · requiredPurchased seat counts for a paid team (Stripe line-item quantities).
TeamSeatQuote
quoteIdstring · requiredsubscriptionIdstring · requiredseatsobject · requiredPurchased seat counts for a paid team (Stripe line-item quantities).
previousSeatsrequiredlegacyMigrationboolean · requiredcurrencyrequiredintervalrequiredseatPricesobject · requiredPrice per seat per billing interval, minor units of SubscriptionBilling.currency.
recurringSubtotalnumber · requiredNew recurring subtotal per interval (minor units, before discounts/tax).
previousRecurringSubtotalnumber · requiredamountDuenumber · requiredEvery change is prorated immediately (Stripe always_invoice): amountDue is charged now; a negative total is credited to the customer's Stripe balance. Money, minor units of
currency.totalnumber · requiredStripe preview invoice total; negative = credit to the customer balance.
linesobject[] · requiredallowanceDeltanumber · requiredUsage credits (not money) added to (>0) or removed from (<0) the team's allowance when the change applies: the pool difference prorated to the rest of the current allowance period. Applied exactly once, together with the Stripe change (after payment if one is required). A removal is reserved at confirm and refused if those credits are already used.
allowancePeriodEndnumber · requiredms — end of the allowance period allowanceDelta is prorated to.
prorationDatenumber · requiredms
currentPeriodEndnumber · requiredexpiresAtnumber · requiredms — confirm before this; a submitted quote's retries resolve regardless.
BillingCurrency
Decision Table
| Variant | Matching Criteria |
|---|---|
| No specific criteria | |
| No specific criteria |
UsageStatusInput
projectIdstringProject the work would run in. Omitted = the user's personal balance.
UsageStatus
totalBalancenumber · requiredmanualBalancenumber · requiredsubscriptionBalancenumber · requiredtierrequiredscaleis legacy: no longer sold, kept so existing subscriptions resolve.hasActivePaidSubscriptionboolean · requiredallowExtraSpendboolean · requiredcreditLimitnumber · requiredmonthlyTopUprequiredpercentUsednumber · requiredusageThisMonthnumber · requiredbillingCycleStartrequiredsessionrequiredweeklyrequired
fundedByTeamOwnerIdstringSet when this is a TEAM's pool, not the user's own: the paying team's owner id. Undefined = the user's own account funds work here.
TeamInfo
ownerIdstring · requiredThe team is addressed by its funding owner on this API.
organizationIdstring · requiredThe organization row behind it (better-auth organization plugin / SSO).
ownerEmailstring · requiredmaxSeatsnumber · requiredisOwnerboolean · requiredmyRolerequiredRole of a user within a team (IAM). owner: billing + full control; admin: manage members; member: belongs only.
canManageboolean · requiredactiveboolean · requiredpromoBoostboolean · requiredmembersobject[] · requiredinvitesobject[] · required
ownerNamestringnamestringOrganization display name.
tierThe owner's subscriptionTier: tells a free team from a paid/legacy one (with
activefor dormant).premiumSeatsnumberPremium seats bought on a per-seat plan; undefined on fixed plans.
ownerSeatTypeThe owner's own seat on a per-seat plan.
joinDomainstringEmail domain that auto-joins this team on signup/sign-in; undefined = off.
eligibleDomainstringDomain the owner is eligible to enable (their own, when not a public mail provider).
teamProjectIdsstring[]The team's shared projects: every member holds write access, and work inside one of them is billed to THIS team's pool. Empty = not set up yet. Optional until the multi-team backend lands.
teamLandingProjectIdstringThe team project a new member lands in on join (their
/). One of teamProjectIds; managers may re-point it. Unset when the team has none.
teamProjectIdstring · deprecated · required
TeamMemberInfo
idstring · requiredemailstring · requiredrolerequiredRole of a user within a team (IAM). owner: billing + full control; admin: manage members; member: belongs only.
seatTyperequired
namestring
TeamSeatType
Decision Table
| Variant | Matching Criteria |
|---|---|
| No specific criteria | |
| No specific criteria |
TeamInviteInfo
emailstring · requiredrolerequiredRole of a user within a team (IAM). owner: billing + full control; admin: manage members; member: belongs only.
invitedAtnumber · requiredexpiresAtnumber · required
TeamAddMemberInput
emailstring · required
roleownerIdstringTeam to act on, identified by its owner's user id.
TeamRevokeInviteInput
emailstring · required
ownerIdstringTeam to act on, identified by its owner's user id.
TeamSetProjectInput
projectIdstring · requiredProject to attach/detach — must be owned by the team owner. Required: a team may hold several projects, so there is no "the" one to infer.
isTeamProjectboolean · requiredtrue = shared team project (members get write access, spend draws the pool).
ownerIdstringTeam to act on, identified by its owner's user id.
TeamSetLandingProjectInput
projectIdstring · requiredMust already be one of the team's projects.
ownerIdstringTeam to act on, identified by its owner's user id.
TeamSetJoinDomainInput
enabledboolean · requiredtrue = auto-join on the owner's verified email domain, false = off.
ownerIdstringTeam to act on, identified by its owner's user id.
TeamInvitePreview
ownerEmailstring · requiredMasked (
j***@acme.com) — a forwarded link must not leak the owner's address.emailstring · requiredFull invited address — the invite email already contains it, and the sign-in form prefills from it.
rolerequiredRole of a user within a team (IAM). owner: billing + full control; admin: manage members; member: belongs only.
teamNamestring · required
TeamSetRoleInput
memberIdstring · requiredrolerequiredRole of a user within a team (IAM). owner: billing + full control; admin: manage members; member: belongs only.
TeamRemoveMemberInput
memberIdstring · required
ownerIdstringTeam to act on, identified by its owner's user id.
EdgeData
idstring · requireddeviceTyperequiredmetadataobject · requiredConstruct a type with a set of properties K of type T
namestring · requiredworkspacepathsstring[] · requiredLocal filesystem paths the agent can access
ownerIdstring · requiredstatusrequiredcreatedAtnumber · required
installedToolsobjectCatalog tool states (installed, authenticated) reported by the edge
mcp_jsonobjectRaw MCP config JSON
mcp_config_pathstring
DeviceType
Decision Table
| Variant | Matching Criteria |
|---|---|
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria |
EdgeStatus
Decision Table
| Variant | Matching Criteria |
|---|---|
| No specific criteria | |
| No specific criteria |
EdgeUpdateFields
namestringworkspacepathsstring[]installedToolsobjectConstruct a type with a set of properties K of type T
DeviceData
idstring · requirednamestring · requireduserIdstring · requiredOwner. A device shared with the viewer has
userId !== viewer.deviceTypestring · requiredmetadataobject · requiredBridge identity fields (os, arch, hostname, user, shell, home, ...) persisted on auth.
workspacepathsstring[] · requiredFilesystem roots the user has authorized AI shell sessions to operate within.
statusrequiredcreatedAtnumber · requiredlastSeenAtnumber · required
accessIdsstring[]Users the owner shared the device with (use access). Owner-facing views only.
sharedBystringSet for non-owner viewers: the owner's label ("Name
").
DeviceStatus
Decision Table
| Variant | Matching Criteria |
|---|---|
| No specific criteria | |
| No specific criteria | |
| No specific criteria |
DeviceExecInput
idstring · requiredcmdstring · requiredShell command to run on the device. Frontend is responsible for quoting/escaping.
cwdstringOptional working directory for the command.
timeoutMsnumberPer-call timeout (ms). Defaults to 10s server-side.
outputBridge output policy.
raw= no line cap and no head/tail cut — required for machine-parsed output (base64 blobs, JSON) where the default 300-char line cap silently corrupts long lines. Defaults tosafe.projectIdstringProject the run acts in: the bridge exports it as TODOFORAI_PROJECT_ID, so tfa-cli children land there instead of the device's cached default project.
DeviceExecOutput
stdoutstring · requiredCombined stdout/stderr, merged at the bridge PTY.
exitCoderequiredProcess exit code, or null if the run was killed/timed out before exit.
truncatedboolean · requiredTrue iff output exceeded the transport's output cap and was truncated.
timedOutboolean · requiredTrue iff the run hit
timeoutMsand was killed.
DeviceToolMap
installedboolean · requiredWhether the binary is found on PATH
versionstringOutput of versionCmd (e.g. "v1.2.3"), undefined if not run or no versionCmd
statusOutputstringOutput of statusCmd (e.g. logged-in user), undefined if not run or no statusCmd
authenticatedbooleanWhether statusCmd exited 0 (authenticated/ready)
requestedbooleanThe user explicitly asked for this tool on this device (Connect / Add). Hosts with a preinstalled catalog (cloud VMs) list only requested or connected tools — the rest is clutter — and a requested tool that later lost its credentials stays visible as "Not linked" so it can be fixed. Sticky across rescans; cleared by the
forgettool op.descriptionstringUser description override from the edge's ~/.todoforai/custom_tools.json, folded into the scan result edge-side. Takes precedence over the catalog description in the agent's bash tool CLI list, and lets non-catalog binaries (found on PATH) be advertised. Deliberately ONE field for both audiences, unlike the catalog's summary/description pair: the user writes this line themselves, in their own words, about their own binary — asking them for two takes of the same sentence buys less than it costs. It is shown as-is in the tile and sent as-is to the agent.
labelstringUser label override (custom_tools.json), same mechanism as
description.
DeviceToolOpInput
idstring · requiredtoolKeystring · requiredTOOL_CATALOG key.
kindrequiredforgetclears the user's request flag without uninstalling.
operationIdstring
DeviceToolOpOutput
okboolean · requiredcmdstring · requiredoutputstring · required
errorstringtoolsobjectCatalog tool state map (
installedTools), keyed by tool key.
GlobalAgentSettings
systemMessagestringmodelstringthinkingLeveltemperaturenumberpermissionsobjectedgesMcpConfigsobjectdevicesConfigobject
AgentUpdateInput
agentSettingsIdstring · requiredupdatesobject · requiredMake all properties in T optional
PartialAgentSettingsUpdate
namestringcolorstringHex color (e.g. '#10b981') used to tint todos assigned to this agent
modelstringLLM model identifier (e.g., 'claude-3-opus')
systemMessagestringCustom system prompt for the agent
thinkingLeveltemperaturenumbersystemMessageMode'default_coder' uses built-in coding prompt, 'custom_w_tools' uses systemMessage + auto-injected capability sections, 'raw' uses systemMessage verbatim (no global prepend, no tool/routing/workspace sections).
smartSystemPromptbooleanAuto-enhance system prompt based on context
memoryEnabledbooleanPut the user's file memory (
todoforai:memory/: index + pinned files) in the system prompt. Default on.contextDocumentsobject[]Reference files (PDF, images, text/office docs) pinned to every conversation of this agent: sent natively as the first user message (PDF/image as document/image blocks), prompt-cached. Metadata only — the agent fetches bytes by attachment id.
edgesMcpConfigsobjectEdge device MCP configurations by edgeId
devicesConfigobjectBridge device workspace + cwd config by deviceId. Parallel to
edgesMcpConfigs.permissionsobjectTool permission allowlist
specIdstringSpec this agent was created from
AgentEdgeMCPInput
agentSettingsIdstring · requirededgeIdstring · requiredmcpNamestring · requiredconfigobject · required
AgentDeviceConfigInput
agentSettingsIdstring · requireddeviceIdstring · requiredconfigobject · requiredPartial — merged over the existing per-device entry, so callers can flip a single field (e.g.
{ enabled: false }) without re-sending paths.
PartialDeviceConfig
workspacePathsstring[]enabledPer-agent device state. For ordinary devices, false disables and every other value enables. The hosted cloud VM additionally supports: false → Off. 'auto' → use only when no local desktop is online. 'on' → explicitly always on (overrides global Auto/Off). true / undefined → enabled, inheriting the per-user global cloud mode.
trueremains the inherited state for compatibility with existing agent records, where it was written before explicit cloud modes existed.deviceTypeDevice type — used by the agent for capability checks (e.g. has_shell vs has_cdp). Surfaced at submit time by enrichWithOnlineDevices.
namestringDevice identity surfaced at submit time so the agent can render the device in
## Available Machines(name heading, tool-alias suffix).metadataobjectConstruct a type with a set of properties K of type T
installedToolsobjectCatalog tool states injected by the backend at submit time.
BusinessContextInfoResponse
projectIdstring · requiredidstring · requirednamestring · requiredcreatedAtnumber · requireduristring · required
VoiceSourcesOutput
sourcesobject[] · required
profileobjectA learned company/personal writing voice — the distilled output of the voice refinement loop. Used to make agents write in the user's style.
VoiceSourceSummary
postsnumber · requiredchannelstring · requiredlabelstring · requiredPublic page URL that was read (crawl), or the connected page name (Graph API).
viarequiredHow the text was obtained.
manual= the user's own answers to the style questions (MANUAL_CHANNEL).charsnumber · requiredfetchedAtnumber · requiredpreviewstring · required
accountstringWhich account on that platform: the connected Facebook Page id (also for its linked Instagram account — the token lives on the Page), or the normalised profile URL that was crawled. A brand holds one source per (channel, account), so several Pages / handles on the same platform sit side by side; the set of stored sources is the brand's channel selection. Unset for device text — one such bucket per platform.
itemsarrayThe individual samples (
textis their join, for the preview). Rows stored before samples existed hold plain strings.warningstringSet when the fetch yielded nothing usable (login wall, no captions, …).
VoiceSample
textstring · required
promptstringThe message this replied to. Absent for standalone posts.
atstringISO date or whatever the source gives.
urlstringWhere it came from (post URL,
gmail:<account>/<thread>#<n>, memory address).
VoiceProfile
profilestring · requiredOne-paragraph description of the voice (tone, formality, quirks, do/don't).
matchnumber · required0–100 how well the final draft matches the target style.
sourcerequiredWhere the voice was learned from:
- 'answers' the user's own answers were usable and drove the profile
- 'company' the answers were too thin, so the profile is inferred from company info
- 'social' inferred from a (mock) connected social account
iterationsobject[] · requiredThe refinement passes, oldest → newest, so the UI can show the loop converging.
updatedAtnumber · required
notestringWhen source==='company': a short note explaining why the answers weren't used.
channelstringOptional label of the mock social channel this came from (source==='social').
answerFeedbackobjectPer-answer feedback (question → hint) for answers too weak to learn a style from.
sourcesobject[]What fed this profile: channel → posts/chars. Lets the user see what the style was learned from.
channelsobjectHow the voice differs per platform, only for channels that genuinely diverge (channel → one clause).
evidenceobject[]Which sources each learned trait was observed in — so the user can see what drove the style.
formatobjectMeasured writing format per channel (length, sentences, emoji/hashtag/link habits) — facts, not the LLM's guess.
movesRecurring devices the brand actually uses per channel (openers, closers, structures) — concrete, imitable. Keyed like
format; 'default' when learned without social posts. Legacy profiles hold a flat string[].skeletonSkeleton of a typical post per channel, line by line (e.g. "1: one-line claim · blank · 2–3: detail · blank · link alone"). Voice structure does not transfer between unalike platforms, so it is never global. Legacy profiles hold a string.
neverstring[]Things the brand never does.
addsstringWhat they put in beyond the bare facts (aside, joke, opinion, stray detail) and how often — quoted.
quirksstring[]Surface idiosyncrasies to reproduce rather than sand off (typos left in, non-native grammar, ":D", dangling "Try it at:" lines…).
correctionsstring[]What the author told the learner was off ("too polished", "I never use exclamation marks"), oldest first. Durable: applied on every re-learn and shown to agents as the highest authority.
VoiceIteration
samplestring · requiredSample line rewritten in the learned voice for this pass.
matchnumber · required0–100 self-assessed match to the target style after this pass.
critiquestring · requiredWhat changed / what was still off this pass (one short sentence).
VoiceProfileSource
channelstring · required'answers', 'company', or a voice name: a platform ('X', 'LinkedIn', …) or one account on it ('Facebook@acme').
postsnumber · requiredcharsnumber · required
accountsstring[]Account labels merged into this channel (Page names, handles) when there were several.
VoiceEvidence
traitstring · requiredchannelsstring[] · requiredSource channels ('X', 'LinkedIn', 'answers', …) where this trait shows up.
RecordstringVoiceFormat
postsnumber · requiredcharsobject · requiredTypical post length in characters: 25th–75th percentile, plus the longest seen.
sentencesobject · requiredTypical sentence count per post (p25–p75).
emojinumber · requiredShare of posts (0–1) using each device.
hashtagsnumber · requiredlinksnumber · requiredquestionsnumber · requiredexclamationsnumber · requiredlineBreaksnumber · requiredShare of posts with a paragraph/line break.
endsWithBareLinknumber · requiredShare of posts whose last line is only a link / arrow+link.
headlineOpenernumber · requiredShare of posts whose first line is short (≤ 60 chars) and followed by a break — a headline opener.
casingrequired'lower' when most posts start lowercase, 'sentence' otherwise.
charDecilesnumber[]The length distribution itself, as deciles p10…p90 — a generator matching only the median collapses the spread, which is the single biggest tell (real CV 0.65 vs generated 0.40). Optional: profiles learned before this field existed have none.
linesobjectTypical number of lines (p25–p75) when the post is multi-line.
capsEmphasisnumberShare of posts with an ALL-CAPS emphasis word (FINALLY, BEST — not acronyms ≤3 letters).
emoticonsnumberShare of posts with a text emoticon (:D ;) :) xD).
VoiceFormat
postsnumber · requiredcharsobject · requiredTypical post length in characters: 25th–75th percentile, plus the longest seen.
sentencesobject · requiredTypical sentence count per post (p25–p75).
emojinumber · requiredShare of posts (0–1) using each device.
hashtagsnumber · requiredlinksnumber · requiredquestionsnumber · requiredexclamationsnumber · requiredlineBreaksnumber · requiredShare of posts with a paragraph/line break.
endsWithBareLinknumber · requiredShare of posts whose last line is only a link / arrow+link.
headlineOpenernumber · requiredShare of posts whose first line is short (≤ 60 chars) and followed by a break — a headline opener.
casingrequired'lower' when most posts start lowercase, 'sentence' otherwise.
charDecilesnumber[]The length distribution itself, as deciles p10…p90 — a generator matching only the median collapses the spread, which is the single biggest tell (real CV 0.65 vs generated 0.40). Optional: profiles learned before this field existed have none.
linesobjectTypical number of lines (p25–p75) when the post is multi-line.
capsEmphasisnumberShare of posts with an ALL-CAPS emphasis word (FINALLY, BEST — not acronyms ≤3 letters).
emoticonsnumberShare of posts with a text emoticon (:D ;) :) xD).
CollectVoiceSourceInput
projectIdstring · requiredchannelstring · requiredPosts: 'X' | 'LinkedIn' | 'Facebook' | 'Instagram'. Threads: 'Gmail' | 'Outlook' | 'Slack' | 'Teams'. Own words: MANUAL_CHANNEL (with
samples).
urlstringPublic page URL, read by the paid scrapers (also for Facebook/Instagram). Omitted on Facebook/Instagram → the connected Pages (Graph API).
accountstringFacebook/Instagram: the connected Page id to read (NOT_FOUND if not connected). Omitted → the Pages the brand already holds, or every connected Page when it holds none yet.
samplesobject[]Samples collected on the user's own device by
tfa-cli brand voice collect <channel>(zele, outlook-api, tfa-memory, ...): signed-in data, so it wins over url / Graph API.
RemoveVoiceSourceInput
projectIdstring · requiredchannelstring · required
accountstringThe account's source (Page id / crawled URL); omitted → the channel's device bucket.
allboolean
RefineBrandVoiceInput
projectIdstring · required
sourceconstLearns from EVERY collected source (see collectVoiceSource) — social channels plus the Manual answers — producing one global profile. Set to 'company' to ignore all of that and derive the voice from company info alone.
Const value: companycorrectionstringOne new correction from the author ("too polished", "never exclamation marks"). The server appends it to the stored profile's list — so two tabs or the CLI can never overwrite each other — and runs a single cheap correction pass instead of a full re-learn.
RefineBrandVoiceOutput
profilestring · requiredmatchnumber · requiredsourcerequirediterationsobject[] · required
notestringchannelstringanswerFeedbackobjectPer-answer feedback (question → hint) for answers the arbiter judged too weak to learn a style from — why it fell short + how to make it usable. Only present when some answers were provided but not used.
sourcesobject[]What fed this profile.
channelsobjectConstruct a type with a set of properties K of type T
evidenceobject[]formatobjectConstruct a type with a set of properties K of type T
movesobjectConstruct a type with a set of properties K of type T
skeletonobjectConstruct a type with a set of properties K of type T
neverstring[]addsstringquirksstring[]correctionsstring[]
ContextInfo
todoIdstring · requiredThe todo ID this context info belongs to
modelstring · requiredThe model being used
contextWindownumber · requiredMaximum context window size in tokens
usedTokensnumber · requiredCurrent tokens used
utilizationPercentnumber · requiredPercentage of context window used (0-100)
messageCountnumber · requiredNumber of messages in the conversation
shouldCompactboolean · requiredWhether context compaction is recommended
compactingboolean · requiredA compaction request is in flight (agent not yet answered); persisted so it survives reloads
warningLevelrequiredWarning level based on utilization
breakdownobject · requiredDetailed token breakdown
ContextTokenBreakdown
inputTokensnumber · requiredoutputTokensnumber · requiredcacheReadTokensnumber · requiredcacheWriteTokensnumber · required
CompactInput
todoIdstring · required
dryRunbooleanIf true, only simulate compaction without making changes
targetUtilizationnumberTarget utilization percentage after compaction (0-1, default 0.5 = 50%)
CompactResult
successboolean · requiredoriginalMessagesnumber · requiredcompactedMessagesnumber · requiredsavedMessagesnumber · required
summarystringmessagestring
AddContextSummaryInput
todoIdstring · requiredoutputTokensnumber · requiredToken count after compaction
timestampnumber · requiredWhen compaction happened
messageIdsstring[] · requiredWhich messages were summarized
summarystringPlain summary text
summaryAttachmentobjectThe summary as an attachment frame
statusStatus: 'ready' = waiting to be used, defaults to 'ready'
Attachment
metadataobject · requiredStorage metadata (checksum, etc.)
idstring · requireduristring · requiredResource URI - always required. Format: "todoforai:todos/{todoId}/{id}"
originalNamestring · requiredmimeTypestring · requiredfileSizenumber · requiredIn bytes
userIdstringOwner user ID
agentSettingsIdstringScoped to agent settings
todoIdstringScoped to todo
symlinkTostringIf this is a symlink share, the attachment ID of the owner's original file
createdAtnumberisPublicbooleanstatusmodifiedAtnumberLast modified time (mtime), milliseconds epoch
permissionsnumberUnix permission bits (e.g. 0o644 = 420 decimal)
blockIdstringBlock ID that produced this attachment (for mapping tool results back to tool_calls)
toolCallIdstringLLM tool_call ID — for stamping results back to the originating tool call
textstringAgent → backend only: small text results travel inline here instead of a separate binary frame. Consumed at registration; never persisted.
ResourceUriInput
uristring · required
projectIdstringProject whose brand
todoforai:business-context/voice-profileresolve to.
ResourceCreateFolderInputparentUristringMinLength1namestringMinLength1
parentUristring · minLength: 1 · requirednamestring · minLength: 1 · required
ResourceTokenInputttl(numberMinimum60Maximum86400)undefined
ttlnumber · min: 60 · max: 86400Token lifetime in seconds. Defaults to 3600.
TodoSpecPublic
namestring · requireddescriptionstring · requiredidstring · requiredbodystring · requiredThe agent prompt body (markdown) — split into system/user via splitTemplateBody.
sourcerequiredWho owns a spec's content. 'builtin' = seeded from todo-registry.json and refreshed on deploy; editing copies-on-write to 'authored' (user-owned, never reseeded). Fork provenance lives in
forkedFrom, not here.updatedAtnumber · requiredcreatedAtnumber · requiredcategoriesstring[] · required
shortstringrequirementsstring[]Capability requirements, e.g. "cli:gh", "extension:chrome".
agentConfigobjectModel/thinking/permissions the spec's agent runs with; omitted = user defaults.
forkedFromstringSpec id or todo id this was forked from (set by share / save-as-template).
TodoSpecSource
Decision Table
| Variant | Matching Criteria |
|---|---|
| No specific criteria | |
| No specific criteria |
SpecAgentConfig
modelstringLLM model identifier (e.g., 'claude-3-opus')
thinkingLevelsystemMessageMode'default_coder' uses built-in coding prompt, 'custom_w_tools' uses systemMessage + auto-injected capability sections, 'raw' uses systemMessage verbatim (no global prepend, no tool/routing/workspace sections).
permissionsobjectTool permission allowlist
namestringcolorstringHex color (e.g. '#10b981') used to tint todos assigned to this agent
privatePromptboolean
SpecCreateInputnamestringMinLength1MaxLength120descriptionstringMinLength1bodystringMinLength...
namestring · minLength: 1 · maxLength: 120 · requireddescriptionstring · minLength: 1 · requiredbodystring · minLength: 1 · requiredThe agent prompt body (markdown).
shortstringcategoriesstring[]requirementsstring[]agentConfigobjectAgent settings a spec pins on the agent it starts with (applied by startFromSpec on every start).
name/colormake it a named agent (default name: the spec name).privatePrompt: the spec's system part stays server-side — stripped from public spec responses and never copied onto the agent; injected at run time via agent.specId.visibility
TodoSpec
idstring · requirednamestring · requireddescriptionstring · requiredcategoriesstring[] · requiredbodystring · requiredThe agent prompt body (markdown) — split into system/user via splitTemplateBody.
sourcerequiredWho owns a spec's content. 'builtin' = seeded from todo-registry.json and refreshed on deploy; editing copies-on-write to 'authored' (user-owned, never reseeded). Fork provenance lives in
forkedFrom, not here.visibilityrequiredcreatedBystring · requiredcreatedAtnumber · requiredupdatedAtnumber · required
shortstringrequirementsstring[]Capability requirements, e.g. "cli:gh", "extension:chrome".
agentConfigobjectModel/thinking/permissions the spec's agent runs with; omitted = user defaults.
forkedFromstringSpec id or todo id this was forked from (set by share / save-as-template).
SpecPatchInput
idstring · required
namestringdescriptionstringbodystringshortstringcategoriesstring[]requirementsstring[]agentConfigobjectAgent settings a spec pins on the agent it starts with (applied by startFromSpec on every start).
name/colormake it a named agent (default name: the spec name).privatePrompt: the spec's system part stays server-side — stripped from public spec responses and never copied onto the agent; injected at run time via agent.specId.visibility
RegistryPack
idstring · requirednamestring · requireddescriptionstring · requiredtodoIdsstring[] · requiredcreatedAtnumber · requiredupdatedAtnumber · required
shortstringcategoriesstring[]
RecordstringTodoStats
idstring · requiredstartsnumber · requiredTimes started/forked
likesnumber · requiredcompletionRatenumber · required0-100
avgCompletionTimenumber · requiredIn milliseconds
isLikedboolean · requiredCurrent user has liked
TodoStats
idstring · requiredstartsnumber · requiredTimes started/forked
likesnumber · requiredcompletionRatenumber · required0-100
avgCompletionTimenumber · requiredIn milliseconds
isLikedboolean · requiredCurrent user has liked
RecordstringSpecMetaPublic
idstring · requiredtodoCountnumber · requiredHow many TODOs created from this spec
messageCountnumber · requiredTotal messages across all TODOs
totalCostnumber · requiredTotal cost across all TODOs (USD)
totalDurationnumber · requiredTotal AI processing duration across all TODOs (ms), summed from RunMeta.elapsed
SpecMetaPublic
idstring · requiredtodoCountnumber · requiredHow many TODOs created from this spec
messageCountnumber · requiredTotal messages across all TODOs
totalCostnumber · requiredTotal cost across all TODOs (USD)
totalDurationnumber · requiredTotal AI processing duration across all TODOs (ms), summed from RunMeta.elapsed
ShareCreateInputtext(stringMaxLength100000)undefined
textstring · maxLength: 100000todoIdstringFork the first user prompt of this TODO into a spec instead of raw text.
TodoCommentsOutput
commentsobject[] · requiredthreadsobject[] · requiredauthorsobject[] · requiredcanCommentboolean · requiredWhat the caller may do — the UI renders from this, never re-derives the ACL.
canModerateboolean · requiredcommentsEnabledboolean · required
TodoComment
idstring · requiredtodoIdstring · requiredmessageIdstring · requiredThe thread: every comment belongs to exactly one message.
authorIdstring · requiredcontentstring · requiredcreatedAtnumber · required
quoteobjectWhere in a message a comment points. Quote-anchored (W3C TextQuoteSelector), not offsets: survives markdown re-rendering; if the quote no longer matches, the comment falls back to the whole message.
editedAtnumber
ValidatedCommentAddInput
todoIdstring · minLength: 1 · requiredmessageIdstring · minLength: 1 · requiredcontentstring · minLength: 1 · maxLength: 2000 · required
quoteobject
ValidatedCommentQuote
exactstring · minLength: 1 · maxLength: 500 · required
prefixstring · maxLength: 64suffixstring · maxLength: 64blockIdstring · maxLength: 128
ValidatedCommentEditInput
todoIdstring · minLength: 1 · requiredcommentIdstring · minLength: 1 · requiredcontentstring · minLength: 1 · maxLength: 2000 · required
ClaimMintInput
seedProjectIdstring · requiredPublic project recipients fork on claim (must be owned by the caller).
emailsstring[]One link per email (attribution only, not a gate). Omit for a single anonymous link.
ttlSecnumberLink lifetime in seconds.
ClaimPreviewResponse
seedProjectIdstring · requirednamestring · required
descriptionstringemailstringAttribution email the link was minted for, if any.
brandMarkdownstringThe seed's brand page markdown (growth-plan block included), if it has one.
cardsobject[]The seed's suggested recommendation cards.
giftobjectWelcome gift this link carries, so the claim page can advertise it.
activationPackageServer-minted package; never accepted by public claim minting.
ClaimPreviewCard
specIdstring · requiredtitlestring · required
notestringprioritygroupstringBoard group slug (strategic workstream) the card belongs to, if any.
ClaimGift
creditUsdnumber · requiredCredit granted on explicit package activation (USD).
inviteBonusUsdnumber · requiredExtra credit per teammate who accepts an invite (USD).
capUsdnumber · requiredTotal gift ceiling, initial credit included (USD).
ActivationTier
Decision Table
| Variant | Matching Criteria |
|---|---|
| No specific criteria | |
| No specific criteria | |
| No specific criteria |
ActivationInterval
Decision Table
| Variant | Matching Criteria |
|---|---|
| No specific criteria | |
| No specific criteria |
ClaimRedeemResponse
newProjectIdstring · required
activationOfferIdstringPending activation, separate from workspace ownership.
giftobjectThe gift that was just applied, when the link carried one and this account was eligible.
ClaimGiftOutcome
creditGrantedUsdnumber · requiredManual credit actually loaded (USD).
teamWorkspaceActivatedboolean · requiredWhether the free team workspace tier was activated for this account.
inviteBonusUsdnumber · requiredExtra credit per teammate who joins (USD).
capUsdnumber · requiredTotal gift ceiling (USD).
AdminAccountOverview
userIdstring · requiredemailstring · requiredcreatedAtnumber · requiredisAnonymousboolean · requiredblockedboolean · requireddeveloperModeboolean · requiredWhether the Developer group shows in their View settings (adminUser.setDeveloperMode).
tierrequiredscaleis legacy: no longer sold, kept so existing subscriptions resolve.tierNamestring · requiredsubscriptionSourcerequiredWho owns the plan record.
stripe= Stripe writes it via webhooks and admins must not overwrite it;apple= App Store subscription (iOS IAP, same rule);admin= a comp/trial grant;free= the default free tier;none= no subscription at all.planLimitrequiredThe plan's monthly allowance — what a reset restores to.
subscriptionBalancenumber · requiredmanualBalancenumber · requiredtotalBalancenumber · requiredusageThisCyclenumber · requiredpercentUsednumber · requiredsessionrequiredweeklyrequiredprojectCountnumber · requiredtodoCountnumber · requireddailyobject[] · requiredSpend per day over the last 30 days, oldest first.
recentTransactionsobject[] · requiredMost recent transactions, newest first.
adminAuditobject[] · requiredAdmin actions taken on this account, newest first.
namestringstatusintervalstripeSubscriptionIdstringcurrentPeriodEndnumberbillingCycleStartnumberfirstPaidAtnumberseatsnumberTeam accounts only (the owner's view of their pool).
seatsUsednumberseatsIsOverridebooleanjoinDomainstringmembersobject[]Per-member spend this billing cycle — includes the owner and former members.
teamOwnerEmailsstring[]Set when this user SPENDS from someone else's pool: that owner's email.
AdminAccountTransaction
createdAtnumber · requiredtyperequiredamountnumber · requiredsourcestring · requireddescriptionstring · required
AdminAuditEntry
idstring · requiredatnumber · requiredactorstring · requiredAdmin API key prefix or 'unknown'.
actionstring · requiredRouter procedure name, e.g. 'setSubscription'.
userIdstring · requiredemailstring · requiredinputobject · requiredConstruct a type with a set of properties K of type T
beforeobject · requiredSubscription/balance fields captured before the mutation ran.
okboolean · required
afterobjectSame fields after (absent when the mutation threw).
errorstring
AdminResetCreditResult
userIdstring · requiredemailstring · requiredtierrequiredscaleis legacy: no longer sold, kept so existing subscriptions resolve.previousBalancenumber · requirednewBalancenumber · required
PrewarmJobOutput
idstring · requiredstatusrequiredclaimLinksstring[] · requiredlogstring[] · required
projectIdstringerrorstring
AdminAddCreditResult
userIdstring · requiredemailstring · requiredpreviousBalancenumber · requirednewBalancenumber · requiredamountnumber · required
AdminSetSubscriptionResult
userIdstring · requiredemailstring · requiredtierrequiredscaleis legacy: no longer sold, kept so existing subscriptions resolve.subscriptionBalancenumber · required
AdminSetSeatsResult
userIdstring · requiredemailstring · requiredseatsnumber · requiredisOverrideboolean · required
AdminSetDeveloperModeResult
userIdstring · requiredemailstring · requireddeveloperModeboolean · required
AdminUser
idstring · requiredemailstring · requiredcreatedAtstring · date-time · requiredupdatedAtstring · date-time · requiredisAnonymousboolean · required
namestringimage
AdminStats
totalUsersnumber · requiredregisteredUsersnumber · requiredanonymousUsersnumber · requirednewUsers7dnumber · requireddailyobject[] · requiredgeneratedAtnumber · required
AdminLlmUsage
daysobject[] · requiredtotalCostnumber · requiredtotalMessagesnumber · requiredgeneratedAtnumber · required
AdminLlmUsageDay
datestring · requiredcostnumber · requiredmessagesnumber · requiredmodelsobject[] · required
AdminModelUsage
modelstring · requiredinputTokensnumber · requiredoutputTokensnumber · requiredcostnumber · required
ProviderAccountQuota
providerstring · requiredaccountstring · requiredwindowsobject[] · required
planstringerrorstring
ProviderQuotaWindow
labelstring · requiredusedPercentnumber · requiredresetsAtrequired
windowMsnumber
ProviderLoginStartInput
providerrequiredOAuth providers CLIProxyAPI can enroll via its management API.
ProviderLoginProvider
Decision Table
| Variant | Matching Criteria |
|---|---|
| No specific criteria | |
| No specific criteria | |
| No specific criteria |
ProviderLoginStart
providerrequiredOAuth providers CLIProxyAPI can enroll via its management API.
urlstring · requiredstatestring · required
ProviderLoginCompleteInput
redirectUrlstring · minLength: 1 · maxLength: 4000 · requiredThe
http://localhost:<port>/callback?code=…&state=…URL the browser was redirected to. NoFormat<'url'>: typia's url pattern rejects localhost / private IPs, which is exactly what every loopback OAuth callback is. Shape is validated in ProviderLoginService.
AdminOpsAlertInput
keystring · minLength: 1 · maxLength: 100 · requiredThrottle key, e.g.
serper-keys-exhausted; one email per key per hour.subjectstring · minLength: 1 · maxLength: 200 · required
detailstring · maxLength: 4000
Challenge
idstring · requiredchallengestring · requiredcreatedAtstring · date-time · required
emailstring
HexGrid
idstring · requiredprojectIdstring · requirednamestring · requiredcreatedAtnumber · requiredupdatedAtnumber · required
descriptionstring
GridTile
idstring · requiredgridIdstring · requiredqnumber · requiredrnumber · requiredcreatedAtnumber · requiredupdatedAtnumber · required
todoIdstringlabelstringmetadataobjectConstruct a type with a set of properties K of type T
GridTileCreateInput
gridIdstring · requiredqnumber · requiredrnumber · required
labelstringmetadataobjectConstruct a type with a set of properties K of type T
GridTileUpdateInput
gridIdstring · requiredqnumber · requiredrnumber · required
labelstringmetadataobjectConstruct a type with a set of properties K of type T
GridTileMoveInput
gridIdstring · requiredqnumber · requiredrnumber · requirednewQnumber · requirednewRnumber · required
GridTileAttachTodoInput
gridIdstring · requiredqnumber · requiredrnumber · requiredtodoIdstring · required
GridTileSwapInput
gridIdstring · requiredq1number · requiredr1number · requiredq2number · requiredr2number · required
RecommendationGenerateInput
projectIdstring · required
directionstringFree-text steer sent to the analyzer as a chat message (e.g. "focus on TikTok", "more B2B leads").
PlacementCreateInput
projectIdstring · required
kindconstConst value: recommendationspecIdstringReuse an existing registry spec as-is. Exactly one of specId / template.
templateobjectWrite the proposal inline: the spec is created as part of this call and rolled back if the proposal fails, so no orphan template is left behind.
titlestringnotestringprioritygroupstringBoard group slug (strategic workstream) for the card; upserted on creation.
groupNamestringOptional display name to upsert for
group.groupDescriptionstringOne-line strategic intent to upsert for
group(routes future todos into it).
PickSpecCreateInputnamebodyshortcategoriesdescriptionstringundefined
namestring · requiredbodystring · requiredThe agent prompt body (markdown).
shortstringcategoriesstring[]descriptionstring
OnboardingUpdateInput
patchobject · requiredMake all properties in T optional
expectedUpdatedAtnumberClient's last known updatedAt; reject if server doc is newer
PartialOmitOnboardingversionidupdatedAt
startedAtnumbercompletedAtnumbertodoIdstringThe board's setup todo (ONBOARDING_AGENT); kept (DONE) after finishing, '' on restart.
currentStepstringStepper step id the user is on
websiteUrlstringboardModePersonal board (no brand UI) or business board (brand card, analyzer, voice).
SandboxRecord
idstring · requireduser_idstring · requiredtemplatestring · requiredstaterequiredSandbox lifecycle state change. Published by sandbox-manager on Redis (
sandbox:events:<userId>), re-emitted by backend to subscribed frontends.- On create/pause/resume/error/terminate:
sandboxholds the full record. - On delete:
deleted: trueandsandboxis omitted; frontend drops the row.
- On create/pause/resume/error/terminate:
ip_addressrequiredtap_devicerequiredpidrequiredcreated_atnumber · requiredlast_activitynumber · requirederrorrequired
kindDefaults to 'vm' for legacy records that pre-date the field.
sizeVmSize tier; not modelled in TS — frontend passes through as-is.
device_idstringId of the backend Device row representing this sandbox's bridge. Lite: set at create time. VM: set after the bridge enrolls and the backend calls
attach-device. Absent when not yet linked.
SandboxStateValue
Decision Table
| Variant | Matching Criteria |
|---|---|
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria |
CodexImageGenInput
contentarray · requiredsizerequiredRequired for billing —
autois rejected since we can't price the result deterministically.
modelstringqualitybackgroundoutputFormatinstructionsstring
CodexImageGenContent
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = object · requires: type, text | |
| type = object · requires: type, imageUrl |
typeconst · requiredConst value: input_texttextstring · required
CodexImageSize
Decision Table
| Variant | Matching Criteria |
|---|---|
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria |
CodexImageGenOutput
imagestring · requiredBase64-encoded image bytes (no data URL prefix).
formatstring · requiredOutput format: png | webp | jpeg
costnumberelapsednumberrevisedPromptstringimageModelstringImage model the upstream actually used (e.g. "gpt-image-2-codex") — Codex picks it, we can't pin it.
FeedPage
itemsobject[] · requiredunseennumber · requiredEvents after the reader's cursor — the unread count, whatever the page size.
seennumber · requiredThe reader's scalar base cursor. Rows carry
unreadthemselves: category cursors can advance past this.
nextCursornumberunseenByTierobjectCounts across all categories, independent of the page/category filter.
FeedEvent
idstring · requiredscopestring · requiredA projectId, or 'acct' for news about the person rather than a board.
kindrequiredONE feed, one row shape, whatever the news is.
team_inviteis account-scoped and acted on from the bell; thetodo_*kinds are project-scoped and drained by the voice agent. Kind decides scope, audience and rendering — not which store it lives in.subjectstring · requiredWhat it's about — a todo id, an invite token. Dedupe and resolution match on this.
messagestring · requiredOne line, already human-readable: a digest never re-derives prose from fields.
seqnumber · requiredMonotonic position in the stream. Ordering and cursors use THIS, not
createdAt: timestamps tie when a run finishes several todos in one millisecond, and a cursor over tied scores silently skips events.createdAtnumber · required
titlestringHeadline, when the row is rendered in a list (the bell).
hrefstringIn-app route that acts on the subject (e.g.
/join/<token>).expiresAtnumberPast this the subject is dead; the row renders as expired.
resolvedAtnumberresolutionreadAtnumberWhen the user opened this row (bell click, toast, push tap) — read regardless of the cursor.
senderobjectWho authored a
platform_message: the team, or the user's own agent giving a tip. Rendered, never inferred.unreadbooleanPer-row human read state; category cursors cannot be represented by a single
seen.statusRevnumberTodo outcomes: the todo's
statusRevat this transition — the same rev its live status event carried.heardbooleanOrchestrator drain only: already relayed live (feed.markHeard covers this rev) — ack it, don't replay it.
FeedKind
Decision Table
| Variant | Matching Criteria |
|---|---|
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria | |
| No specific criteria |
Recordpriorityactivityuser_messagesnumber
prioritynumber · requiredactivitynumber · requireduser_messagesnumber · required
ValidatedPlatformMessageInput
subjectstring · minLength: 1 · maxLength: 120 · requiredtitlestring · minLength: 1 · maxLength: 120 · requiredmessagestring · minLength: 1 · maxLength: 4000 · required
hrefstring · maxLength: 500 · pattern:^/(?![/\\])\S*$In-app path only: no scheme (javascript:, https:) and no protocol-relative
//host.
FeedEventcreatedboolean
idstring · requiredscopestring · requiredA projectId, or 'acct' for news about the person rather than a board.
kindrequiredONE feed, one row shape, whatever the news is.
team_inviteis account-scoped and acted on from the bell; thetodo_*kinds are project-scoped and drained by the voice agent. Kind decides scope, audience and rendering — not which store it lives in.subjectstring · requiredWhat it's about — a todo id, an invite token. Dedupe and resolution match on this.
messagestring · requiredOne line, already human-readable: a digest never re-derives prose from fields.
seqnumber · requiredMonotonic position in the stream. Ordering and cursors use THIS, not
createdAt: timestamps tie when a run finishes several todos in one millisecond, and a cursor over tied scores silently skips events.createdAtnumber · requiredcreatedboolean · required
titlestringHeadline, when the row is rendered in a list (the bell).
hrefstringIn-app route that acts on the subject (e.g.
/join/<token>).expiresAtnumberPast this the subject is dead; the row renders as expired.
resolvedAtnumberresolutionreadAtnumberWhen the user opened this row (bell click, toast, push tap) — read regardless of the cursor.
senderobjectWho authored a
platform_message: the team, or the user's own agent giving a tip. Rendered, never inferred.unreadbooleanPer-row human read state; category cursors cannot be represented by a single
seen.statusRevnumberTodo outcomes: the todo's
statusRevat this transition — the same rev its live status event carried.heardbooleanOrchestrator drain only: already relayed live (feed.markHeard covers this rev) — ack it, don't replay it.
ValidatedMemberMessageInput
projectIdstring · minLength: 1 · maxLength: 100 · requiredtostring · email · requiredsubjectstring · minLength: 1 · maxLength: 120 · requiredtitlestring · minLength: 1 · maxLength: 120 · requiredmessagestring · minLength: 1 · maxLength: 4000 · required
hrefstring · maxLength: 500 · pattern:^/(?![/\\])\S*$In-app path only: no scheme (javascript:, https:) and no protocol-relative
//host.
ValidatedAdminPlatformMessageInput
emailstring · email · requiredfromstring · minLength: 1 · maxLength: 80 · requiredsubjectstring · minLength: 1 · maxLength: 120 · requiredtitlestring · minLength: 1 · maxLength: 120 · requiredmessagestring · minLength: 1 · maxLength: 4000 · required
hrefstring · maxLength: 500 · pattern:^/(?![/\\])\S*$In-app path only: no scheme (javascript:, https:) and no protocol-relative
//host.
RcloneOauthStartInput
providerstring · requiredCatalog key — must be a registered OAuth provider (see
rcloneProviders.ts).deviceIdstring · requiredDevice the remote is configured on — the host whose rclone panel opened the flow. Must be owned by the caller and online.
RcloneOauthStartOutput
authUrlstring · requiredProvider's authorization URL — open in a popup.
remoteNamestring · requiredThe rclone remote name we'll create on success — frontend can pre-display it.
flowIdstring · requiredPoll
rcloneOauth.status({ flowId })for the outcome.
loopbackbooleanProvider uses rclone's own OAuth client, so the browser ends on a dead
http://127.0.0.1:53682/?code&statepage: the user pastes that address into the app, which callscompletewith its query.
RcloneOauthCompleteInput
codestring · requiredAuthorization code from the provider's redirect.
statestring · requiredSigned state token — verified, replay-checked, and decoded server-side.
RcloneOauthCompleteOutput
remoteNamestring · requiredThe rclone remote name now configured on the target device.
providerstring · requiredCatalog provider key, echoed so the frontend can invalidate the right queries.
OauthFlowStatus
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = object · requires: status | |
| type = object · requires: status | |
| type = object · requires: status | |
| type = object · requires: status, error |
statusconst · requiredConst value: pending
MetaOauthStartOutput
authUrlstring · requiredFacebook Login dialog URL — open in a popup.
flowIdstring · requiredPoll
metaOauth.status({ flowId })for the outcome.
MetaPagesListOutput
configuredboolean · requiredFalse when the server has no Meta app configured — hide the Connect UI.
pagesobject[] · required
ToolOauthStartInput
toolstring · requiredTOOL_CATALOG key with a registered OAuth provider (see
toolOauthProviders.ts).deviceIdstring · requiredDevice whose CLI receives the token. Must be owned by the caller and online.