{"asyncapi":"3.0.0","info":{"title":"Base44 Live Builder Updates","version":"1.0.0","description":"Live updates of the builder chat for the apps a white-label session may watch. The connection is Socket.IO, not a raw WebSocket: connect with `io(socket_url, { path: socket_path, transports: [\"websocket\"], auth: { session_token } })`, using the values your server received from `POST /api/service/socket-sessions`. Then send `join` for each app, and receive its snapshot followed by live events.\n\nAvailable to white-label workspaces with live builder updates turned on. Your onboarding contact turns them on for your workspace."},"servers":{"platform":{"host":"ws.base44.com","protocol":"wss","pathname":"/ws/socket.io/","description":"Send the session token in the Socket.IO CONNECT `auth` as `session_token`. A refused connect is a `connect_error` with `message: \"connection_denied\"` and `data: { retryable }`: retry with backoff when `retryable`, otherwise ask your server for a new session."}},"channels":{"platform":{"title":"Platform socket","description":"One connection per session carries the events of every app it joins. In an event's `data`, a missing key is unchanged and an explicit `null` clears it. `app.snapshot` is the exception, since it replaces the app's state.","messages":{"MessageUpdatedEvent":{"$ref":"#/components/messages/MessageUpdatedEvent"},"MessageRemovedEvent":{"$ref":"#/components/messages/MessageRemovedEvent"},"AppStatusChangedEvent":{"$ref":"#/components/messages/AppStatusChangedEvent"},"PreviewReloadRequestedEvent":{"$ref":"#/components/messages/PreviewReloadRequestedEvent"},"PreviewNavigationRequestedEvent":{"$ref":"#/components/messages/PreviewNavigationRequestedEvent"},"QueueUpdatedEvent":{"$ref":"#/components/messages/QueueUpdatedEvent"},"TaskProgressedEvent":{"$ref":"#/components/messages/TaskProgressedEvent"},"ImageResolvedEvent":{"$ref":"#/components/messages/ImageResolvedEvent"},"ConversationChangedEvent":{"$ref":"#/components/messages/ConversationChangedEvent"},"FilesChangedEvent":{"$ref":"#/components/messages/FilesChangedEvent"},"BranchDeletedEvent":{"$ref":"#/components/messages/BranchDeletedEvent"},"RepositoryChangedEvent":{"$ref":"#/components/messages/RepositoryChangedEvent"},"PullRequestChangedEvent":{"$ref":"#/components/messages/PullRequestChangedEvent"},"SessionEndedEvent":{"$ref":"#/components/messages/SessionEndedEvent"},"RoomAccessDeniedEvent":{"$ref":"#/components/messages/RoomAccessDeniedEvent"},"RoomAccessRevokedEvent":{"$ref":"#/components/messages/RoomAccessRevokedEvent"},"RoomSnapshotUnavailableEvent":{"$ref":"#/components/messages/RoomSnapshotUnavailableEvent"},"AppSnapshotEvent":{"$ref":"#/components/messages/AppSnapshotEvent"},"JoinMessage":{"$ref":"#/components/messages/JoinMessage"},"LeaveMessage":{"$ref":"#/components/messages/LeaveMessage"}}}},"operations":{"sendMessageUpdatedEvent":{"action":"send","channel":{"$ref":"#/channels/platform"},"messages":[{"$ref":"#/channels/platform/messages/MessageUpdatedEvent"}],"summary":"A chat message was added or replaced. Replace the message with the same `id`."},"sendMessageRemovedEvent":{"action":"send","channel":{"$ref":"#/channels/platform"},"messages":[{"$ref":"#/channels/platform/messages/MessageRemovedEvent"}],"summary":"A chat message was removed or hidden. An `id` the viewer never saw is a no-op."},"sendAppStatusChangedEvent":{"action":"send","channel":{"$ref":"#/channels/platform"},"messages":[{"$ref":"#/channels/platform/messages/AppStatusChangedEvent"}],"summary":"The builder started, finished or failed a turn. Null status clears it."},"sendPreviewReloadRequestedEvent":{"action":"send","channel":{"$ref":"#/channels/platform"},"messages":[{"$ref":"#/channels/platform/messages/PreviewReloadRequestedEvent"}],"summary":"Reload the app preview."},"sendPreviewNavigationRequestedEvent":{"action":"send","channel":{"$ref":"#/channels/platform"},"messages":[{"$ref":"#/channels/platform/messages/PreviewNavigationRequestedEvent"}],"summary":"Show this page of the app in the preview."},"sendQueueUpdatedEvent":{"action":"send","channel":{"$ref":"#/channels/platform"},"messages":[{"$ref":"#/channels/platform/messages/QueueUpdatedEvent"}],"summary":"The whole prompt queue, after any change."},"sendTaskProgressedEvent":{"action":"send","channel":{"$ref":"#/channels/platform"},"messages":[{"$ref":"#/channels/platform/messages/TaskProgressedEvent"}],"summary":"Progress of a long-running tool, by `tool_call_id`."},"sendImageResolvedEvent":{"action":"send","channel":{"$ref":"#/channels/platform"},"messages":[{"$ref":"#/channels/platform/messages/ImageResolvedEvent"}],"summary":"A generated image finished or failed. Replace its `placeholder_url` wherever it appears."},"sendConversationChangedEvent":{"action":"send","channel":{"$ref":"#/channels/platform"},"messages":[{"$ref":"#/channels/platform/messages/ConversationChangedEvent"}],"summary":"The conversation was rewritten (undo, restore, sync). Rejoin the room for a fresh snapshot."},"sendFilesChangedEvent":{"action":"send","channel":{"$ref":"#/channels/platform"},"messages":[{"$ref":"#/channels/platform/messages/FilesChangedEvent"}],"summary":"The app's files changed outside a chat turn."},"sendBranchDeletedEvent":{"action":"send","channel":{"$ref":"#/channels/platform"},"messages":[{"$ref":"#/channels/platform/messages/BranchDeletedEvent"}],"summary":"A branch was deleted."},"sendRepositoryChangedEvent":{"action":"send","channel":{"$ref":"#/channels/platform"},"messages":[{"$ref":"#/channels/platform/messages/RepositoryChangedEvent"}],"summary":"The imported app's repository changed."},"sendPullRequestChangedEvent":{"action":"send","channel":{"$ref":"#/channels/platform"},"messages":[{"$ref":"#/channels/platform/messages/PullRequestChangedEvent"}],"summary":"The imported app's pull request changed."},"sendSessionEndedEvent":{"action":"send","channel":{"$ref":"#/channels/platform"},"messages":[{"$ref":"#/channels/platform/messages/SessionEndedEvent"}],"summary":"The session ended (expired, revoked, or taken by a newer socket). The socket disconnects next."},"sendRoomAccessDeniedEvent":{"action":"send","channel":{"$ref":"#/channels/platform"},"messages":[{"$ref":"#/channels/platform/messages/RoomAccessDeniedEvent"}],"summary":"A join was refused because the app is not on the session's allowlist, or the socket joins too often."},"sendRoomAccessRevokedEvent":{"action":"send","channel":{"$ref":"#/channels/platform"},"messages":[{"$ref":"#/channels/platform/messages/RoomAccessRevokedEvent"}],"summary":"The app left the session's allowlist, or its workspace. Events for it stop. Do not rejoin."},"sendRoomSnapshotUnavailableEvent":{"action":"send","channel":{"$ref":"#/channels/platform"},"messages":[{"$ref":"#/channels/platform/messages/RoomSnapshotUnavailableEvent"}],"summary":"The join held but its snapshot failed. Live events still arrive. Rejoin later for a snapshot."},"sendAppSnapshotEvent":{"action":"send","channel":{"$ref":"#/channels/platform"},"messages":[{"$ref":"#/channels/platform/messages/AppSnapshotEvent"}],"summary":"The app's current status and its last 50 public messages, after every join. Replace the app's state with it."},"receiveJoinMessage":{"action":"receive","channel":{"$ref":"#/channels/platform"},"messages":[{"$ref":"#/channels/platform/messages/JoinMessage"}],"summary":"Join an app's room, once per app after every connect. An `app.snapshot` follows, then its live events. Refused with `room.access_denied` when the app is not on the session's allowlist, or past 30 joins a minute."},"receiveLeaveMessage":{"action":"receive","channel":{"$ref":"#/channels/platform"},"messages":[{"$ref":"#/channels/platform/messages/LeaveMessage"}],"summary":"Leave an app's room. Its events stop."}},"components":{"messages":{"MessageUpdatedEvent":{"name":"message.updated","title":"message.updated","summary":"A chat message was added or replaced. Replace the message with the same `id`.","description":"<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>\n\nA chat message was added or replaced. Replace the message with the same `id`.","payload":{"$ref":"#/components/schemas/MessageUpdatedEvent"},"examples":[{"name":"message.updated","payload":{"room":"/apps/6a2024af837c7a06c83021c1","data":{"message":{"id":"c4f2a8e1-6b3d-4f9a-8e2c-1d7b5a9f3e60","role":"assistant","content":"I added a sign-in page with email and Google.","tool_calls":[{"id":"toolu_01HXq8","name":"write_file","requires_user_input":false,"auto_approved":false,"status":"success","mutation_applied":null,"display":{"file_paths":["src/pages/SignIn.jsx"]}}],"checkpoint_id":"68f1c2d4e7b91d003c45a1f9","metadata":{"created_date":"2026-10-10T09:23:41"}},"conversation_id":"68f1c2d4e7b91d003c45a1f2","branch_id":null}}}]},"MessageRemovedEvent":{"name":"message.removed","title":"message.removed","summary":"A chat message was removed or hidden. An `id` the viewer never saw is a no-op.","description":"<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>\n\nA chat message was removed or hidden. An `id` the viewer never saw is a no-op.","payload":{"$ref":"#/components/schemas/MessageRemovedEvent"},"examples":[{"name":"message.removed","payload":{"room":"/apps/6a2024af837c7a06c83021c1","data":{"message_id":"c4f2a8e1-6b3d-4f9a-8e2c-1d7b5a9f3e60","conversation_id":"68f1c2d4e7b91d003c45a1f2","branch_id":null}}}]},"AppStatusChangedEvent":{"name":"app.status_changed","title":"app.status_changed","summary":"The builder started, finished or failed a turn. Null status clears it.","description":"<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>\n\nThe builder started, finished or failed a turn. Null status clears it.","payload":{"$ref":"#/components/schemas/AppStatusChangedEvent"},"examples":[{"name":"app.status_changed","payload":{"room":"/apps/6a2024af837c7a06c83021c1","data":{"status":{"state":"processing","turn_id":"c4f2a8e1-6b3d-4f9a-8e2c-1d7b5a9f3e60","last_updated_date":"2026-10-10T09:23:41Z"},"branch_id":null}}}]},"PreviewReloadRequestedEvent":{"name":"preview.reload_requested","title":"preview.reload_requested","summary":"Reload the app preview.","description":"<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>\n\nReload the app preview.","payload":{"$ref":"#/components/schemas/PreviewReloadRequestedEvent"},"examples":[{"name":"preview.reload_requested","payload":{"room":"/apps/6a2024af837c7a06c83021c1","data":{"branch_id":null}}}]},"PreviewNavigationRequestedEvent":{"name":"preview.navigation_requested","title":"preview.navigation_requested","summary":"Show this page of the app in the preview.","description":"<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>\n\nShow this page of the app in the preview.","payload":{"$ref":"#/components/schemas/PreviewNavigationRequestedEvent"},"examples":[{"name":"preview.navigation_requested","payload":{"room":"/apps/6a2024af837c7a06c83021c1","data":{"path":"/sign-in","force":false,"branch_id":null}}}]},"QueueUpdatedEvent":{"name":"queue.updated","title":"queue.updated","summary":"The whole prompt queue, after any change.","description":"<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>\n\nThe whole prompt queue, after any change.","payload":{"$ref":"#/components/schemas/QueueUpdatedEvent"},"examples":[{"name":"queue.updated","payload":{"room":"/apps/6a2024af837c7a06c83021c1","data":{"items":[{"id":"q_7d1e9c","content":"Add a dark mode toggle to the header.","branch_id":null,"created_at":"2026-10-10T09:24:05+00:00"}],"is_paused":false,"branch_id":null}}}]},"TaskProgressedEvent":{"name":"task.progressed","title":"task.progressed","summary":"Progress of a long-running tool, by `tool_call_id`.","description":"<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>\n\nProgress of a long-running tool, by `tool_call_id`.","payload":{"$ref":"#/components/schemas/TaskProgressedEvent"},"examples":[{"name":"task.progressed","payload":{"room":"/apps/6a2024af837c7a06c83021c1","data":{"tool_call_id":"toolu_01HXq8","message_id":"c4f2a8e1-6b3d-4f9a-8e2c-1d7b5a9f3e60","event_type":"task_progress","progress":{"current":250,"total":1000,"percentage":25.0},"branch_id":null}}}]},"ImageResolvedEvent":{"name":"image.resolved","title":"image.resolved","summary":"A generated image finished or failed. Replace its `placeholder_url` wherever it appears.","description":"<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>\n\nA generated image finished or failed. Replace its `placeholder_url` wherever it appears.","payload":{"$ref":"#/components/schemas/ImageResolvedEvent"},"examples":[{"name":"image.resolved","payload":{"room":"/apps/6a2024af837c7a06c83021c1","data":{"status":"completed","placeholder_url":"/__generating__/5e8b2f4a-1c3d-4e6f-9a7b-2d4c6e8f0a1b.png","image_url":"https://media.base44.com/images/public/6a2024af837c7a06c83021c1/hero.png"}}}]},"ConversationChangedEvent":{"name":"conversation.changed","title":"conversation.changed","summary":"The conversation was rewritten (undo, restore, sync). Rejoin the room for a fresh snapshot.","description":"<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>\n\nThe conversation was rewritten (undo, restore, sync). Rejoin the room for a fresh snapshot.","payload":{"$ref":"#/components/schemas/ConversationChangedEvent"},"examples":[{"name":"conversation.changed","payload":{"room":"/apps/6a2024af837c7a06c83021c1","data":{"branch_id":null}}}]},"FilesChangedEvent":{"name":"files.changed","title":"files.changed","summary":"The app's files changed outside a chat turn.","description":"<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>\n\nThe app's files changed outside a chat turn.","payload":{"$ref":"#/components/schemas/FilesChangedEvent"},"examples":[{"name":"files.changed","payload":{"room":"/apps/6a2024af837c7a06c83021c1","data":{"branch_id":null}}}]},"BranchDeletedEvent":{"name":"branch.deleted","title":"branch.deleted","summary":"A branch was deleted.","description":"<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>\n\nA branch was deleted.","payload":{"$ref":"#/components/schemas/BranchDeletedEvent"},"examples":[{"name":"branch.deleted","payload":{"room":"/apps/6a2024af837c7a06c83021c1","data":{"branch_id":"68f1c2d4e7b91d003c45a1fa"}}}]},"RepositoryChangedEvent":{"name":"repository.changed","title":"repository.changed","summary":"The imported app's repository changed.","description":"<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>\n\nThe imported app's repository changed.","payload":{"$ref":"#/components/schemas/RepositoryChangedEvent"},"examples":[{"name":"repository.changed","payload":{"room":"/apps/6a2024af837c7a06c83021c1","data":{"branch_id":null}}}]},"PullRequestChangedEvent":{"name":"pull_request.changed","title":"pull_request.changed","summary":"The imported app's pull request changed.","description":"<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>\n\nThe imported app's pull request changed.","payload":{"$ref":"#/components/schemas/PullRequestChangedEvent"},"examples":[{"name":"pull_request.changed","payload":{"room":"/apps/6a2024af837c7a06c83021c1","data":{"branch_id":"68f1c2d4e7b91d003c45a1fa"}}}]},"SessionEndedEvent":{"name":"session.ended","title":"session.ended","summary":"The session ended (expired, revoked, or taken by a newer socket). The socket disconnects next.","description":"<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>\n\nThe session ended (expired, revoked, or taken by a newer socket). The socket disconnects next.","payload":{"$ref":"#/components/schemas/SessionEndedEvent"},"examples":[{"name":"session.ended","payload":{"room":null,"data":{"reason":"revoked"}}}]},"RoomAccessDeniedEvent":{"name":"room.access_denied","title":"room.access_denied","summary":"A join was refused because the app is not on the session's allowlist, or the socket joins too often.","description":"<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>\n\nA join was refused because the app is not on the session's allowlist, or the socket joins too often.","payload":{"$ref":"#/components/schemas/RoomAccessDeniedEvent"},"examples":[{"name":"room.access_denied","payload":{"room":"/apps/6a2024af837c7a06c83021c1","data":{}}}]},"RoomAccessRevokedEvent":{"name":"room.access_revoked","title":"room.access_revoked","summary":"The app left the session's allowlist, or its workspace. Events for it stop. Do not rejoin.","description":"<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>\n\nThe app left the session's allowlist, or its workspace. Events for it stop. Do not rejoin.","payload":{"$ref":"#/components/schemas/RoomAccessRevokedEvent"},"examples":[{"name":"room.access_revoked","payload":{"room":"/apps/6a2024af837c7a06c83021c1","data":{}}}]},"RoomSnapshotUnavailableEvent":{"name":"room.snapshot_unavailable","title":"room.snapshot_unavailable","summary":"The join held but its snapshot failed. Live events still arrive. Rejoin later for a snapshot.","description":"<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>\n\nThe join held but its snapshot failed. Live events still arrive. Rejoin later for a snapshot.","payload":{"$ref":"#/components/schemas/RoomSnapshotUnavailableEvent"},"examples":[{"name":"room.snapshot_unavailable","payload":{"room":"/apps/6a2024af837c7a06c83021c1","data":{}}}]},"AppSnapshotEvent":{"name":"app.snapshot","title":"app.snapshot","summary":"The app's current status and its last 50 public messages, after every join. Replace the app's state with it.","description":"<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>\n\nThe app's current status and its last 50 public messages, after every join. Replace the app's state with it.","payload":{"$ref":"#/components/schemas/AppSnapshotEvent"},"examples":[{"name":"app.snapshot","payload":{"room":"/apps/6a2024af837c7a06c83021c1","data":{"status":{"state":"ready","turn_id":"c4f2a8e1-6b3d-4f9a-8e2c-1d7b5a9f3e60","last_updated_date":"2026-10-10T09:23:41Z"},"messages":[{"id":"c4f2a8e1-6b3d-4f9a-8e2c-1d7b5a9f3e60","role":"assistant","content":"I added a sign-in page with email and Google.","tool_calls":[{"id":"toolu_01HXq8","name":"write_file","requires_user_input":false,"auto_approved":false,"status":"success","mutation_applied":null,"display":{"file_paths":["src/pages/SignIn.jsx"]}}],"checkpoint_id":"68f1c2d4e7b91d003c45a1f9","metadata":{"created_date":"2026-10-10T09:23:41"}}],"queue":{"items":[{"id":"q_7d1e9c","content":"Add a dark mode toggle to the header.","branch_id":null,"created_at":"2026-10-10T09:24:05+00:00"}],"is_paused":false}}}}]},"JoinMessage":{"name":"join","title":"join","summary":"Join an app's room, once per app after every connect. An `app.snapshot` follows, then its live events. Refused with `room.access_denied` when the app is not on the session's allowlist, or past 30 joins a minute.","description":"<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>\n\nJoin an app's room, once per app after every connect. An `app.snapshot` follows, then its live events. Refused with `room.access_denied` when the app is not on the session's allowlist, or past 30 joins a minute.","payload":{"$ref":"#/components/schemas/JoinMessage"},"examples":[{"name":"join","payload":"/apps/6a2024af837c7a06c83021c1"}]},"LeaveMessage":{"name":"leave","title":"leave","summary":"Leave an app's room. Its events stop.","description":"<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>\n\nLeave an app's room. Its events stop.","payload":{"$ref":"#/components/schemas/LeaveMessage"},"examples":[{"name":"leave","payload":"/apps/6a2024af837c7a06c83021c1"}]}},"schemas":{"AccessRuleChangeDetails":{"description":"An entity access-rule change waiting for approval.","properties":{"entity_name":{"description":"Entity whose access rules change.","title":"Entity Name","type":"string"},"change_type":{"description":"How the access rules change.","title":"Change Type","type":"string"},"changed_ops":{"description":"Access operations whose rules change.","items":{"type":"string"},"title":"Changed Ops","type":"array"}},"title":"AccessRuleChangeDetails","type":"object"},"AppSnapshotEvent":{"description":"The app's current status and its last 50 public messages, after every join. Replace the app's state with it.","properties":{"room":{"type":["string","null"],"description":"The app the event belongs to, as `/apps/{app_id}`. It is `null` for `session.ended`, which concerns the whole session.","title":"Room"},"data":{"$ref":"#/components/schemas/Snapshot","description":"The event's payload. Its fields depend on the event."}},"required":["room","data"],"title":"AppSnapshotEvent","type":"object"},"AppStatusChanged":{"description":"The app's build status changed, because a turn started, finished or failed.","properties":{"status":{"anyOf":[{"$ref":"#/components/schemas/StatusObject"},{"type":"null"}],"description":"The new status, or `null` when the status was cleared."},"branch_id":{"type":["string","null"],"default":null,"description":"ID of the branch the change belongs to. Omitted or `null` means the main branch.","title":"Branch Id"}},"required":["status"],"title":"AppStatusChanged","type":"object"},"AppStatusChangedEvent":{"description":"The builder started, finished or failed a turn. Null status clears it.","properties":{"room":{"type":["string","null"],"description":"The app the event belongs to, as `/apps/{app_id}`. It is `null` for `session.ended`, which concerns the whole session.","title":"Room"},"data":{"$ref":"#/components/schemas/AppStatusChanged","description":"The event's payload. Its fields depend on the event."}},"required":["room","data"],"title":"AppStatusChangedEvent","type":"object"},"AskClarifyingQuestionsCall":{"description":"The AI asks the user questions before it goes on. The call waits until the user answers.","properties":{"name":{"const":"ask_clarifying_questions","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"arguments":{"anyOf":[{"$ref":"#/components/schemas/QuestionArguments"},{"type":"null"}],"default":null,"description":"What the AI asked the tool to do, narrowed to what this tool publishes."},"user_input":{"anyOf":[{"$ref":"#/components/schemas/QuestionInput"},{"type":"null"}],"default":null,"description":"The user's answer to the call, once given, for tools that take one."}},"required":["name"],"title":"AskClarifyingQuestionsCall","type":"object"},"AskPlanQuestionsCall":{"description":"The AI asks the user questions that shape the plan, in plan mode. The call waits until the user answers.","properties":{"name":{"const":"ask_plan_questions","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"arguments":{"anyOf":[{"$ref":"#/components/schemas/QuestionArguments"},{"type":"null"}],"default":null,"description":"What the AI asked the tool to do, narrowed to what this tool publishes."},"user_input":{"anyOf":[{"$ref":"#/components/schemas/QuestionInput"},{"type":"null"}],"default":null,"description":"The user's answer to the call, once given, for tools that take one."}},"required":["name"],"title":"AskPlanQuestionsCall","type":"object"},"BackendFunctionEntityDeleteApproval":{"description":"Waiting for approval: testing a backend function would delete records from an entity.","properties":{"guard":{"const":"backend_function_entity_delete","description":"The check that paused the call.","title":"Guard","type":"string"},"reason":{"type":["string","null"],"default":null,"description":"Why the call needs approval, as the check explained it.","title":"Reason"},"details":{"anyOf":[{"$ref":"#/components/schemas/FunctionEntityDeleteDetails"},{"type":"null"}],"default":null,"description":"What the check found."}},"required":["guard"],"title":"BackendFunctionEntityDeleteApproval","type":"object"},"BashApproval":{"description":"Waiting for approval: the AI wants to run a shell command that needs a review first. The command itself is not published.","properties":{"guard":{"const":"bash_approval","description":"The check that paused the call.","title":"Guard","type":"string"}},"required":["guard"],"title":"BashApproval","type":"object"},"BashCall":{"description":"The AI runs a shell command in the app's sandbox.","properties":{"name":{"const":"bash","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"display":{"anyOf":[{"$ref":"#/components/schemas/SummaryDisplay"},{"type":"null"}],"default":null,"description":"What the tool touched, for showing its progress. Never file contents or commands."}},"required":["name"],"title":"BashCall","type":"object"},"BranchChange":{"description":"Something changed outside the chat. Re-read it, because the event carries no content.","properties":{"branch_id":{"type":["string","null"],"default":null,"description":"ID of the branch the change belongs to. Omitted or `null` means the main branch.","title":"Branch Id"}},"title":"BranchChange","type":"object"},"BranchDeletedEvent":{"description":"A branch was deleted.","properties":{"room":{"type":["string","null"],"description":"The app the event belongs to, as `/apps/{app_id}`. It is `null` for `session.ended`, which concerns the whole session.","title":"Room"},"data":{"$ref":"#/components/schemas/BranchChange","description":"The event's payload. Its fields depend on the event."}},"required":["room","data"],"title":"BranchDeletedEvent","type":"object"},"ConversationChangedEvent":{"description":"The conversation was rewritten (undo, restore, sync). Rejoin the room for a fresh snapshot.","properties":{"room":{"type":["string","null"],"description":"The app the event belongs to, as `/apps/{app_id}`. It is `null` for `session.ended`, which concerns the whole session.","title":"Room"},"data":{"$ref":"#/components/schemas/BranchChange","description":"The event's payload. Its fields depend on the event."}},"required":["room","data"],"title":"ConversationChangedEvent","type":"object"},"CreateEntityRecordsCall":{"description":"The AI adds records to one of the app's entities.","properties":{"name":{"const":"create_entity_records","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"display":{"anyOf":[{"$ref":"#/components/schemas/EntityRecordsDisplay"},{"type":"null"}],"default":null,"description":"What the tool touched, for showing its progress. Never file contents or commands."}},"required":["name"],"title":"CreateEntityRecordsCall","type":"object"},"DeleteEntitiesCall":{"description":"The AI deletes records from one of the app's entities.","properties":{"name":{"const":"delete_entities","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"arguments":{"anyOf":[{"$ref":"#/components/schemas/EntityChangeArguments"},{"type":"null"}],"default":null,"description":"What the AI asked the tool to do, narrowed to what this tool publishes."},"display":{"anyOf":[{"$ref":"#/components/schemas/EntityDisplay"},{"type":"null"}],"default":null,"description":"What the tool touched, for showing its progress. Never file contents or commands."}},"required":["name"],"title":"DeleteEntitiesCall","type":"object"},"DeleteFileCall":{"description":"The AI deletes a file from the app.","properties":{"name":{"const":"delete_file","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"display":{"anyOf":[{"$ref":"#/components/schemas/FileDisplay"},{"type":"null"}],"default":null,"description":"What the tool touched, for showing its progress. Never file contents or commands."}},"required":["name"],"title":"DeleteFileCall","type":"object"},"EditRepoFileCall":{"description":"The AI edits a file in the imported repository.","properties":{"name":{"const":"edit_repo_file","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"display":{"anyOf":[{"$ref":"#/components/schemas/FileDisplay"},{"type":"null"}],"default":null,"description":"What the tool touched, for showing its progress. Never file contents or commands."}},"required":["name"],"title":"EditRepoFileCall","type":"object"},"EntityChangeArguments":{"description":"An entity update or delete. The entity is in `display.entity_name`.","properties":{"summary":{"description":"The agent's summary of the change. Queries and record values are never included.","title":"Summary","type":"string"}},"title":"EntityChangeArguments","type":"object"},"EntityDisplay":{"description":"The entity an entity operation touched.","properties":{"entity_name":{"description":"Entity type. Records and query values are never included.","title":"Entity Name","type":"string"}},"title":"EntityDisplay","type":"object"},"EntityMutationDetails":{"description":"What the entity change waiting for approval would do. Record data is never included.","properties":{"method":{"description":"Entity method the code calls, such as `delete`.","title":"Method","type":"string"},"summary":{"description":"The agent's summary of what the code does.","title":"Summary","type":"string"}},"title":"EntityMutationDetails","type":"object"},"EntityRecordsDisplay":{"description":"The entity an operation added records to.","properties":{"entity_name":{"description":"Entity type. Records and query values are never included.","title":"Entity Name","type":"string"},"record_count":{"description":"Number of records created.","title":"Record Count","type":"integer"}},"title":"EntityRecordsDisplay","type":"object"},"EntityRlsGuardApproval":{"description":"Waiting for approval: the AI wants to change who can read or write an entity's records.","properties":{"guard":{"const":"entity_rls_guard","description":"The check that paused the call.","title":"Guard","type":"string"},"reason":{"type":["string","null"],"default":null,"description":"Why the call needs approval, as the check explained it.","title":"Reason"},"details":{"anyOf":[{"$ref":"#/components/schemas/AccessRuleChangeDetails"},{"type":"null"}],"default":null,"description":"What the check found."}},"required":["guard"],"title":"EntityRlsGuardApproval","type":"object"},"ExecDisplay":{"description":"What a code execution did.","properties":{"summary":{"description":"Reviewed activity summary. Code and output are never included.","title":"Summary","type":"string"},"writes_entities":{"description":"The code changed entity data, so refresh the preview.","title":"Writes Entities","type":"boolean"}},"title":"ExecDisplay","type":"object"},"ExecToolCall":{"description":"The AI runs code against the app's data and integrations.","properties":{"name":{"const":"exec_tool","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"display":{"anyOf":[{"$ref":"#/components/schemas/ExecDisplay"},{"type":"null"}],"default":null,"description":"What the tool touched, for showing its progress. Never file contents or commands."}},"required":["name"],"title":"ExecToolCall","type":"object"},"ExecToolEntityMutationApproval":{"description":"Waiting for approval: the AI's code would update or delete records in an entity.","properties":{"guard":{"const":"exec_tool_entity_mutation","description":"The check that paused the call.","title":"Guard","type":"string"},"reason":{"type":["string","null"],"default":null,"description":"Why the call needs approval, as the check explained it.","title":"Reason"},"details":{"anyOf":[{"$ref":"#/components/schemas/EntityMutationDetails"},{"type":"null"}],"default":null,"description":"What the check found."}},"required":["guard"],"title":"ExecToolEntityMutationApproval","type":"object"},"ExecToolGithubRepoWriteApproval":{"description":"Waiting for approval: the AI's code would write to a GitHub repository.","properties":{"guard":{"const":"exec_tool_github_repo_write","description":"The check that paused the call.","title":"Guard","type":"string"},"reason":{"type":["string","null"],"default":null,"description":"Why the call needs approval, as the check explained it.","title":"Reason"},"details":{"anyOf":[{"$ref":"#/components/schemas/SummaryDetails"},{"type":"null"}],"default":null,"description":"What the check found."}},"required":["guard"],"title":"ExecToolGithubRepoWriteApproval","type":"object"},"ExecToolInviteUserApproval":{"description":"Waiting for approval: the AI's code would invite someone to the app by email.","properties":{"guard":{"const":"exec_tool_invite_user","description":"The check that paused the call.","title":"Guard","type":"string"},"reason":{"type":["string","null"],"default":null,"description":"Why the call needs approval, as the check explained it.","title":"Reason"},"details":{"anyOf":[{"$ref":"#/components/schemas/SummaryDetails"},{"type":"null"}],"default":null,"description":"What the check found."}},"required":["guard"],"title":"ExecToolInviteUserApproval","type":"object"},"ExecToolSendEmailApproval":{"description":"Waiting for approval: the AI's code would send an email.","properties":{"guard":{"const":"exec_tool_send_email","description":"The check that paused the call.","title":"Guard","type":"string"},"reason":{"type":["string","null"],"default":null,"description":"Why the call needs approval, as the check explained it.","title":"Reason"},"details":{"anyOf":[{"$ref":"#/components/schemas/SummaryDetails"},{"type":"null"}],"default":null,"description":"What the check found."}},"required":["guard"],"title":"ExecToolSendEmailApproval","type":"object"},"ExecToolSendSmsApproval":{"description":"Waiting for approval: the AI's code would send a text message.","properties":{"guard":{"const":"exec_tool_send_sms","description":"The check that paused the call.","title":"Guard","type":"string"},"reason":{"type":["string","null"],"default":null,"description":"Why the call needs approval, as the check explained it.","title":"Reason"},"details":{"anyOf":[{"$ref":"#/components/schemas/SummaryDetails"},{"type":"null"}],"default":null,"description":"What the check found."}},"required":["guard"],"title":"ExecToolSendSmsApproval","type":"object"},"FileDisplay":{"description":"The files a file operation touched.","properties":{"file_paths":{"description":"Changed file paths. Source bodies and diffs are never included.","items":{"type":"string"},"title":"File Paths","type":"array"},"content_empty":{"description":"A write intentionally used empty content.","title":"Content Empty","type":"boolean"}},"title":"FileDisplay","type":"object"},"FilesChangedEvent":{"description":"The app's files changed outside a chat turn.","properties":{"room":{"type":["string","null"],"description":"The app the event belongs to, as `/apps/{app_id}`. It is `null` for `session.ended`, which concerns the whole session.","title":"Room"},"data":{"$ref":"#/components/schemas/BranchChange","description":"The event's payload. Its fields depend on the event."}},"required":["room","data"],"title":"FilesChangedEvent","type":"object"},"FindReplaceCall":{"description":"The AI edits files by replacing text in them.","properties":{"name":{"const":"find_replace","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"display":{"anyOf":[{"$ref":"#/components/schemas/FileDisplay"},{"type":"null"}],"default":null,"description":"What the tool touched, for showing its progress. Never file contents or commands."}},"required":["name"],"title":"FindReplaceCall","type":"object"},"FunctionEntityDeleteDetails":{"description":"A backend function test that would delete entity records.","properties":{"function_name":{"description":"Backend function under test.","title":"Function Name","type":"string"},"method":{"description":"Entity method the function calls.","title":"Method","type":"string"},"inspection_failed":{"description":"The check could not verify the function's source.","title":"Inspection Failed","type":"boolean"}},"title":"FunctionEntityDeleteDetails","type":"object"},"GameImageArguments":{"description":"What to generate.","properties":{"aspect_ratio":{"description":"Requested aspect ratio, such as `1:1`.","title":"Aspect Ratio","type":"string"}},"title":"GameImageArguments","type":"object"},"GenerateGameBackgroundCall":{"description":"The AI generates a background image for a game. An `image.resolved` event follows when it is ready.","properties":{"name":{"const":"generate_game_background","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"results":{"type":["string","null"],"default":null,"description":"The tool's result, narrowed to what this tool publishes. Absent while the call waits for approval.","title":"Results"}},"required":["name"],"title":"GenerateGameBackgroundCall","type":"object"},"GenerateGameImageCall":{"description":"The AI generates an image asset for a game. An `image.resolved` event follows when it is ready.","properties":{"name":{"const":"generate_game_image","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"arguments":{"anyOf":[{"$ref":"#/components/schemas/GameImageArguments"},{"type":"null"}],"default":null,"description":"What the AI asked the tool to do, narrowed to what this tool publishes."},"results":{"type":["string","null"],"default":null,"description":"The tool's result, narrowed to what this tool publishes. Absent while the call waits for approval.","title":"Results"}},"required":["name"],"title":"GenerateGameImageCall","type":"object"},"GenerateImageCall":{"description":"The AI generates an image for the app. An `image.resolved` event follows when it is ready.","properties":{"name":{"const":"generate_image","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"arguments":{"anyOf":[{"$ref":"#/components/schemas/MediaArguments"},{"type":"null"}],"default":null,"description":"What the AI asked the tool to do, narrowed to what this tool publishes."},"results":{"anyOf":[{"$ref":"#/components/schemas/ImageResult"},{"type":"null"}],"default":null,"description":"The tool's result, narrowed to what this tool publishes. Absent while the call waits for approval."}},"required":["name"],"title":"GenerateImageCall","type":"object"},"GeneratePrdCall":{"description":"The AI writes down the plan it settled with the user. In plan mode this call carries the plan itself.","properties":{"name":{"const":"generate_prd","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"arguments":{"anyOf":[{"$ref":"#/components/schemas/PrdArguments"},{"type":"null"}],"default":null,"description":"What the AI asked the tool to do, narrowed to what this tool publishes."}},"required":["name"],"title":"GeneratePrdCall","type":"object"},"GenerateVideoCall":{"description":"The AI generates a video for the app.","properties":{"name":{"const":"generate_video","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"arguments":{"anyOf":[{"$ref":"#/components/schemas/MediaArguments"},{"type":"null"}],"default":null,"description":"What the AI asked the tool to do, narrowed to what this tool publishes."},"results":{"type":["string","null"],"default":null,"description":"The tool's result, narrowed to what this tool publishes. Absent while the call waits for approval.","title":"Results"}},"required":["name"],"title":"GenerateVideoCall","type":"object"},"ImageResolved":{"description":"A generated image finished or failed. Replace `placeholder_url` with `image_url` wherever the app shows it.","properties":{"status":{"anyOf":[{"enum":["pending","completed","failed"],"type":"string"},{"type":"null"}],"default":null,"description":"`pending` while the image generates, `completed` once `image_url` is ready, `failed` when generation failed.","title":"Status"},"placeholder_url":{"type":["string","null"],"default":null,"description":"Placeholder URL the app shows while the image generates. Match it to find where the image appears.","title":"Placeholder Url"},"image_url":{"type":["string","null"],"default":null,"description":"URL of the finished image, or `null` while it is pending or after it failed.","title":"Image Url"}},"title":"ImageResolved","type":"object"},"ImageResolvedEvent":{"description":"A generated image finished or failed. Replace its `placeholder_url` wherever it appears.","properties":{"room":{"type":["string","null"],"description":"The app the event belongs to, as `/apps/{app_id}`. It is `null` for `session.ended`, which concerns the whole session.","title":"Room"},"data":{"$ref":"#/components/schemas/ImageResolved","description":"The event's payload. Its fields depend on the event."}},"required":["room","data"],"title":"ImageResolvedEvent","type":"object"},"ImageResult":{"description":"The generated image's state.","properties":{"placeholder_url":{"description":"Placeholder URL, used to associate an `image.resolved` event with this tool.","title":"Placeholder Url","type":"string"},"status":{"description":"Current generation status.","enum":["pending","completed","failed"],"title":"Status","type":"string"},"image_url":{"type":["string","null"],"description":"Generated image URL, once available.","title":"Image Url"}},"title":"ImageResult","type":"object"},"InstallNpmPackageCall":{"description":"The AI installs or removes npm packages in the app.","properties":{"name":{"const":"install_npm_package","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"arguments":{"anyOf":[{"$ref":"#/components/schemas/InstallPackageArguments"},{"type":"null"}],"default":null,"description":"What the AI asked the tool to do, narrowed to what this tool publishes."}},"required":["name"],"title":"InstallNpmPackageCall","type":"object"},"InstallPackageArguments":{"description":"The package operations the builder runs.","properties":{"packages":{"description":"Requested package operations.","items":{"$ref":"#/components/schemas/PackageOperation"},"title":"Packages","type":"array"}},"title":"InstallPackageArguments","type":"object"},"JoinMessage":{"description":"Join an app's room, once per app after every connect. An `app.snapshot` follows, then its live events. Refused with `room.access_denied` when the app is not on the session's allowlist, or past 30 joins a minute.","pattern":"^/apps/[0-9a-f]{24}$","title":"JoinMessage","type":"string"},"LeaveMessage":{"description":"Leave an app's room. Its events stop.","pattern":"^/apps/[0-9a-f]{24}$","title":"LeaveMessage","type":"string"},"MediaArguments":{"description":"What to generate.","properties":{"label":{"description":"Visible media label.","title":"Label","type":"string"},"aspect_ratio":{"description":"Requested aspect ratio, such as `16:9`.","title":"Aspect Ratio","type":"string"}},"title":"MediaArguments","type":"object"},"Message":{"description":"A public chat message. Replace the message with the same `id` as a whole.","properties":{"id":{"type":["string","null"],"default":null,"description":"ID of the message. An update carries the whole message again under the same ID.","title":"Id"},"role":{"anyOf":[{"enum":["user","assistant","system"],"type":"string"},{"type":"null"}],"default":null,"description":"`user` for a message a person sent, `assistant` for the AI's reply. `system` messages are never sent.","title":"Role"},"content":{"type":["string","null"],"default":null,"description":"Text of the message. Attachments and structured content are left out.","title":"Content"},"tool_calls":{"items":{"oneOf":[{"$ref":"#/components/schemas/AskClarifyingQuestionsCall"},{"$ref":"#/components/schemas/AskPlanQuestionsCall"},{"$ref":"#/components/schemas/BashCall"},{"$ref":"#/components/schemas/CreateEntityRecordsCall"},{"$ref":"#/components/schemas/DeleteEntitiesCall"},{"$ref":"#/components/schemas/DeleteFileCall"},{"$ref":"#/components/schemas/EditRepoFileCall"},{"$ref":"#/components/schemas/ExecToolCall"},{"$ref":"#/components/schemas/FindReplaceCall"},{"$ref":"#/components/schemas/GenerateGameBackgroundCall"},{"$ref":"#/components/schemas/GenerateGameImageCall"},{"$ref":"#/components/schemas/GenerateImageCall"},{"$ref":"#/components/schemas/GeneratePrdCall"},{"$ref":"#/components/schemas/GenerateVideoCall"},{"$ref":"#/components/schemas/InstallNpmPackageCall"},{"$ref":"#/components/schemas/PreviewExecuteCodeCall"},{"$ref":"#/components/schemas/PreviewScreenshotCall"},{"$ref":"#/components/schemas/ReadOnlyExecToolCall"},{"$ref":"#/components/schemas/ReadRepoFileCall"},{"$ref":"#/components/schemas/RunShellCommandCall"},{"$ref":"#/components/schemas/SetSecretsCall"},{"$ref":"#/components/schemas/UpdateEntitiesCall"},{"$ref":"#/components/schemas/UpdatePlanCall"},{"$ref":"#/components/schemas/WriteFileCall"},{"$ref":"#/components/schemas/WriteRepoFileCall"},{"$ref":"#/components/schemas/OtherToolCall"}]},"type":["array","null"],"default":null,"description":"The tool calls the AI made in this message, in order. Each is updated in place as it progresses.","title":"Tool Calls"},"checkpoint_id":{"type":["string","null"],"default":null,"description":"ID of the checkpoint tied to the message. On a message a person sent it holds the app before the turn, on the AI's final reply the app after it. Absent when the turn made no checkpoint.","title":"Checkpoint Id"},"metadata":{"anyOf":[{"$ref":"#/components/schemas/MessageMetadata"},{"type":"null"}],"default":null,"description":"When the message was created."},"additional_message_params":{"anyOf":[{"$ref":"#/components/schemas/MessageParams"},{"type":"null"}],"default":null,"description":"Flags on the message, such as plan mode. Only the flags listed here are published.","title":"Additional Message Params"}},"title":"Message","type":"object"},"MessageMetadata":{"description":"Message timestamp, without author identity.","properties":{"created_date":{"format":"date-time","type":["string","null"],"default":null,"description":"Time the message was created, as a UTC timestamp in ISO 8601 format.","title":"Created Date"}},"title":"MessageMetadata","type":"object"},"MessageParams":{"description":"Scalar parameters a chat UI needs while a turn runs.","properties":{"client_creation_id":{"description":"Identifier the sending client attached, to match its optimistic message.","title":"Client Creation Id","type":"string"},"plan_mode":{"description":"The message was sent in plan mode.","title":"Plan Mode","type":"boolean"},"plan_approved":{"description":"The message approves a plan.","title":"Plan Approved","type":"boolean"},"skip_ai_response":{"description":"The message expects no AI reply.","title":"Skip Ai Response","type":"boolean"},"system_message_type":{"description":"System message category.","title":"System Message Type","type":"string"}},"title":"MessageParams","type":"object"},"MessageRemoved":{"description":"A chat message was removed or hidden. Drop the message with `message_id`.","properties":{"message_id":{"description":"ID of the removed message.","title":"Message Id","type":"string"},"conversation_id":{"type":["string","null"],"default":null,"description":"ID of the conversation the message belongs to. Each branch has its own conversation, so a viewer showing one branch can drop another branch's messages.","title":"Conversation Id"},"branch_id":{"type":["string","null"],"default":null,"description":"ID of the branch the change belongs to. Omitted or `null` means the main branch.","title":"Branch Id"}},"required":["message_id"],"title":"MessageRemoved","type":"object"},"MessageRemovedEvent":{"description":"A chat message was removed or hidden. An `id` the viewer never saw is a no-op.","properties":{"room":{"type":["string","null"],"description":"The app the event belongs to, as `/apps/{app_id}`. It is `null` for `session.ended`, which concerns the whole session.","title":"Room"},"data":{"$ref":"#/components/schemas/MessageRemoved","description":"The event's payload. Its fields depend on the event."}},"required":["room","data"],"title":"MessageRemovedEvent","type":"object"},"MessageUpdated":{"description":"A chat message was added or changed. Replace the message with the same `id`.","properties":{"message":{"$ref":"#/components/schemas/Message","description":"The message in full, as it now reads."},"conversation_id":{"type":["string","null"],"default":null,"description":"ID of the conversation the message belongs to. Each branch has its own conversation, so a viewer showing one branch can drop another branch's messages.","title":"Conversation Id"},"branch_id":{"type":["string","null"],"default":null,"description":"ID of the branch the change belongs to. Omitted or `null` means the main branch.","title":"Branch Id"}},"required":["message"],"title":"MessageUpdated","type":"object"},"MessageUpdatedEvent":{"description":"A chat message was added or replaced. Replace the message with the same `id`.","properties":{"room":{"type":["string","null"],"description":"The app the event belongs to, as `/apps/{app_id}`. It is `null` for `session.ended`, which concerns the whole session.","title":"Room"},"data":{"$ref":"#/components/schemas/MessageUpdated","description":"The event's payload. Its fields depend on the event."}},"required":["room","data"],"title":"MessageUpdatedEvent","type":"object"},"OtherApproval":{"description":"Waiting for approval from a check that publishes only its name.","properties":{"guard":{"description":"The check that paused the call.","not":{"enum":["backend_function_entity_delete","bash_approval","entity_rls_guard","exec_tool_entity_mutation","exec_tool_github_repo_write","exec_tool_invite_user","exec_tool_send_email","exec_tool_send_sms"]},"title":"Guard","type":"string"}},"required":["guard"],"title":"OtherApproval","type":"object"},"OtherToolCall":{"description":"A call to any other tool. Only its name and progress are published.","properties":{"name":{"description":"The tool that was called.","not":{"enum":["ask_clarifying_questions","ask_plan_questions","bash","create_entity_records","delete_entities","delete_file","edit_repo_file","exec_tool","find_replace","generate_game_background","generate_game_image","generate_image","generate_prd","generate_video","install_npm_package","preview_execute_code","preview_screenshot","read_only_exec_tool","read_repo_file","run_shell_command","set_secrets","update_entities","update_plan","write_file","write_repo_file"]},"title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"}},"required":["name"],"title":"OtherToolCall","type":"object"},"PackageOperation":{"description":"A package operation. Versions and package-manager output are never included.","properties":{"name":{"description":"Package name.","title":"Name","type":"string"},"action":{"description":"Requested operation, such as `install`.","title":"Action","type":"string"}},"title":"PackageOperation","type":"object"},"PlanUpdate":{"description":"An add-only plan update.","properties":{"action":{"description":"Update action.","title":"Action","type":"string"},"section":{"description":"Plan section key.","title":"Section","type":"string"},"section_label":{"description":"User-facing section label.","title":"Section Label","type":"string"},"text":{"description":"Plan point.","title":"Text","type":"string"}},"title":"PlanUpdate","type":"object"},"PrdArguments":{"description":"The user's own plan. In plan mode the message `content` beside it can be empty.","properties":{"app_name":{"description":"App or feature name.","title":"App Name","type":"string"},"intent_and_goal":{"description":"What is being built and why.","title":"Intent And Goal","type":"string"},"audience_and_roles":{"description":"Who uses it and their roles.","title":"Audience And Roles","type":"string"},"core_flows":{"description":"End-to-end user flows.","items":{"type":"string"},"title":"Core Flows","type":"array"},"technical_requirements":{"description":"Specific technical requirements.","title":"Technical Requirements","type":"string"},"design_preferences":{"description":"Design preferences.","title":"Design Preferences","type":"string"},"prd_type":{"description":"Build or plan declaration, when the builder asks for one.","title":"Prd Type","type":"string"},"store_platform":{"description":"Store platform settled in planning, for e-commerce plans.","title":"Store Platform","type":"string"},"game_engine":{"description":"Engine settled in planning, for game plans.","title":"Game Engine","type":"string"}},"title":"PrdArguments","type":"object"},"PreviewExecuteCodeCall":{"description":"The AI runs code inside the app preview to inspect it.","properties":{"name":{"const":"preview_execute_code","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"display":{"anyOf":[{"$ref":"#/components/schemas/ExecDisplay"},{"type":"null"}],"default":null,"description":"What the tool touched, for showing its progress. Never file contents or commands."}},"required":["name"],"title":"PreviewExecuteCodeCall","type":"object"},"PreviewNavigationRequested":{"description":"The app preview should show a page of the app, usually one the AI just built.","properties":{"path":{"description":"Path of the page to show, relative to the app's root, such as `/settings`.","title":"Path","type":"string"},"force":{"description":"Navigate even when the user has moved away from the page.","title":"Force","type":"boolean"},"branch_id":{"type":["string","null"],"default":null,"description":"ID of the branch the change belongs to. Omitted or `null` means the main branch.","title":"Branch Id"}},"required":["path","force"],"title":"PreviewNavigationRequested","type":"object"},"PreviewNavigationRequestedEvent":{"description":"Show this page of the app in the preview.","properties":{"room":{"type":["string","null"],"description":"The app the event belongs to, as `/apps/{app_id}`. It is `null` for `session.ended`, which concerns the whole session.","title":"Room"},"data":{"$ref":"#/components/schemas/PreviewNavigationRequested","description":"The event's payload. Its fields depend on the event."}},"required":["room","data"],"title":"PreviewNavigationRequestedEvent","type":"object"},"PreviewReloadRequested":{"description":"The app preview should reload, because its files changed under it.","properties":{"branch_id":{"type":["string","null"],"default":null,"description":"ID of the branch the change belongs to. Omitted or `null` means the main branch.","title":"Branch Id"}},"title":"PreviewReloadRequested","type":"object"},"PreviewReloadRequestedEvent":{"description":"Reload the app preview.","properties":{"room":{"type":["string","null"],"description":"The app the event belongs to, as `/apps/{app_id}`. It is `null` for `session.ended`, which concerns the whole session.","title":"Room"},"data":{"$ref":"#/components/schemas/PreviewReloadRequested","description":"The event's payload. Its fields depend on the event."}},"required":["room","data"],"title":"PreviewReloadRequestedEvent","type":"object"},"PreviewScreenshotCall":{"description":"The AI takes a screenshot of the app preview to check its work.","properties":{"name":{"const":"preview_screenshot","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"display":{"anyOf":[{"$ref":"#/components/schemas/SummaryDisplay"},{"type":"null"}],"default":null,"description":"What the tool touched, for showing its progress. Never file contents or commands."}},"required":["name"],"title":"PreviewScreenshotCall","type":"object"},"PullRequestChangedEvent":{"description":"The imported app's pull request changed.","properties":{"room":{"type":["string","null"],"description":"The app the event belongs to, as `/apps/{app_id}`. It is `null` for `session.ended`, which concerns the whole session.","title":"Room"},"data":{"$ref":"#/components/schemas/BranchChange","description":"The event's payload. Its fields depend on the event."}},"required":["room","data"],"title":"PullRequestChangedEvent","type":"object"},"Question":{"description":"A question for the user. Image and HTML sources and private design context are never included.","properties":{"question":{"description":"Visible question text.","title":"Question","type":"string"},"type":{"description":"Question category, such as `text`.","title":"Type","type":"string"},"description":{"description":"Supporting text.","title":"Description","type":"string"},"multi_select":{"description":"More than one answer may be selected.","title":"Multi Select","type":"boolean"},"covers":{"description":"Plan section the question covers.","title":"Covers","type":"string"},"options":{"description":"Selectable options. A bare string is its label.","items":{"anyOf":[{"type":"string"},{"$ref":"#/components/schemas/QuestionOption"}]},"title":"Options","type":"array"}},"title":"Question","type":"object"},"QuestionAnswer":{"description":"An answer to a question. Secret-form input is never included.","properties":{"question_index":{"description":"Zero-based question index.","title":"Question Index","type":"integer"},"selected_label":{"description":"Label selected for a single-select question.","title":"Selected Label","type":"string"},"selected_labels":{"description":"Labels selected for a multi-select question.","items":{"type":"string"},"title":"Selected Labels","type":"array"},"custom_text":{"description":"Free-text answer. Structural filtering does not redact prose.","title":"Custom Text","type":"string"}},"title":"QuestionAnswer","type":"object"},"QuestionArguments":{"description":"The questions the builder asks.","properties":{"questions":{"description":"Questions presented to the user.","items":{"$ref":"#/components/schemas/Question"},"title":"Questions","type":"array"}},"title":"QuestionArguments","type":"object"},"QuestionInput":{"description":"The user's answers.","properties":{"answers":{"description":"Answers supplied to the question card.","items":{"$ref":"#/components/schemas/QuestionAnswer"},"title":"Answers","type":"array"}},"title":"QuestionInput","type":"object"},"QuestionOption":{"description":"A selectable answer.","properties":{"label":{"description":"Visible option label.","title":"Label","type":"string"}},"title":"QuestionOption","type":"object"},"QueueItem":{"description":"A prompt waiting in the queue.","properties":{"id":{"type":["string","null"],"default":null,"description":"ID of the queued prompt.","title":"Id"},"content":{"type":["string","null"],"default":null,"description":"Text of the prompt.","title":"Content"},"branch_id":{"type":["string","null"],"default":null,"description":"ID of the branch the prompt runs on, or `null` for the main branch.","title":"Branch Id"},"created_at":{"type":["string","null"],"default":null,"description":"Time the prompt was queued, as a UTC timestamp in ISO 8601 format.","title":"Created At"}},"title":"QueueItem","type":"object"},"QueueState":{"description":"The prompts the builder runs next, in order.","properties":{"items":{"items":{"$ref":"#/components/schemas/QueueItem"},"type":["array","null"],"default":null,"description":"Queued prompts, in the order they will run.","title":"Items"},"is_paused":{"type":["boolean","null"],"default":null,"description":"Whether the queue is paused, so queued prompts wait. A person can pause it, and the builder pauses it while the AI waits for an answer.","title":"Is Paused"}},"title":"QueueState","type":"object"},"QueueUpdated":{"description":"The whole prompt queue after a change. Replace the queue with it.","properties":{"items":{"items":{"$ref":"#/components/schemas/QueueItem"},"type":["array","null"],"default":null,"description":"Queued prompts, in the order they will run.","title":"Items"},"is_paused":{"type":["boolean","null"],"default":null,"description":"Whether the queue is paused, so queued prompts wait. A person can pause it, and the builder pauses it while the AI waits for an answer.","title":"Is Paused"},"processed_item_id":{"type":["string","null"],"default":null,"description":"ID of the queued prompt the builder just picked up to run. Absent when a prompt was added, removed or cleared.","title":"Processed Item Id"},"branch_id":{"type":["string","null"],"default":null,"description":"ID of the branch the change belongs to. Omitted or `null` means the main branch.","title":"Branch Id"}},"title":"QueueUpdated","type":"object"},"QueueUpdatedEvent":{"description":"The whole prompt queue, after any change.","properties":{"room":{"type":["string","null"],"description":"The app the event belongs to, as `/apps/{app_id}`. It is `null` for `session.ended`, which concerns the whole session.","title":"Room"},"data":{"$ref":"#/components/schemas/QueueUpdated","description":"The event's payload. Its fields depend on the event."}},"required":["room","data"],"title":"QueueUpdatedEvent","type":"object"},"ReadOnlyExecToolCall":{"description":"The AI runs code that only reads the app's data.","properties":{"name":{"const":"read_only_exec_tool","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"display":{"anyOf":[{"$ref":"#/components/schemas/ExecDisplay"},{"type":"null"}],"default":null,"description":"What the tool touched, for showing its progress. Never file contents or commands."}},"required":["name"],"title":"ReadOnlyExecToolCall","type":"object"},"ReadRepoFileCall":{"description":"The AI reads a file in the imported repository.","properties":{"name":{"const":"read_repo_file","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"display":{"anyOf":[{"$ref":"#/components/schemas/FileDisplay"},{"type":"null"}],"default":null,"description":"What the tool touched, for showing its progress. Never file contents or commands."}},"required":["name"],"title":"ReadRepoFileCall","type":"object"},"RepositoryChangedEvent":{"description":"The imported app's repository changed.","properties":{"room":{"type":["string","null"],"description":"The app the event belongs to, as `/apps/{app_id}`. It is `null` for `session.ended`, which concerns the whole session.","title":"Room"},"data":{"$ref":"#/components/schemas/BranchChange","description":"The event's payload. Its fields depend on the event."}},"required":["room","data"],"title":"RepositoryChangedEvent","type":"object"},"RoomAccessDeniedEvent":{"description":"A join was refused because the app is not on the session's allowlist, or the socket joins too often.","properties":{"room":{"type":["string","null"],"description":"The app the event belongs to, as `/apps/{app_id}`. It is `null` for `session.ended`, which concerns the whole session.","title":"Room"},"data":{"$ref":"#/components/schemas/RoomNotice","description":"The event's payload. Its fields depend on the event."}},"required":["room","data"],"title":"RoomAccessDeniedEvent","type":"object"},"RoomAccessRevokedEvent":{"description":"The app left the session's allowlist, or its workspace. Events for it stop. Do not rejoin.","properties":{"room":{"type":["string","null"],"description":"The app the event belongs to, as `/apps/{app_id}`. It is `null` for `session.ended`, which concerns the whole session.","title":"Room"},"data":{"$ref":"#/components/schemas/RoomNotice","description":"The event's payload. Its fields depend on the event."}},"required":["room","data"],"title":"RoomAccessRevokedEvent","type":"object"},"RoomNotice":{"description":"An empty payload. The app concerned is the event's `room`.","properties":{},"title":"RoomNotice","type":"object"},"RoomSnapshotUnavailableEvent":{"description":"The join held but its snapshot failed. Live events still arrive. Rejoin later for a snapshot.","properties":{"room":{"type":["string","null"],"description":"The app the event belongs to, as `/apps/{app_id}`. It is `null` for `session.ended`, which concerns the whole session.","title":"Room"},"data":{"$ref":"#/components/schemas/RoomNotice","description":"The event's payload. Its fields depend on the event."}},"required":["room","data"],"title":"RoomSnapshotUnavailableEvent","type":"object"},"RunShellCommandCall":{"description":"The AI runs a shell command in the imported repository's sandbox.","properties":{"name":{"const":"run_shell_command","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"display":{"anyOf":[{"$ref":"#/components/schemas/SummaryDisplay"},{"type":"null"}],"default":null,"description":"What the tool touched, for showing its progress. Never file contents or commands."}},"required":["name"],"title":"RunShellCommandCall","type":"object"},"SecretField":{"description":"A requested secret. Its value is never sent over the socket.","properties":{"secretName":{"description":"Requested secret name.","title":"Secretname","type":"string"},"description":{"description":"Where to obtain it.","title":"Description","type":"string"}},"title":"SecretField","type":"object"},"SessionEnded":{"description":"The session is over. The socket disconnects right after this event.","properties":{"reason":{"description":"`expired`: ask the partner backend for a new session. `revoked`: the partner or an admin ended it, so do not reconnect. `replaced`: a newer socket took the session, so stop.","enum":["expired","revoked","replaced"],"title":"Reason","type":"string"}},"required":["reason"],"title":"SessionEnded","type":"object"},"SessionEndedEvent":{"description":"The session ended (expired, revoked, or taken by a newer socket). The socket disconnects next.","properties":{"room":{"type":["string","null"],"description":"The app the event belongs to, as `/apps/{app_id}`. It is `null` for `session.ended`, which concerns the whole session.","title":"Room"},"data":{"$ref":"#/components/schemas/SessionEnded","description":"The event's payload. Its fields depend on the event."}},"required":["room","data"],"title":"SessionEndedEvent","type":"object"},"SetSecretsArguments":{"description":"The secrets the builder asks for.","properties":{"secrets_schema":{"description":"Requested secrets.","items":{"$ref":"#/components/schemas/SecretField"},"title":"Secrets Schema","type":"array"}},"title":"SetSecretsArguments","type":"object"},"SetSecretsCall":{"description":"The AI asks the user for secret values, such as API keys. The call waits until the user supplies them.","properties":{"name":{"const":"set_secrets","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"arguments":{"anyOf":[{"$ref":"#/components/schemas/SetSecretsArguments"},{"type":"null"}],"default":null,"description":"What the AI asked the tool to do, narrowed to what this tool publishes."}},"required":["name"],"title":"SetSecretsCall","type":"object"},"Snapshot":{"description":"The app's current state, sent after every join. Replace what the viewer holds for the app with it.","properties":{"status":{"anyOf":[{"$ref":"#/components/schemas/StatusObject"},{"type":"null"}],"description":"The app's build status, or `null` when none is recorded."},"messages":{"description":"The last 50 messages visible to partners, oldest first.","items":{"$ref":"#/components/schemas/Message"},"title":"Messages","type":"array"},"queue":{"$ref":"#/components/schemas/QueueState","description":"The main branch's prompt queue."}},"required":["status","messages","queue"],"title":"Snapshot","type":"object"},"StatusObject":{"description":"The app's current build status.","properties":{"state":{"anyOf":[{"enum":["ready","processing","error"],"type":"string"},{"type":"null"}],"default":null,"description":"Where the app is in its build lifecycle. Ready means idle with no build in progress, processing means the app is being generated or modified, and error means the last build failed. This tracks building, not publishing.","title":"State"},"turn_id":{"type":["string","null"],"default":null,"description":"ID of the user message whose turn the status belongs to.","title":"Turn Id"},"last_updated_date":{"format":"date-time","type":["string","null"],"default":null,"description":"Time the status was last updated, as a UTC timestamp in ISO 8601 format.","title":"Last Updated Date"}},"title":"StatusObject","type":"object"},"SummaryDetails":{"description":"What the code waiting for approval would do.","properties":{"summary":{"description":"The agent's summary of what the code does.","title":"Summary","type":"string"}},"title":"SummaryDetails","type":"object"},"SummaryDisplay":{"description":"What a command or screenshot did.","properties":{"summary":{"description":"Reviewed activity summary. Commands and output are never included.","title":"Summary","type":"string"}},"title":"SummaryDisplay","type":"object"},"TaskProgress":{"description":"How far a long-running task has got.","properties":{"current":{"type":["integer","null"],"default":null,"description":"Items processed so far.","title":"Current"},"total":{"type":["integer","null"],"default":null,"description":"Items to process in all.","title":"Total"},"percentage":{"type":["number","null"],"default":null,"description":"Share of the work done, from 0 to 100.","title":"Percentage"}},"title":"TaskProgress","type":"object"},"TaskProgressed":{"description":"A long-running task, such as a data import, started, made progress, finished, failed or was cancelled.","properties":{"tool_call_id":{"type":["string","null"],"default":null,"description":"ID of the tool call that started the task.","title":"Tool Call Id"},"message_id":{"type":["string","null"],"default":null,"description":"ID of the message that holds that tool call.","title":"Message Id"},"event_type":{"anyOf":[{"enum":["task_started","task_progress","task_completed","task_failed","task_cancelled"],"type":"string"},{"type":"null"}],"default":null,"description":"`task_started`, `task_progress`, `task_completed`, `task_failed` or `task_cancelled`.","title":"Event Type"},"progress":{"anyOf":[{"$ref":"#/components/schemas/TaskProgress"},{"type":"null"}],"default":null,"description":"Progress so far."},"branch_id":{"type":["string","null"],"default":null,"description":"ID of the branch the change belongs to. Omitted or `null` means the main branch.","title":"Branch Id"}},"title":"TaskProgressed","type":"object"},"TaskProgressedEvent":{"description":"Progress of a long-running tool, by `tool_call_id`.","properties":{"room":{"type":["string","null"],"description":"The app the event belongs to, as `/apps/{app_id}`. It is `null` for `session.ended`, which concerns the whole session.","title":"Room"},"data":{"$ref":"#/components/schemas/TaskProgressed","description":"The event's payload. Its fields depend on the event."}},"required":["room","data"],"title":"TaskProgressedEvent","type":"object"},"UpdateEntitiesCall":{"description":"The AI updates records in one of the app's entities.","properties":{"name":{"const":"update_entities","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"arguments":{"anyOf":[{"$ref":"#/components/schemas/EntityChangeArguments"},{"type":"null"}],"default":null,"description":"What the AI asked the tool to do, narrowed to what this tool publishes."},"display":{"anyOf":[{"$ref":"#/components/schemas/EntityDisplay"},{"type":"null"}],"default":null,"description":"What the tool touched, for showing its progress. Never file contents or commands."}},"required":["name"],"title":"UpdateEntitiesCall","type":"object"},"UpdatePlanArguments":{"description":"Settled plan points.","properties":{"updates":{"description":"Plan updates in their emitted order.","items":{"$ref":"#/components/schemas/PlanUpdate"},"title":"Updates","type":"array"},"sections_with_enough":{"description":"Base plan sections the builder considers sufficiently specified.","items":{"type":"string"},"title":"Sections With Enough","type":"array"}},"title":"UpdatePlanArguments","type":"object"},"UpdatePlanCall":{"description":"The AI adds settled points to the plan.","properties":{"name":{"const":"update_plan","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"arguments":{"anyOf":[{"$ref":"#/components/schemas/UpdatePlanArguments"},{"type":"null"}],"default":null,"description":"What the AI asked the tool to do, narrowed to what this tool publishes."}},"required":["name"],"title":"UpdatePlanCall","type":"object"},"WaitingOn":{"description":"What the call waits for. Render the widget by kind, not by tool name.","properties":{"kind":{"description":"`choice`: pick among options. `input`: supply values. `approval`: approve or reject.","enum":["choice","input","approval"],"title":"Kind","type":"string"}},"title":"WaitingOn","type":"object"},"WriteFileCall":{"description":"The AI writes a file in the app.","properties":{"name":{"const":"write_file","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"display":{"anyOf":[{"$ref":"#/components/schemas/FileDisplay"},{"type":"null"}],"default":null,"description":"What the tool touched, for showing its progress. Never file contents or commands."}},"required":["name"],"title":"WriteFileCall","type":"object"},"WriteRepoFileCall":{"description":"The AI writes a file in the imported repository.","properties":{"name":{"const":"write_repo_file","description":"The tool that was called.","title":"Name","type":"string"},"id":{"type":["string","null"],"default":null,"description":"ID of the call. Every update to the call carries the same ID.","title":"Id"},"requires_user_input":{"type":["boolean","null"],"default":null,"description":"`true` once the call has paused for the user's answer or approval. It stays `true` after the user answers, so read `status` to know whether the call is still waiting.","title":"Requires User Input"},"auto_approved":{"type":["boolean","null"],"default":null,"description":"`true` when the call needed approval but ran at once because the app has Auto approve on. It never paused, and its result is real.","title":"Auto Approved"},"status":{"anyOf":[{"enum":["running","success","error","stopped","waiting_for_user_input"],"type":"string"},{"type":"null"}],"default":null,"description":"`running` while the tool works, `success` or `error` once it finished, `stopped` when the user stopped the turn, and `waiting_for_user_input` while it waits for the user's answer or approval.","title":"Status"},"mutation_applied":{"type":["boolean","null"],"default":null,"description":"Whether the call changed the app or its data. `false` means it finished without changing anything. `null` means the tool did not report it, so whether it changed anything is unknown.","title":"Mutation Applied"},"waiting_on":{"anyOf":[{"$ref":"#/components/schemas/WaitingOn"},{"type":"null"}],"default":null,"description":"What kind of answer the call waits for, while `status` is `waiting_for_user_input`.","title":"Waiting On"},"approval":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/BackendFunctionEntityDeleteApproval"},{"$ref":"#/components/schemas/BashApproval"},{"$ref":"#/components/schemas/EntityRlsGuardApproval"},{"$ref":"#/components/schemas/ExecToolEntityMutationApproval"},{"$ref":"#/components/schemas/ExecToolGithubRepoWriteApproval"},{"$ref":"#/components/schemas/ExecToolInviteUserApproval"},{"$ref":"#/components/schemas/ExecToolSendEmailApproval"},{"$ref":"#/components/schemas/ExecToolSendSmsApproval"},{"$ref":"#/components/schemas/OtherApproval"}]},{"type":"null"}],"default":null,"description":"Why the call waits for approval, from the check that paused it. Present only while `status` is `waiting_for_user_input`.","title":"Approval"},"display":{"anyOf":[{"$ref":"#/components/schemas/FileDisplay"},{"type":"null"}],"default":null,"description":"What the tool touched, for showing its progress. Never file contents or commands."}},"required":["name"],"title":"WriteRepoFileCall","type":"object"}}}}