{"openapi":"3.0.0","paths":{"/healthz":{"get":{"operationId":"HealthController_health","parameters":[],"responses":{"200":{"description":""}},"tags":["Health"]}},"/v1/workspaces/{ws}/audit-logs":{"get":{"operationId":"AuditController_list","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"action","required":false,"in":"query","schema":{"type":"string"}},{"name":"actorId","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["audit"]}},"/v1/auth/signup":{"post":{"operationId":"AuthController_signup","parameters":[{"name":"accept-language","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupDto"}}}},"responses":{"201":{"description":""}},"tags":["auth"]}},"/v1/auth/login":{"post":{"operationId":"AuthController_login","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginDto"}}}},"responses":{"200":{"description":""}},"tags":["auth"]}},"/v1/auth/google":{"post":{"operationId":"AuthController_google","parameters":[{"name":"accept-language","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleLoginDto"}}}},"responses":{"200":{"description":""}},"tags":["auth"]}},"/v1/auth/totp/verify":{"post":{"operationId":"AuthController_verifyTotpLogin","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TotpLoginDto"}}}},"responses":{"200":{"description":""}},"tags":["auth"]}},"/v1/auth/totp/setup":{"post":{"operationId":"AuthController_setupTotp","parameters":[],"responses":{"201":{"description":""}},"tags":["auth"]}},"/v1/auth/totp/enable":{"post":{"operationId":"AuthController_enableTotp","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TotpCodeDto"}}}},"responses":{"204":{"description":""}},"tags":["auth"]}},"/v1/auth/totp/disable":{"post":{"operationId":"AuthController_disableTotp","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TotpCodeDto"}}}},"responses":{"204":{"description":""}},"tags":["auth"]}},"/v1/auth/refresh":{"post":{"operationId":"AuthController_refresh","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshDto"}}}},"responses":{"200":{"description":""}},"tags":["auth"]}},"/v1/auth/logout":{"post":{"operationId":"AuthController_logout","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshDto"}}}},"responses":{"204":{"description":""}},"tags":["auth"]}},"/v1/me":{"get":{"operationId":"AuthController_me","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]},"patch":{"operationId":"AuthController_updateMe","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMeDto"}}}},"responses":{"200":{"description":""}},"tags":["auth"]}},"/v1/me/change-password/request-code":{"post":{"operationId":"AuthController_requestPasswordChangeCode","parameters":[],"responses":{"204":{"description":""}},"tags":["auth"]}},"/v1/me/change-password":{"post":{"operationId":"AuthController_changePassword","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordDto"}}}},"responses":{"204":{"description":""}},"tags":["auth"]}},"/v1/auth/verify-email":{"post":{"operationId":"AuthController_verifyEmail","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailDto"}}}},"responses":{"200":{"description":""}},"tags":["auth"]}},"/v1/auth/resend-verification":{"post":{"operationId":"AuthController_resendVerification","parameters":[],"responses":{"204":{"description":""}},"tags":["auth"]}},"/v1/auth/resend-verification-email":{"post":{"operationId":"AuthController_resendVerificationByEmail","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendVerificationDto"}}}},"responses":{"204":{"description":""}},"tags":["auth"]}},"/v1/auth/request-password-reset":{"post":{"operationId":"AuthController_requestPasswordReset","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestPasswordResetDto"}}}},"responses":{"204":{"description":""}},"tags":["auth"]}},"/v1/auth/reset-password":{"post":{"operationId":"AuthController_resetPassword","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordDto"}}}},"responses":{"200":{"description":""}},"tags":["auth"]}},"/v1/auth/find-id":{"post":{"operationId":"AuthController_findId","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindIdDto"}}}},"responses":{"200":{"description":""}},"tags":["auth"]}},"/v1/workspaces":{"post":{"operationId":"WorkspacesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWorkspaceDto"}}}},"responses":{"201":{"description":""}},"tags":["workspaces"]},"get":{"operationId":"WorkspacesController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["workspaces"]}},"/v1/workspaces/{ws}":{"get":{"operationId":"WorkspacesController_get","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["workspaces"]},"patch":{"operationId":"WorkspacesController_update","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWorkspaceDto"}}}},"responses":{"200":{"description":""}},"tags":["workspaces"]},"delete":{"operationId":"WorkspacesController_remove","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteWorkspaceDto"}}}},"responses":{"204":{"description":""}},"tags":["workspaces"]}},"/v1/workspaces/{ws}/members":{"get":{"operationId":"WorkspacesController_members","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["workspaces"]}},"/v1/workspaces/{ws}/members/{userId}":{"patch":{"operationId":"WorkspacesController_updateMember","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMemberDto"}}}},"responses":{"200":{"description":""}},"tags":["workspaces"]},"delete":{"operationId":"WorkspacesController_removeMember","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["workspaces"]}},"/v1/workspaces/{ws}/invitations":{"post":{"operationId":"WorkspacesController_invite","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInvitationDto"}}}},"responses":{"201":{"description":""}},"tags":["workspaces"]},"get":{"operationId":"WorkspacesController_invitations","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["workspaces"]}},"/v1/workspaces/{ws}/invitations/{id}":{"delete":{"operationId":"WorkspacesController_revokeInvitation","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["workspaces"]}},"/v1/invitations/{token}":{"get":{"operationId":"WorkspacesController_invitationInfo","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["workspaces"]}},"/v1/invitations/{token}/accept":{"post":{"operationId":"WorkspacesController_accept","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["workspaces"]}},"/v1/workspaces/{ws}/groups":{"post":{"operationId":"WorkspacesController_createGroup","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGroupDto"}}}},"responses":{"201":{"description":""}},"tags":["workspaces"]},"get":{"operationId":"WorkspacesController_groups","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["workspaces"]}},"/v1/workspaces/{ws}/groups/{groupId}":{"patch":{"operationId":"WorkspacesController_updateGroup","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"groupId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGroupDto"}}}},"responses":{"200":{"description":""}},"tags":["workspaces"]},"delete":{"operationId":"WorkspacesController_deleteGroup","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"groupId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["workspaces"]}},"/v1/workspaces/{ws}/groups/{groupId}/members":{"post":{"operationId":"WorkspacesController_addGroupMember","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"groupId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupMemberDto"}}}},"responses":{"201":{"description":""}},"tags":["workspaces"]}},"/v1/workspaces/{ws}/groups/{groupId}/members/{userId}":{"delete":{"operationId":"WorkspacesController_removeGroupMember","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"groupId","required":true,"in":"path","schema":{"type":"string"}},{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["workspaces"]}},"/v1/workspaces/{ws}/api-keys":{"post":{"operationId":"ApiKeysController_create","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyDto"}}}},"responses":{"201":{"description":""}},"tags":["api-keys"]},"get":{"operationId":"ApiKeysController_list","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["api-keys"]}},"/v1/workspaces/{ws}/api-keys/{id}":{"delete":{"operationId":"ApiKeysController_revoke","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["api-keys"]}},"/v1/me/api-keys":{"post":{"operationId":"ApiKeysController_createAccountKey","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyDto"}}}},"responses":{"201":{"description":""}},"tags":["api-keys"]},"get":{"operationId":"ApiKeysController_listAccountKeys","parameters":[],"responses":{"200":{"description":""}},"tags":["api-keys"]}},"/v1/me/api-keys/{id}":{"delete":{"operationId":"ApiKeysController_revokeAccountKey","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["api-keys"]}},"/v1/nodes/{id}/permissions":{"get":{"operationId":"PermissionsController_list","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["permissions"]},"post":{"operationId":"PermissionsController_set","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetPermissionDto"}}}},"responses":{"201":{"description":""}},"tags":["permissions"]},"delete":{"operationId":"PermissionsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemovePermissionDto"}}}},"responses":{"204":{"description":""}},"tags":["permissions"]}},"/v1/nodes/{id}/visibility":{"post":{"operationId":"PermissionsController_setVisibility","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetVisibilityDto"}}}},"responses":{"201":{"description":""}},"tags":["permissions"]}},"/v1/nodes/{id}/restrict":{"post":{"operationId":"PermissionsController_setRestricted","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetRestrictedDto"}}}},"responses":{"201":{"description":""}},"tags":["permissions"]}},"/v1/nodes/{id}/share-links":{"post":{"operationId":"PermissionsController_createShareLink","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateShareLinkDto"}}}},"responses":{"201":{"description":""}},"tags":["permissions"]},"get":{"operationId":"PermissionsController_listShareLinks","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["permissions"]}},"/v1/share-links/{linkId}":{"delete":{"operationId":"PermissionsController_revokeShareLink","parameters":[{"name":"linkId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["permissions"]}},"/v1/shared/{token}":{"get":{"operationId":"PermissionsController_shared","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["permissions"]}},"/v1/nodes/{id}/embed":{"get":{"operationId":"EmbedsController_preview","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["embeds"]}},"/v1/embeds":{"get":{"operationId":"EmbedsController_previews","parameters":[{"name":"ids","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["embeds"]}},"/v1/databases/{id}/stream":{"get":{"operationId":"DatabasesController_stream","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["databases"]}},"/v1/workspaces/{ws}/databases":{"post":{"operationId":"DatabasesController_create","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDatabaseDto"}}}},"responses":{"201":{"description":""}},"tags":["databases"]}},"/v1/databases/{id}":{"get":{"operationId":"DatabasesController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["databases"]},"patch":{"operationId":"DatabasesController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchDatabaseDto"}}}},"responses":{"200":{"description":""}},"tags":["databases"]}},"/v1/databases/{id}/views/{viewId}":{"patch":{"description":"Appends a column without resending the schema. Existing rows keep their values.","operationId":"DatabasesController_patchView","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"viewId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchViewDto"}}}},"responses":{"201":{"description":"The created column, including its generated id."}},"summary":"Add one column","tags":["databases"]},"delete":{"operationId":"DatabasesController_removeView","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"viewId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["databases"]}},"/v1/databases/{id}/views":{"post":{"operationId":"DatabasesController_addView","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddViewDto"}}}},"responses":{"201":{"description":""}},"tags":["databases"]}},"/v1/databases/{id}/columns":{"post":{"operationId":"DatabasesController_addColumn","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddColumnDto"}}}},"responses":{"201":{"description":""}},"tags":["databases"]}},"/v1/databases/{id}/columns/{propertyId}":{"patch":{"description":"The column type is immutable — changing it would rewrite every row.","operationId":"DatabasesController_patchColumn","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"propertyId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchColumnDto"}}}},"responses":{"200":{"description":""}},"summary":"Rename a column / set its options","tags":["databases"]},"delete":{"description":"Row values stored under it are left in place, so re-adding a column with the same id restores them.","operationId":"DatabasesController_deleteColumn","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"propertyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Delete a column","tags":["databases"]}},"/v1/databases/{id}/export":{"get":{"description":"Typed columns, one sheet.","operationId":"DatabasesController_exportXlsx","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Export as XLSX","tags":["databases"]}},"/v1/databases/{id}/permissions":{"get":{"operationId":"DatabasesController_getPermissions","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["databases"]},"patch":{"operationId":"DatabasesController_setPermissions","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabasePermissionsDto"}}}},"responses":{"200":{"description":""}},"tags":["databases"]}},"/v1/databases/{id}/notifications":{"get":{"operationId":"DatabasesController_getWatchers","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["databases"]},"put":{"operationId":"DatabasesController_setWatchers","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseWatchersDto"}}}},"responses":{"200":{"description":""}},"tags":["databases"]}},"/v1/databases/{id}/rows":{"get":{"description":"Returns all rows of the database in position order.","operationId":"DatabasesController_rows","parameters":[{"name":"id","required":true,"in":"path","description":"Database node id.","schema":{"type":"string"}},{"name":"body","required":true,"in":"query","schema":{"type":"string"}},{"name":"backlinks","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"The database rows."},"404":{"description":"Database not found or not visible."}},"summary":"List database rows","tags":["databases"]},"post":{"description":"Appends a row (or inserts at `position`). Values are validated against the database properties.","operationId":"DatabasesController_createRow","parameters":[{"name":"id","required":true,"in":"path","description":"Database node id.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRowDto"}}}},"responses":{"201":{"description":"The created row."},"404":{"description":"Database not found or not visible."}},"summary":"Create a database row","tags":["databases"]},"patch":{"description":"Merge-patches the same `values` onto every row in `rowIds`. All-or-nothing: if any row is locked, belongs to someone else, or is not in this database, nothing changes.","operationId":"DatabasesController_updateRowsBulk","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkPatchRowsDto"}}}},"responses":{"200":{"description":""}},"summary":"Update many rows at once","tags":["databases"]}},"/v1/databases/{id}/rows/each":{"patch":{"description":"Applies a different `values` patch to each row. All-or-nothing.","operationId":"DatabasesController_updateRowsEach","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkPatchRowsEachDto"}}}},"responses":{"200":{"description":""}},"summary":"Update many rows, each with its own values","tags":["databases"]}},"/v1/databases/{id}/rows/{rowId}":{"patch":{"description":"Merge-patches a row: only the passed `values` keys change, `null` deletes a key.","operationId":"DatabasesController_updateRowByDatabase","parameters":[{"name":"id","required":true,"in":"path","description":"Database node id.","schema":{"type":"string"}},{"name":"rowId","required":true,"in":"path","description":"Row id (must belong to the database).","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchRowDto"}}}},"responses":{"200":{"description":"The updated row."},"404":{"description":"Database or row not found."}},"summary":"Update a database row","tags":["databases"]},"delete":{"description":"Deletes the row; its linked page (if any) is moved to the trash.","operationId":"DatabasesController_deleteRowByDatabase","parameters":[{"name":"id","required":true,"in":"path","description":"Database node id.","schema":{"type":"string"}},{"name":"rowId","required":true,"in":"path","description":"Row id (must belong to the database).","schema":{"type":"string"}}],"responses":{"204":{"description":"The row was deleted."},"404":{"description":"Database or row not found."}},"summary":"Delete a database row","tags":["databases"]}},"/v1/database-rows/{rowId}/page":{"delete":{"description":"Unlinks the row from its page. The page itself is NOT deleted — it stays where it is.","operationId":"DatabasesController_unlinkRowPage","parameters":[{"name":"rowId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Detach a row's page","tags":["databases"]},"post":{"operationId":"DatabasesController_createRowPage","parameters":[{"name":"rowId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRowPageDto"}}}},"responses":{"201":{"description":""}},"tags":["databases"]}},"/v1/databases/{id}/rows/bulk":{"post":{"description":"Creates every row in `rows`. All-or-nothing: if any row fails validation, nothing is created. Column keys may be property ids or names.","operationId":"DatabasesController_createRowsBulk","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkCreateRowsDto"}}}},"responses":{"201":{"description":""}},"summary":"Add many rows at once","tags":["databases"]}},"/v1/databases/{id}/rows/bulk-delete":{"post":{"description":"Deletes every row in `rowIds`. All-or-nothing: if any row is locked, signed, belongs to someone else, or is not in this database, nothing is deleted.","operationId":"DatabasesController_deleteRowsBulk","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkRowIdsDto"}}}},"responses":{"201":{"description":""}},"summary":"Delete many rows at once","tags":["databases"]}},"/v1/database-rows/{rowId}":{"patch":{"operationId":"DatabasesController_updateRow","parameters":[{"name":"rowId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchRowDto"}}}},"responses":{"200":{"description":""}},"tags":["databases"]},"delete":{"operationId":"DatabasesController_deleteRow","parameters":[{"name":"rowId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["databases"]}},"/v1/workspaces/{ws}/nodes":{"post":{"operationId":"TreeController_create","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateNodeDto"}}}},"responses":{"201":{"description":""}},"tags":["tree"]}},"/v1/workspaces/{ws}/tree":{"get":{"operationId":"TreeController_list","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"rootId","required":false,"in":"query","schema":{"type":"string"}},{"name":"depth","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["tree"]}},"/v1/workspaces/{ws}/tags":{"get":{"operationId":"TreeController_tags","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["tree"]}},"/v1/workspaces/{ws}/nodes/by-path":{"get":{"operationId":"TreeController_byPath","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"path","required":true,"in":"query","schema":{"minLength":1,"type":"string"}}],"responses":{"200":{"description":""}},"tags":["tree"]}},"/v1/workspaces/{ws}/trash":{"get":{"operationId":"TreeController_trash","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["tree"]}},"/v1/nodes/{id}":{"patch":{"operationId":"TreeController_rename","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenameNodeDto"}}}},"responses":{"200":{"description":""}},"tags":["tree"]},"delete":{"operationId":"TreeController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["tree"]}},"/v1/nodes/{id}/convert-type":{"post":{"operationId":"TreeController_convertType","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConvertNodeTypeDto"}}}},"responses":{"201":{"description":""}},"tags":["tree"]}},"/v1/nodes/{id}/move":{"post":{"operationId":"TreeController_move","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveNodeDto"}}}},"responses":{"201":{"description":""}},"tags":["tree"]}},"/v1/nodes/{id}/reorder":{"post":{"operationId":"TreeController_reorder","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderNodeDto"}}}},"responses":{"201":{"description":""}},"tags":["tree"]}},"/v1/nodes/{id}/restore":{"post":{"operationId":"TreeController_restore","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["tree"]}},"/v1/nodes/{id}/purge":{"delete":{"operationId":"TreeController_purge","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["tree"]}},"/v1/nodes/{id}/duplicate":{"post":{"operationId":"TreeController_duplicate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateNodeDto"}}}},"responses":{"201":{"description":""}},"tags":["tree"]}},"/v1/documents/{id}":{"get":{"operationId":"DocumentsController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["documents"]},"put":{"operationId":"DocumentsController_put","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"if-match","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutDocumentDto"}},"text/markdown":{"schema":{"$ref":"#/components/schemas/PutDocumentDto"}}}},"responses":{"200":{"description":""}},"tags":["documents"]},"patch":{"operationId":"DocumentsController_patch","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"if-match","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchDocumentDto"}}}},"responses":{"200":{"description":""}},"tags":["documents"]}},"/v1/documents/{id}/append":{"post":{"operationId":"DocumentsController_append","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppendDocumentDto"}}}},"responses":{"200":{"description":""}},"tags":["documents"]}},"/v1/documents/{id}/versions":{"get":{"operationId":"DocumentsController_versions","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["documents"]}},"/v1/documents/{id}/versions/{vid}":{"get":{"operationId":"DocumentsController_version","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"vid","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["documents"]}},"/v1/documents/{id}/versions/{from}/diff/{to}":{"get":{"operationId":"DocumentsController_diff","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"from","required":true,"in":"path","schema":{"type":"string"}},{"name":"to","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["documents"]}},"/v1/documents/{id}/versions/{vid}/restore":{"post":{"operationId":"DocumentsController_restore","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"vid","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["documents"]}},"/v1/workspaces/{ws}/import":{"post":{"operationId":"DocumentsController_importZip","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"rootPath","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["documents"]}},"/v1/workspaces/{ws}/import/notion":{"post":{"operationId":"DocumentsController_importNotion","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"rootPath","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["documents"]}},"/v1/workspaces/{ws}/import/notion-api":{"post":{"operationId":"DocumentsController_importNotionApi","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotionApiImportDto"}}}},"responses":{"201":{"description":""}},"tags":["documents"]}},"/v1/workspaces/{ws}/import/confluence":{"post":{"operationId":"DocumentsController_importConfluence","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfluenceImportDto"}}}},"responses":{"201":{"description":""}},"tags":["documents"]}},"/v1/workspaces/{ws}/import/jobs/{jobId}/cancel":{"post":{"operationId":"DocumentsController_cancelImportJob","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"jobId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["documents"]}},"/v1/workspaces/{ws}/import/jobs/{jobId}":{"get":{"operationId":"DocumentsController_importJob","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"jobId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["documents"]}},"/v1/workspaces/{ws}/export":{"get":{"operationId":"DocumentsController_exportZip","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"rootId","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["documents"]}},"/v1/workspaces/{ws}/search":{"get":{"operationId":"DocumentsController_search","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"q","required":true,"in":"query","schema":{"minLength":1,"maxLength":200,"type":"string"}},{"name":"in","required":false,"in":"query","schema":{"type":"string","enum":["title","content","all"]}}],"responses":{"200":{"description":""}},"tags":["documents"]}},"/v1/attachments/presign":{"post":{"operationId":"AttachmentsController_presign","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresignDto"}}}},"responses":{"201":{"description":""}},"tags":["attachments"]}},"/v1/attachments/{id}/complete":{"post":{"operationId":"AttachmentsController_complete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["attachments"]}},"/v1/attachments/upload":{"post":{"operationId":"AttachmentsController_upload","parameters":[{"name":"filename","required":true,"in":"query","schema":{"maxLength":255,"type":"string"}},{"name":"mimeType","required":true,"in":"query","schema":{"maxLength":120,"type":"string"}},{"name":"workspaceId","required":true,"in":"query","schema":{"type":"string"}},{"name":"nodeId","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["attachments"]}},"/v1/attachments/{id}":{"get":{"operationId":"AttachmentsController_download","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["attachments"]},"delete":{"operationId":"AttachmentsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["attachments"]}},"/v1/attachments/{id}/raw":{"get":{"operationId":"AttachmentsController_raw","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["attachments"]}},"/v1/workspaces/{ws}/lineage":{"post":{"operationId":"LineageController_add","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddEdgeDto"}}}},"responses":{"201":{"description":""}},"tags":["lineage"]},"get":{"operationId":"LineageController_trace","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"kind","required":true,"in":"query","schema":{"type":"string","enum":["node","row","logentry"]}},{"name":"id","required":true,"in":"query","schema":{"type":"string"}},{"name":"direction","required":false,"in":"query","schema":{"type":"string","enum":["upstream","downstream","both"]}},{"name":"depth","required":false,"in":"query","schema":{"minimum":1,"maximum":20,"type":"number"}}],"responses":{"200":{"description":""}},"tags":["lineage"]}},"/v1/workspaces/{ws}/lineage/edges":{"get":{"operationId":"LineageController_edges","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"kind","required":true,"in":"query","schema":{"type":"string","enum":["node","row","logentry"]}},{"name":"id","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["lineage"]}},"/v1/workspaces/{ws}/lineage/{id}":{"delete":{"operationId":"LineageController_remove","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["lineage"]}},"/v1/workspaces/{ws}/spreadsheets":{"get":{"operationId":"SpreadsheetsController_list","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["spreadsheets"]},"post":{"operationId":"SpreadsheetsController_create","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSpreadsheetDto"}}}},"responses":{"201":{"description":""}},"tags":["spreadsheets"]}},"/v1/spreadsheets/{id}":{"get":{"operationId":"SpreadsheetsController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["spreadsheets"]},"patch":{"operationId":"SpreadsheetsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchSpreadsheetDto"}}}},"responses":{"200":{"description":""}},"tags":["spreadsheets"]}},"/v1/spreadsheets/{id}/sheets":{"post":{"operationId":"SpreadsheetsController_createSheet","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSheetDto"}}}},"responses":{"201":{"description":""}},"tags":["spreadsheets"]}},"/v1/spreadsheets/{id}/sheets/{sheetId}":{"patch":{"operationId":"SpreadsheetsController_patchSheet","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"sheetId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchSheetDto"}}}},"responses":{"200":{"description":""}},"tags":["spreadsheets"]},"delete":{"operationId":"SpreadsheetsController_deleteSheet","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"sheetId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["spreadsheets"]}},"/v1/spreadsheets/{id}/sheets/{sheetId}/cells":{"patch":{"operationId":"SpreadsheetsController_patchCells","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"sheetId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchCellsDto"}}}},"responses":{"200":{"description":""}},"tags":["spreadsheets"]}},"/v1/spreadsheets/{id}/export":{"get":{"operationId":"SpreadsheetsController_export","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"format","required":false,"in":"query","schema":{"type":"string","enum":["csv","xlsx"]}},{"name":"sheetId","required":false,"in":"query","description":"csv: which sheet to export (defaults to the first). xlsx: limit to one sheet (defaults to all).","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["spreadsheets"]}},"/v1/spreadsheets/{id}/import":{"post":{"operationId":"SpreadsheetsController_import","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportSpreadsheetDto"}}}},"responses":{"201":{"description":""}},"tags":["spreadsheets"]}},"/v1/nodes/{id}/view-config":{"get":{"operationId":"NodeViewController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["nodes"]},"patch":{"operationId":"NodeViewController_patch","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchNodeViewDto"}}}},"responses":{"200":{"description":""}},"tags":["nodes"]}},"/v1/nodes/{id}/read-requirement":{"get":{"operationId":"ReadAckController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["nodes"]},"put":{"operationId":"ReadAckController_put","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutReadRequirementDto"}}}},"responses":{"200":{"description":""}},"tags":["nodes"]},"delete":{"operationId":"ReadAckController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["nodes"]}},"/v1/nodes/{id}/read":{"post":{"operationId":"ReadAckController_markRead","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["nodes"]}},"/v1/nodes/{id}/read-ack":{"post":{"operationId":"ReadAckController_acknowledge","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["nodes"]}},"/v1/workspaces/{ws}/logs":{"post":{"operationId":"LogsController_create","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLogDto"}}}},"responses":{"201":{"description":""}},"tags":["logs"]}},"/v1/logs/{id}":{"get":{"operationId":"LogsController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["logs"]},"patch":{"operationId":"LogsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchLogDto"}}}},"responses":{"200":{"description":""}},"tags":["logs"]}},"/v1/logs/{id}/entries":{"post":{"operationId":"LogsController_ingest","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppendEntriesDto"}}}},"responses":{"201":{"description":""}},"tags":["logs"]},"get":{"operationId":"LogsController_entries","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"from","required":false,"in":"query","schema":{"type":"string"}},{"name":"to","required":false,"in":"query","schema":{"type":"string"}},{"name":"source","required":false,"in":"query","schema":{"type":"string"}},{"name":"level","required":false,"in":"query","schema":{"type":"string"}},{"name":"anomalyOnly","required":false,"in":"query","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":1000,"type":"number"}},{"name":"order","required":false,"in":"query","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":""}},"tags":["logs"]},"delete":{"operationId":"LogsController_wipe","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["logs"]}},"/v1/logs/{id}/import":{"post":{"operationId":"LogsController_importLogs","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportLogCsvDto"}}}},"responses":{"201":{"description":""}},"tags":["logs"]}},"/v1/logs/{id}/export":{"get":{"operationId":"LogsController_exportXlsx","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["logs"]}},"/v1/logs/{id}/stats":{"get":{"operationId":"LogsController_stats","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"from","required":false,"in":"query","schema":{"type":"string"}},{"name":"to","required":false,"in":"query","schema":{"type":"string"}},{"name":"groupBy","required":false,"in":"query","schema":{"type":"string","enum":["hour","day","source","level"]}},{"name":"field","required":false,"in":"query","schema":{"type":"string"}},{"name":"metric","required":false,"in":"query","schema":{"type":"string","enum":["count","avg","max","min","sum"]}}],"responses":{"200":{"description":""}},"tags":["logs"]}},"/v1/workspaces/{ws}/rca-reports":{"get":{"operationId":"RcaController_list","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"storeId","required":false,"in":"query","description":"Restrict to reports for one LOG store node id.","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["rca"]}},"/v1/workspaces/{ws}/rca-reports/{id}":{"get":{"operationId":"RcaController_get","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["rca"]}},"/v1/workspaces/{ws}/templates":{"get":{"operationId":"TemplatesController_list","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["templates"]},"post":{"operationId":"TemplatesController_create","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTemplateDto"}}}},"responses":{"201":{"description":""}},"tags":["templates"]}},"/v1/workspaces/{ws}/templates/{id}":{"patch":{"operationId":"TemplatesController_update","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTemplateDto"}}}},"responses":{"200":{"description":""}},"tags":["templates"]},"delete":{"operationId":"TemplatesController_remove","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["templates"]}},"/v1/workspaces/{ws}/templates/{id}/apply":{"post":{"operationId":"TemplatesController_apply","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyTemplateDto"}}}},"responses":{"201":{"description":""}},"tags":["templates"]}},"/v1/workspaces/{ws}/templates/from-node/{nodeId}":{"post":{"operationId":"TemplatesController_saveFromNode","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"nodeId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveFromNodeDto"}}}},"responses":{"201":{"description":""}},"tags":["templates"]}},"/v1/documents/{id}/comments":{"post":{"operationId":"CommentsController_create","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCommentDto"}}}},"responses":{"201":{"description":""}},"tags":["comments"]},"get":{"operationId":"CommentsController_list","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"blockId","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["comments"]}},"/v1/comments/{commentId}":{"patch":{"operationId":"CommentsController_update","parameters":[{"name":"commentId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCommentDto"}}}},"responses":{"200":{"description":""}},"tags":["comments"]},"delete":{"operationId":"CommentsController_remove","parameters":[{"name":"commentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["comments"]}},"/v1/notifications":{"get":{"operationId":"NotificationsController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["notifications"]}},"/v1/notifications/{id}/read":{"post":{"operationId":"NotificationsController_read","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["notifications"]}},"/v1/notifications/{id}":{"delete":{"operationId":"NotificationsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["notifications"]}},"/v1/notifications/read":{"delete":{"operationId":"NotificationsController_clearRead","parameters":[],"responses":{"204":{"description":""}},"tags":["notifications"]}},"/v1/notifications/read-all":{"post":{"operationId":"NotificationsController_readAll","parameters":[],"responses":{"204":{"description":""}},"tags":["notifications"]}},"/v1/workspaces/{ws}/issue-trackers":{"post":{"operationId":"IssuesController_create","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateIssueTrackerDto"}}}},"responses":{"201":{"description":""}},"tags":["issues"]}},"/v1/issue-trackers/{id}":{"get":{"operationId":"IssuesController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["issues"]},"patch":{"operationId":"IssuesController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchIssueTrackerDto"}}}},"responses":{"200":{"description":""}},"tags":["issues"]}},"/v1/issue-trackers/{id}/stream":{"get":{"operationId":"IssuesController_stream","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["issues"]}},"/v1/issue-trackers/{id}/export":{"get":{"operationId":"IssuesController_exportXlsx","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["issues"]}},"/v1/issue-trackers/{id}/issues":{"get":{"description":"Filter by state (default OPEN; ALL for both), label id, assignee, or a title/#number query.","operationId":"IssuesController_list","parameters":[{"name":"id","required":true,"in":"path","description":"Issue tracker node id.","schema":{"type":"string"}},{"name":"state","required":false,"in":"query","schema":{"type":"string","enum":["OPEN","CLOSED","ALL"]}},{"name":"label","required":false,"in":"query","description":"Label id filter.","schema":{"type":"string"}},{"name":"assigneeId","required":false,"in":"query","schema":{"type":"string"}},{"name":"q","required":false,"in":"query","description":"Title substring / #number search.","schema":{"maxLength":200,"type":"string"}},{"name":"type","required":false,"in":"query","description":"Issue type id filter (ISSUE-P1).","schema":{"type":"string"}},{"name":"parentId","required":false,"in":"query","description":"Sub-issues of this parent only.","schema":{"type":"string"}}],"responses":{"200":{"description":"The issues, newest number first."}},"summary":"List issues","tags":["issues"]},"post":{"description":"Opens a new issue with the next #number on the tracker.","operationId":"IssuesController_createIssue","parameters":[{"name":"id","required":true,"in":"path","description":"Issue tracker node id.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateIssueDto"}}}},"responses":{"201":{"description":"The created issue."}},"summary":"Create an issue","tags":["issues"]}},"/v1/issues/{issueId}":{"get":{"operationId":"IssuesController_getIssue","parameters":[{"name":"issueId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["issues"]},"patch":{"operationId":"IssuesController_updateIssue","parameters":[{"name":"issueId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchIssueDto"}}}},"responses":{"200":{"description":""}},"tags":["issues"]},"delete":{"operationId":"IssuesController_deleteIssue","parameters":[{"name":"issueId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["issues"]}},"/v1/issues/{issueId}/activities":{"get":{"operationId":"IssuesController_activities","parameters":[{"name":"issueId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["issues"]}},"/v1/issue-trackers/{id}/inbound":{"post":{"operationId":"IssuesController_enableInbound","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["issues"]},"get":{"operationId":"IssuesController_getInbound","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["issues"]},"delete":{"operationId":"IssuesController_disableInbound","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["issues"]}},"/v1/public/issue-hooks/{token}":{"post":{"operationId":"IssuesController_inbound","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["issues"]}},"/v1/workspaces/{ws}/webhooks":{"post":{"operationId":"WebhooksController_create","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookDto"}}}},"responses":{"201":{"description":""}},"tags":["webhooks"]},"get":{"operationId":"WebhooksController_list","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["webhooks"]}},"/v1/workspaces/{ws}/webhooks/{id}":{"patch":{"operationId":"WebhooksController_update","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookDto"}}}},"responses":{"200":{"description":""}},"tags":["webhooks"]},"delete":{"operationId":"WebhooksController_remove","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["webhooks"]}},"/v1/workspaces/{ws}/webhooks/{id}/deliveries":{"get":{"operationId":"WebhooksController_deliveries","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["webhooks"]}},"/v1/workspaces/{ws}/webhooks/{id}/deliveries/{deliveryId}/redeliver":{"post":{"operationId":"WebhooksController_redeliver","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"deliveryId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["webhooks"]}},"/v1/documents/{id}/extraction":{"get":{"operationId":"ExtractionController_status","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["extraction"]}},"/v1/documents/{id}/extraction/rerun":{"post":{"operationId":"ExtractionController_rerun","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["extraction"]}},"/v1/workspaces/{ws}/graph-sync":{"post":{"operationId":"ExtractionController_setWorkspaceGraphSync","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphSyncDto"}}}},"responses":{"201":{"description":""}},"tags":["extraction"]}},"/v1/nodes/{id}/graph-sync":{"post":{"operationId":"ExtractionController_setNodeGraphSync","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphSyncDto"}}}},"responses":{"201":{"description":""}},"tags":["extraction"]}},"/v1/workspaces/{ws}/graph-status":{"get":{"operationId":"ExtractionController_graphStatus","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["extraction"]}},"/v1/workspaces/{ws}/extraction/history":{"get":{"operationId":"ExtractionController_syncHistory","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["extraction"]}},"/v1/workspaces/{ws}/extraction/rebuild":{"post":{"operationId":"ExtractionController_rebuild","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["extraction"]}},"/v1/workspaces/{ws}/extraction/progress":{"get":{"operationId":"ExtractionController_progress","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["extraction"]}},"/v1/workspaces/{ws}/schema":{"get":{"operationId":"ExtractionController_schema","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["extraction"]},"post":{"operationId":"ExtractionController_addType","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSchemaTypeDto"}}}},"responses":{"201":{"description":""}},"tags":["extraction"]}},"/v1/workspaces/{ws}/schema/{typeId}":{"put":{"operationId":"ExtractionController_review","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"typeId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewSchemaTypeDto"}}}},"responses":{"200":{"description":""}},"tags":["extraction"]},"delete":{"operationId":"ExtractionController_removeType","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"typeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["extraction"]}},"/v1/workspaces/{ws}/ask/threads":{"post":{"operationId":"AskController_createThread","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateThreadDto"}}}},"responses":{"201":{"description":""}},"tags":["ask"]},"get":{"operationId":"AskController_listThreads","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["ask"]}},"/v1/workspaces/{ws}/ask/threads/{id}":{"get":{"operationId":"AskController_getThread","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["ask"]},"delete":{"operationId":"AskController_deleteThread","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["ask"]}},"/v1/workspaces/{ws}/ask/threads/{threadId}/messages":{"post":{"operationId":"AskController_postMessage","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"threadId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostMessageDto"}}}},"responses":{"201":{"description":""}},"tags":["ask"]}},"/v1/workspaces/{ws}/chat/threads":{"post":{"operationId":"ChatController_createThread","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["chat"]},"get":{"operationId":"ChatController_listThreads","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["chat"]}},"/v1/workspaces/{ws}/chat/threads/{id}":{"get":{"operationId":"ChatController_getThread","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["chat"]},"delete":{"operationId":"ChatController_deleteThread","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["chat"]}},"/v1/workspaces/{ws}/chat/threads/{id}/messages":{"post":{"operationId":"ChatController_postMessage","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostChatMessageDto"}}}},"responses":{"201":{"description":""}},"tags":["chat"]}},"/v1/workspaces/{ws}/whiteboards":{"post":{"operationId":"WhiteboardsController_create","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWhiteboardDto"}}}},"responses":{"201":{"description":""}},"tags":["whiteboards"]}},"/v1/whiteboards/{id}/recognize":{"post":{"operationId":"WhiteboardsController_recognize","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["whiteboards"]}},"/v1/whiteboards/{id}/apply":{"post":{"operationId":"WhiteboardsController_applyRecognition","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["whiteboards"]}},"/v1/workspaces/{ws}/whiteboard-library":{"get":{"operationId":"WhiteboardsController_getLibrary","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["whiteboards"]},"put":{"operationId":"WhiteboardsController_setLibrary","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["whiteboards"]}},"/v1/whiteboards/{id}":{"get":{"operationId":"WhiteboardsController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["whiteboards"]},"patch":{"operationId":"WhiteboardsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchWhiteboardDto"}}}},"responses":{"200":{"description":""}},"tags":["whiteboards"]}},"/v1/workspaces/{ws}/forms":{"post":{"operationId":"FormsController_create","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFormDto"}}}},"responses":{"201":{"description":""}},"tags":["forms"]}},"/v1/forms/{id}":{"get":{"operationId":"FormsController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["forms"]},"patch":{"operationId":"FormsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchFormDto"}}}},"responses":{"200":{"description":""}},"tags":["forms"]}},"/v1/forms/{id}/permissions":{"get":{"operationId":"FormsController_getPermissions","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["forms"]},"put":{"operationId":"FormsController_setPermissions","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["forms"]}},"/v1/forms/{id}/responses":{"get":{"operationId":"FormsController_responses","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"latestPerRespondent","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["forms"]},"post":{"operationId":"FormsController_createResponse","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFormResponseDto"}}}},"responses":{"201":{"description":""}},"tags":["forms"]}},"/v1/forms/{id}/responses/{responseId}":{"patch":{"operationId":"FormsController_updateResponse","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"responseId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFormResponseDto"}}}},"responses":{"200":{"description":""}},"tags":["forms"]},"delete":{"operationId":"FormsController_deleteResponse","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"responseId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["forms"]}},"/v1/form-responses/{responseId}":{"patch":{"operationId":"FormsController_updateResponseById","parameters":[{"name":"responseId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFormResponseDto"}}}},"responses":{"200":{"description":""}},"tags":["forms"]},"delete":{"operationId":"FormsController_deleteResponseById","parameters":[{"name":"responseId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["forms"]}},"/v1/forms/{id}/export":{"get":{"operationId":"FormsController_exportXlsx","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["forms"]}},"/v1/forms/{id}/collect":{"post":{"operationId":"FormsController_createCollector","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCollectorDto"}}}},"responses":{"201":{"description":""}},"tags":["forms"]}},"/v1/forms/{id}/share":{"post":{"operationId":"FormsController_issueShare","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["forms"]},"get":{"operationId":"FormsController_listShare","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["forms"]}},"/v1/form-share-links/{linkId}":{"delete":{"operationId":"FormsController_revokeShare","parameters":[{"name":"linkId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["forms"]}},"/v1/public/forms/{token}":{"get":{"operationId":"FormsController_publicForm","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["forms"]}},"/v1/public/forms/{token}/responses":{"post":{"operationId":"FormsController_submitPublic","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFormResponseDto"}}}},"responses":{"201":{"description":""}},"tags":["forms"]}},"/v1/workspaces/{ws}/billing":{"get":{"operationId":"BillingController_getStatus","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["billing"]}},"/v1/workspaces/{ws}/billing/limits":{"get":{"operationId":"BillingController_getLimits","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["billing"]}},"/v1/workspaces/{ws}/billing/usage":{"get":{"operationId":"BillingController_usage","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"pageSize","required":true,"in":"query","schema":{"type":"string"}},{"name":"kind","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["billing"]}},"/v1/plans":{"get":{"operationId":"PaddleController_getPlans","parameters":[],"responses":{"200":{"description":""}},"tags":["billing"]}},"/v1/workspaces/{ws}/billing/checkout":{"post":{"operationId":"PaddleController_checkout","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCheckoutDto"}}}},"responses":{"201":{"description":""}},"tags":["billing"]}},"/v1/workspaces/{ws}/billing/manage":{"get":{"operationId":"PaddleController_manageUrls","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["billing"]}},"/v1/workspaces/{ws}/billing/downgrade-preview":{"get":{"operationId":"PaddleController_downgradePreview","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"planId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["billing"]}},"/v1/workspaces/{ws}/billing/change-plan":{"post":{"operationId":"PaddleController_changePlan","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePlanDto"}}}},"responses":{"201":{"description":""}},"tags":["billing"]},"delete":{"operationId":"PaddleController_cancelPlanChange","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["billing"]}},"/v1/workspaces/{ws}/billing/cancel":{"post":{"operationId":"PaddleController_cancelSubscription","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelSubscriptionDto"}}}},"responses":{"201":{"description":""}},"tags":["billing"]},"delete":{"operationId":"PaddleController_undoCancel","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["billing"]}},"/v1/workspaces/{ws}/billing/dev-complete":{"post":{"operationId":"PaddleController_devComplete","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCheckoutDto"}}}},"responses":{"201":{"description":""}},"tags":["billing"]}},"/v1/paddle/webhook":{"post":{"operationId":"PaddleController_webhook","parameters":[],"responses":{"200":{"description":""}},"tags":["billing"]}},"/v1/support/status":{"get":{"operationId":"SupportController_status","parameters":[],"responses":{"200":{"description":""}},"tags":["support"]}},"/v1/support/conversations":{"post":{"operationId":"SupportController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSupportConversationDto"}}}},"responses":{"201":{"description":""}},"tags":["support"]},"get":{"operationId":"SupportController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["support"]}},"/v1/support/conversations/{id}":{"get":{"operationId":"SupportController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["support"]}},"/v1/support/conversations/{id}/rating":{"post":{"operationId":"SupportController_rate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateSupportDto"}}}},"responses":{"201":{"description":""}},"tags":["support"]}},"/v1/support/conversations/{id}/messages":{"post":{"operationId":"SupportController_postMessage","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostSupportMessageDto"}}}},"responses":{"201":{"description":""}},"tags":["support"]}},"/v1/support/conversations/{id}/stream":{"get":{"operationId":"SupportController_stream","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["support"]}},"/v1/support/kb/search":{"get":{"operationId":"SupportController_searchKb","parameters":[{"name":"q","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["support"]}},"/v1/support/kb/doc/{id}":{"get":{"operationId":"SupportController_readKb","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["support"]}},"/v1/admin/support/conversations":{"get":{"operationId":"SupportAdminController_queue","parameters":[{"name":"status","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/admin/support/unread-count":{"get":{"operationId":"SupportAdminController_unread","parameters":[],"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/admin/support/metrics":{"get":{"operationId":"SupportAdminController_metrics","parameters":[{"name":"days","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/admin/support/conversations/{id}":{"get":{"operationId":"SupportAdminController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/admin/support/conversations/{id}/reply":{"post":{"operationId":"SupportAdminController_reply","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaffReplyDto"}}}},"responses":{"201":{"description":""}},"tags":["admin"]}},"/v1/admin/support/conversations/{id}/close":{"post":{"operationId":"SupportAdminController_close","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["admin"]}},"/v1/admin/support/conversations/{id}/kb-suggestion":{"post":{"operationId":"SupportAdminController_suggest","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KbSuggestionDto"}}}},"responses":{"201":{"description":""}},"tags":["admin"]}},"/v1/admin/support/kb-suggestions":{"get":{"operationId":"SupportAdminController_suggestions","parameters":[{"name":"applied","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/admin/support/kb/refresh":{"post":{"operationId":"SupportAdminController_refresh","parameters":[],"responses":{"201":{"description":""}},"tags":["admin"]}},"/v1/feedback":{"post":{"description":"Report a bug, a friction point, an idea or praise about Rootr. Open to everyone: works with a session, with an API key, or with no credentials at all. Never counts against the API rate limit.","operationId":"FeedbackController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFeedbackDto"}}}},"responses":{"201":{"description":""}},"summary":"제보 보내기 (오류·불편·제안)","tags":["feedback"]}},"/v1/admin/feedback":{"get":{"operationId":"FeedbackAdminController_list","parameters":[{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["NEW","TRIAGED","PLANNED","DONE","DECLINED"]}},{"name":"kind","required":false,"in":"query","schema":{"type":"string","enum":["BUG","FRICTION","IDEA","PRAISE","OTHER"]}},{"name":"q","required":false,"in":"query","description":"제목·본문 검색어","schema":{"maxLength":200,"type":"string"}},{"name":"source","required":false,"in":"query","description":"web | api | cli | mcp","schema":{"maxLength":20,"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":200,"default":50,"type":"number"}},{"name":"cursor","required":false,"in":"query","description":"이 id 다음부터(커서)","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/admin/feedback/new-count":{"get":{"operationId":"FeedbackAdminController_newCount","parameters":[],"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/admin/feedback/stats":{"get":{"operationId":"FeedbackAdminController_stats","parameters":[{"name":"days","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/admin/feedback/{id}":{"get":{"operationId":"FeedbackAdminController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"]},"patch":{"operationId":"FeedbackAdminController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFeedbackDto"}}}},"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/workspaces/{ws}/ingestion-sources":{"post":{"operationId":"IngestionController_create","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateIngestionSourceDto"}}}},"responses":{"201":{"description":""}},"tags":["ingestion-sources"]},"get":{"operationId":"IngestionController_list","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["ingestion-sources"]}},"/v1/workspaces/{ws}/ingestion-sources/{id}":{"get":{"operationId":"IngestionController_get","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["ingestion-sources"]},"patch":{"operationId":"IngestionController_patch","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchIngestionSourceDto"}}}},"responses":{"200":{"description":""}},"tags":["ingestion-sources"]},"delete":{"operationId":"IngestionController_remove","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["ingestion-sources"]}},"/graphql/sdl":{"get":{"operationId":"DocsController_sdl","parameters":[],"responses":{"200":{"description":""}},"tags":["Docs"]}},"/llms.txt":{"get":{"operationId":"DocsController_llmsTxt","parameters":[],"responses":{"200":{"description":""}},"tags":["Docs"]}},"/pricing.md":{"get":{"operationId":"DocsController_pricingMd","parameters":[],"responses":{"200":{"description":""}},"tags":["Docs"]}},"/v1/referral/me":{"get":{"operationId":"ReferralController_me","parameters":[],"responses":{"200":{"description":""}},"tags":["referral"]}},"/v1/admin/auth/request-code":{"post":{"operationId":"AdminAuthController_requestCode","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminRequestCodeDto"}}}},"responses":{"200":{"description":""}},"tags":["admin-auth"]}},"/v1/admin/auth/verify-code":{"post":{"operationId":"AdminAuthController_verifyCode","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminVerifyCodeDto"}}}},"responses":{"200":{"description":""}},"tags":["admin-auth"]}},"/v1/admin/me":{"get":{"operationId":"AdminController_me","parameters":[],"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/admin/metrics/overview":{"get":{"operationId":"AdminController_overview","parameters":[{"name":"range","required":false,"in":"query","schema":{"type":"string","enum":["7d","30d","90d","12m"]}}],"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/admin/metrics/signup-channels":{"get":{"operationId":"AdminController_signupChannels","parameters":[{"name":"range","required":false,"in":"query","schema":{"type":"string","enum":["7d","30d","90d","12m"]}}],"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/admin/metrics/campaign-funnel":{"get":{"operationId":"AdminController_campaignFunnel","parameters":[{"name":"range","required":false,"in":"query","schema":{"type":"string","enum":["7d","30d","all"]}}],"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/admin/billing/seat-mismatches":{"get":{"operationId":"AdminController_seatMismatches","parameters":[],"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/admin/users":{"get":{"operationId":"AdminController_users","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"type":"number"}},{"name":"q","required":false,"in":"query","schema":{"type":"string"}},{"name":"includeBots","required":false,"in":"query","description":"Show suspected bot/throwaway signups too (hidden by default).","schema":{"type":"boolean"}}],"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/admin/workspaces":{"get":{"operationId":"AdminController_workspaces","parameters":[{"name":"page","required":false,"in":"query","schema":{"minimum":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"type":"number"}},{"name":"q","required":false,"in":"query","schema":{"type":"string"}},{"name":"includeBots","required":false,"in":"query","description":"Show suspected bot/throwaway signups too (hidden by default).","schema":{"type":"boolean"}}],"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/admin/workspaces/{id}/usage":{"get":{"operationId":"AdminController_workspaceUsage","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"type":"number"}},{"name":"q","required":false,"in":"query","schema":{"type":"string"}},{"name":"includeBots","required":false,"in":"query","description":"Show suspected bot/throwaway signups too (hidden by default).","schema":{"type":"boolean"}}],"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/admin/workspaces/{id}/imports":{"get":{"operationId":"AdminController_workspaceImports","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"type":"number"}},{"name":"q","required":false,"in":"query","schema":{"type":"string"}},{"name":"includeBots","required":false,"in":"query","description":"Show suspected bot/throwaway signups too (hidden by default).","schema":{"type":"boolean"}}],"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/admin/workspaces/{id}/credits/reset":{"post":{"operationId":"AdminController_resetCredits","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["admin"]}},"/v1/admin/workspaces/{id}/credits/graph/reset":{"post":{"operationId":"AdminController_resetGraphCredits","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["admin"]}},"/v1/admin/workspaces/{id}/credits/grant":{"post":{"operationId":"AdminController_grantCredits","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantCreditsDto"}}}},"responses":{"201":{"description":""}},"tags":["admin"]}},"/v1/admin/plans":{"get":{"operationId":"AdminController_plans","parameters":[],"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/admin/workspaces/{id}/plan":{"get":{"operationId":"AdminController_workspacePlan","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"]},"post":{"operationId":"AdminController_setPlan","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetPlanDto"}}}},"responses":{"201":{"description":""}},"tags":["admin"]}},"/v1/admin/referrers":{"get":{"operationId":"AdminController_referrerList","parameters":[{"name":"q","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"]},"post":{"operationId":"AdminController_createReferrer","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReferrerDto"}}}},"responses":{"201":{"description":""}},"tags":["admin"]}},"/v1/admin/referrers/{id}":{"get":{"operationId":"AdminController_referrerDetail","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"]},"patch":{"operationId":"AdminController_updateReferrer","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateReferrerDto"}}}},"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/admin/referrers/{id}/payout":{"post":{"operationId":"AdminController_payoutReferrer","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferralPayoutDto"}}}},"responses":{"201":{"description":""}},"tags":["admin"]}},"/v1/admin/noindex-takedowns":{"get":{"operationId":"AdminController_noIndexTakedowns","parameters":[{"name":"includeResolved","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/admin/noindex-takedowns/{id}/resolve":{"post":{"operationId":"AdminController_resolveNoIndexTakedown","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["admin"]}},"/v1/analytics/pageview":{"post":{"operationId":"AnalyticsController_pageview","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageViewDto"}}}},"responses":{"204":{"description":""}},"tags":["analytics"]}},"/v1/diagnose":{"post":{"operationId":"DiagnoseController_run","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiagnoseRequestDto"}}}},"responses":{"201":{"description":""}},"tags":["diagnose"]}},"/v1/mobile-bridge":{"post":{"operationId":"MobileBridgeController_request","parameters":[{"name":"accept-language","required":true,"in":"header","schema":{"type":"string"}},{"name":"x-forwarded-for","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MobileBridgeRequestDto"}}}},"responses":{"200":{"description":""}},"tags":["mobile-bridge"]}},"/v1/scaffold/workspace":{"post":{"operationId":"ScaffoldController_createWorkspace","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScaffoldWorkspaceDto"}}}},"responses":{"201":{"description":""}},"tags":["scaffold"]}},"/v1/scaffold/plan":{"post":{"operationId":"ScaffoldController_planStandalone","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScaffoldPlanDto"}}}},"responses":{"201":{"description":""}},"tags":["scaffold"]}},"/v1/workspaces/{ws}/scaffold/plan":{"post":{"operationId":"ScaffoldController_plan","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScaffoldPlanDto"}}}},"responses":{"201":{"description":""}},"tags":["scaffold"]}},"/v1/workspaces/{ws}/scaffold/review":{"post":{"operationId":"ScaffoldController_review","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScaffoldApplyDto"}}}},"responses":{"201":{"description":""}},"tags":["scaffold"]}},"/v1/scaffold/review":{"post":{"operationId":"ScaffoldController_reviewStandalone","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScaffoldApplyDto"}}}},"responses":{"201":{"description":""}},"tags":["scaffold"]}},"/v1/workspaces/{ws}/scaffold/review-built":{"post":{"operationId":"ScaffoldController_reviewBuilt","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["scaffold"]}},"/v1/workspaces/{ws}/scaffold/selftest":{"post":{"operationId":"ScaffoldController_runSelfTest","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["scaffold"]}},"/v1/workspaces/{ws}/scaffold/apply":{"post":{"operationId":"ScaffoldController_apply","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScaffoldApplyDto"}}}},"responses":{"201":{"description":""}},"tags":["scaffold"]}},"/v1/workspaces/{ws}/crms":{"post":{"description":"Creates a CRM node — a full sales workspace with companies, contacts, deal pipelines (kanban), activity timeline and follow-up tasks. Omit pipelines for a default 5-stage sales pipeline.","operationId":"CrmController_create","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCrmDto"}}}},"responses":{"201":{"description":"The created CRM (detail shape)."}},"summary":"Create a CRM","tags":["crm"]}},"/v1/crms/{id}":{"get":{"description":"Pipelines, custom field defs and record counts.","operationId":"CrmController_get","parameters":[{"name":"id","required":true,"in":"path","description":"CRM node id.","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get a CRM","tags":["crm"]},"patch":{"description":"Replace pipelines / custom field definitions / config. Deals pointing at a removed stage are moved to the first stage of their (or the first) pipeline.","operationId":"CrmController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchCrmDto"}}}},"responses":{"200":{"description":""}},"summary":"Update a CRM","tags":["crm"]}},"/v1/crms/{id}/summary":{"get":{"description":"Pipeline value & weighted forecast per stage, win rate, won-by-month (6mo), task and lifecycle counts.","operationId":"CrmController_summary","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"CRM dashboard summary","tags":["crm"]}},"/v1/crms/{id}/companies":{"get":{"description":"Filter by q (name/domain), owner, tag.","operationId":"CrmController_listCompanies","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"q","required":false,"in":"query","description":"Name/domain substring search.","schema":{"maxLength":200,"type":"string"}},{"name":"ownerId","required":false,"in":"query","schema":{"type":"string"}},{"name":"tag","required":false,"in":"query","schema":{"type":"string"}},{"name":"sort","required":false,"in":"query","schema":{"type":"string","enum":["name","createdAt","updatedAt"]}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":500,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"minimum":0,"type":"number"}}],"responses":{"200":{"description":""}},"summary":"List companies","tags":["crm"]},"post":{"operationId":"CrmController_createCompany","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCompanyDto"}}}},"responses":{"201":{"description":""}},"summary":"Create a company","tags":["crm"]}},"/v1/crm-companies/{companyId}":{"get":{"description":"Record + contacts, deals, timeline, open tasks.","operationId":"CrmController_getCompany","parameters":[{"name":"companyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Company detail","tags":["crm"]},"patch":{"operationId":"CrmController_updateCompany","parameters":[{"name":"companyId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchCompanyDto"}}}},"responses":{"200":{"description":""}},"tags":["crm"]},"delete":{"operationId":"CrmController_deleteCompany","parameters":[{"name":"companyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["crm"]}},"/v1/crms/{id}/contacts":{"get":{"description":"Filter by q (name/email), company, lifecycleStage, leadStatus, owner, tag; sort by leadScore.","operationId":"CrmController_listContacts","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"q","required":false,"in":"query","description":"Name/email substring search.","schema":{"maxLength":200,"type":"string"}},{"name":"companyId","required":false,"in":"query","schema":{"type":"string"}},{"name":"lifecycleStage","required":false,"in":"query","schema":{"type":"string","enum":["lead","mql","sql","opportunity","customer","evangelist"]}},{"name":"leadStatus","required":false,"in":"query","schema":{"type":"string","enum":["new","attempting","connected","open_deal","unqualified"]}},{"name":"ownerId","required":false,"in":"query","schema":{"type":"string"}},{"name":"tag","required":false,"in":"query","schema":{"type":"string"}},{"name":"sort","required":false,"in":"query","schema":{"type":"string","enum":["name","createdAt","updatedAt","leadScore"]}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":500,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"minimum":0,"type":"number"}}],"responses":{"200":{"description":""}},"summary":"List contacts","tags":["crm"]},"post":{"description":"Auto-links to a company by email domain when companyId is omitted. Lead score is computed server-side.","operationId":"CrmController_createContact","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateContactDto"}}}},"responses":{"201":{"description":""}},"summary":"Create a contact","tags":["crm"]}},"/v1/crm-contacts/{contactId}":{"get":{"description":"Record + company, deals, timeline, open tasks.","operationId":"CrmController_getContact","parameters":[{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Contact detail","tags":["crm"]},"patch":{"operationId":"CrmController_updateContact","parameters":[{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchContactDto"}}}},"responses":{"200":{"description":""}},"tags":["crm"]},"delete":{"operationId":"CrmController_deleteContact","parameters":[{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["crm"]}},"/v1/crms/{id}/deals":{"get":{"description":"Defaults to open deals; status=won|lost|all for others. Filter by pipeline/stage/owner/company/contact/tag; sort=position for board order.","operationId":"CrmController_listDeals","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"q","required":false,"in":"query","schema":{"maxLength":200,"type":"string"}},{"name":"pipelineId","required":false,"in":"query","schema":{"type":"string"}},{"name":"stageId","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["open","won","lost","all"]}},{"name":"ownerId","required":false,"in":"query","schema":{"type":"string"}},{"name":"companyId","required":false,"in":"query","schema":{"type":"string"}},{"name":"contactId","required":false,"in":"query","schema":{"type":"string"}},{"name":"tag","required":false,"in":"query","schema":{"type":"string"}},{"name":"sort","required":false,"in":"query","schema":{"type":"string","enum":["name","value","createdAt","updatedAt","expectedCloseDate","position"]}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":500,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"minimum":0,"type":"number"}}],"responses":{"200":{"description":""}},"summary":"List deals","tags":["crm"]},"post":{"description":"Defaults to the first pipeline/stage. Logs a \"created\" timeline entry.","operationId":"CrmController_createDeal","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDealDto"}}}},"responses":{"201":{"description":""}},"summary":"Create a deal","tags":["crm"]}},"/v1/crm-deals/{dealId}":{"get":{"description":"Record + participants, timeline, open tasks.","operationId":"CrmController_getDeal","parameters":[{"name":"dealId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Deal detail","tags":["crm"]},"patch":{"description":"status=won|lost closes it (closedAt + optional wonLostReason); status=open reopens.","operationId":"CrmController_updateDeal","parameters":[{"name":"dealId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchDealDto"}}}},"responses":{"200":{"description":""}},"summary":"Update a deal","tags":["crm"]},"delete":{"operationId":"CrmController_deleteDeal","parameters":[{"name":"dealId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["crm"]}},"/v1/crm-deals/{dealId}/move":{"post":{"description":"Reassign stage (and optionally pipeline) + column position. Logs a stage_change timeline entry.","operationId":"CrmController_moveDeal","parameters":[{"name":"dealId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveDealDto"}}}},"responses":{"201":{"description":""}},"summary":"Move a deal (kanban)","tags":["crm"]}},"/v1/crms/{id}/activities":{"get":{"description":"Newest first. Filter by contactId/companyId/dealId/type — a record page shows its own slice.","operationId":"CrmController_listActivities","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"contactId","required":false,"in":"query","schema":{"type":"string"}},{"name":"companyId","required":false,"in":"query","schema":{"type":"string"}},{"name":"dealId","required":false,"in":"query","schema":{"type":"string"}},{"name":"type","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":500,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"minimum":0,"type":"number"}}],"responses":{"200":{"description":""}},"summary":"List timeline activities","tags":["crm"]},"post":{"description":"type=note|call|email|meeting with any subset of contact/company/deal links.","operationId":"CrmController_createActivity","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateActivityDto"}}}},"responses":{"201":{"description":""}},"summary":"Log an activity","tags":["crm"]}},"/v1/crm-activities/{activityId}":{"delete":{"operationId":"CrmController_deleteActivity","parameters":[{"name":"activityId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["crm"]}},"/v1/crms/{id}/tasks":{"get":{"description":"Defaults to open tasks, due-date ascending. due=overdue|today|upcoming for follow-up queues.","operationId":"CrmController_listTasks","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["open","done","all"]}},{"name":"assigneeId","required":false,"in":"query","schema":{"type":"string"}},{"name":"due","required":false,"in":"query","description":"Due filter: overdue | today | upcoming (open tasks only).","schema":{"type":"string","enum":["overdue","today","upcoming"]}},{"name":"contactId","required":false,"in":"query","schema":{"type":"string"}},{"name":"companyId","required":false,"in":"query","schema":{"type":"string"}},{"name":"dealId","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":500,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"minimum":0,"type":"number"}}],"responses":{"200":{"description":""}},"summary":"List tasks","tags":["crm"]},"post":{"description":"Defaults assignee to the caller.","operationId":"CrmController_createTask","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTaskDto"}}}},"responses":{"201":{"description":""}},"summary":"Create a task","tags":["crm"]}},"/v1/crm-tasks/{taskId}":{"patch":{"description":"status=done stamps completedAt + a task_done timeline entry.","operationId":"CrmController_updateTask","parameters":[{"name":"taskId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchTaskDto"}}}},"responses":{"200":{"description":""}},"summary":"Update a task","tags":["crm"]},"delete":{"operationId":"CrmController_deleteTask","parameters":[{"name":"taskId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["crm"]}},"/v1/crms/{id}/export":{"get":{"description":"One workbook, 3 sheets: Companies / Contacts / Deals.","operationId":"CrmController_exportXlsx","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Export XLSX","tags":["crm"]}},"/v1/crms/{id}/import":{"post":{"description":"Client-parsed CSV rows: { entity, rows: [{column: value}] }. Company names are matched/created; per-row errors are reported.","operationId":"CrmController_importRows","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportRowsDto"}}}},"responses":{"201":{"description":""}},"summary":"Bulk import rows","tags":["crm"]}},"/v1/workspaces/{ws}/recordings":{"post":{"operationId":"RecordingsController_create","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRecordingDto"}}}},"responses":{"201":{"description":""}},"tags":["recordings"]}},"/v1/recordings/{id}":{"get":{"operationId":"RecordingsController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["recordings"]},"patch":{"operationId":"RecordingsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchRecordingDto"}}}},"responses":{"200":{"description":""}},"tags":["recordings"]}},"/v1/recordings/{id}/audio":{"post":{"operationId":"RecordingsController_uploadAudio","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"filename","required":true,"in":"query","schema":{"maxLength":255,"type":"string"}},{"name":"mimeType","required":true,"in":"query","schema":{"maxLength":120,"type":"string"}},{"name":"durationSec","required":false,"in":"query","description":"Client-measured duration in seconds (string in the query; parsed server-side).","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["recordings"]}},"/v1/recordings/{id}/transcribe":{"post":{"operationId":"RecordingsController_transcribe","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["recordings"]}},"/v1/recordings/{id}/summarize":{"post":{"operationId":"RecordingsController_summarize","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummarizeRecordingDto"}}}},"responses":{"201":{"description":""}},"tags":["recordings"]}},"/v1/workspaces/{ws}/presentations":{"post":{"operationId":"PresentationsController_create","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePresentationDto"}}}},"responses":{"201":{"description":""}},"tags":["presentations"]}},"/v1/presentations/{id}":{"get":{"operationId":"PresentationsController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["presentations"]},"patch":{"operationId":"PresentationsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-collab-client","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchPresentationDto"}}}},"responses":{"200":{"description":""}},"tags":["presentations"]}},"/v1/presentations/{id}/slides":{"post":{"operationId":"PresentationsController_appendSlides","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-collab-client","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppendSlidesDto"}}}},"responses":{"201":{"description":""}},"tags":["presentations"]}},"/v1/presentations/{id}/slides/{slideId}":{"patch":{"operationId":"PresentationsController_updateSlide","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"slideId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-collab-client","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSlideDto"}}}},"responses":{"200":{"description":""}},"tags":["presentations"]}},"/v1/presentations/{id}/reorder":{"post":{"operationId":"PresentationsController_reorder","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-collab-client","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderSlidesDto"}}}},"responses":{"201":{"description":""}},"tags":["presentations"]}},"/v1/diagram-types/{type}/schema":{"get":{"operationId":"PresentationsController_diagramSchema","parameters":[{"name":"type","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["presentations"]}},"/v1/diagram-types":{"get":{"operationId":"PresentationsController_diagramTypes","parameters":[],"responses":{"200":{"description":""}},"tags":["presentations"]}},"/v1/presentations/{id}/diagram-slides":{"post":{"operationId":"PresentationsController_diagramSlide","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-collab-client","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiagramSlideDto"}}}},"responses":{"201":{"description":""}},"tags":["presentations"]}},"/v1/presentations/{id}/publish":{"post":{"operationId":"PresentationsController_publish","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["presentations"]}},"/v1/presentations/{id}/public":{"patch":{"operationId":"PresentationsController_setPublic","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresentationPublicSettingsDto"}}}},"responses":{"200":{"description":""}},"tags":["presentations"]}},"/v1/presentations/{id}/public-status":{"get":{"operationId":"PresentationsController_publicStatus","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["presentations"]}},"/v1/public/presentations/{slug}":{"get":{"operationId":"PresentationsController_publicDeck","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}},{"name":"pass","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["presentations"]}},"/v1/public/presentations/{slug}/unlock":{"post":{"operationId":"PresentationsController_unlockDeck","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["presentations"]}},"/v1/workspaces/{ws}/images/generate":{"post":{"operationId":"ImagesController_generate","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateImageDto"}}}},"responses":{"201":{"description":""}},"tags":["Images"]}},"/v1/workspaces/{ws}/images/describe":{"post":{"operationId":"ImagesController_describe","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DescribeImageDto"}}}},"responses":{"201":{"description":""}},"tags":["Images"]}},"/v1/workspaces/{ws}/images/remove-background":{"post":{"operationId":"ImagesController_removeBackground","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveBackgroundDto"}}}},"responses":{"201":{"description":""}},"tags":["Images"]}},"/v1/signed-docs/{id}/request-code":{"post":{"operationId":"SignedDocsController_requestCode","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"accept-language","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["signed-docs"]}},"/v1/workspaces/{ws}/signed-docs/request-code":{"post":{"operationId":"SignedDocsController_requestBulkCode","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"accept-language","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["signed-docs"]}},"/v1/workspaces/{ws}/signed-docs":{"post":{"operationId":"SignedDocsController_create","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSignedDocDto"}}}},"responses":{"201":{"description":""}},"tags":["signed-docs"]},"get":{"operationId":"SignedDocsController_list","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["DRAFT","IN_PROGRESS","COMPLETED","REJECTED","SUPERSEDED","VOIDED"]}},{"name":"mode","required":false,"in":"query","schema":{"type":"string","enum":["APPROVAL","RESEARCH_NOTE"]}},{"name":"pendingMine","required":false,"in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":""}},"tags":["signed-docs"]}},"/v1/signed-docs/{id}":{"get":{"operationId":"SignedDocsController_state","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["signed-docs"]}},"/v1/signed-docs/{id}/approval-line":{"put":{"operationId":"SignedDocsController_setLine","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetApprovalLineDto"}}}},"responses":{"200":{"description":""}},"tags":["signed-docs"]}},"/v1/signed-docs/{id}/research-note-preset":{"post":{"operationId":"SignedDocsController_preset","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResearchNotePresetDto"}}}},"responses":{"201":{"description":""}},"tags":["signed-docs"]}},"/v1/signed-docs/{id}/submit":{"post":{"operationId":"SignedDocsController_submit","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReauthDto"}}}},"responses":{"201":{"description":""}},"tags":["signed-docs"]}},"/v1/signed-docs/{id}/sign":{"post":{"operationId":"SignedDocsController_sign","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReauthDto"}}}},"responses":{"201":{"description":""}},"tags":["signed-docs"]}},"/v1/signed-docs/{id}/reject":{"post":{"operationId":"SignedDocsController_reject","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectDto"}}}},"responses":{"201":{"description":""}},"tags":["signed-docs"]}},"/v1/signed-docs/{id}/reopen":{"post":{"operationId":"SignedDocsController_reopen","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["signed-docs"]}},"/v1/signed-docs/{id}/revise":{"post":{"operationId":"SignedDocsController_revise","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviseDto"}}}},"responses":{"201":{"description":""}},"tags":["signed-docs"]}},"/v1/sign/{token}":{"get":{"operationId":"SignedDocsController_publicView","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["signed-docs"]},"post":{"operationId":"SignedDocsController_publicSign","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSignDto"}}}},"responses":{"201":{"description":""}},"tags":["signed-docs"]}},"/v1/sign/{token}/request-code":{"post":{"operationId":"SignedDocsController_publicRequestCode","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}},{"name":"accept-language","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["signed-docs"]}},"/v1/sign/{token}/reject":{"post":{"operationId":"SignedDocsController_publicReject","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicRejectDto"}}}},"responses":{"201":{"description":""}},"tags":["signed-docs"]}},"/v1/signed-docs/{id}/verify":{"get":{"operationId":"SignedDocsController_verify","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["signed-docs"]}},"/v1/workspaces/{ws}/signed-docs/bulk-sign":{"post":{"operationId":"SignedDocsController_bulkSign","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkSignDto"}}}},"responses":{"201":{"description":""}},"tags":["signed-docs"]}},"/v1/workspaces/{ws}/ledger/verify":{"get":{"operationId":"SignedDocsController_ledger","parameters":[{"name":"ws","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["signed-docs"]}},"/v1/admin/reengage/targets":{"get":{"operationId":"AdminReengageController_targets","parameters":[],"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/admin/reengage/queue":{"get":{"operationId":"AdminReengageController_queue","parameters":[{"name":"status","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"]}},"/v1/admin/reengage/approve-all":{"post":{"operationId":"AdminReengageController_approveAll","parameters":[],"responses":{"201":{"description":""}},"tags":["admin"]}},"/v1/admin/reengage/{id}/approve":{"post":{"operationId":"AdminReengageController_approve","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["admin"]}},"/v1/admin/reengage/{id}/skip":{"post":{"operationId":"AdminReengageController_skip","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["admin"]}},"/v1/reengage/targets":{"get":{"operationId":"ReengageBotController_targets","parameters":[],"responses":{"200":{"description":""}},"tags":["reengage"]}},"/v1/reengage/queue":{"post":{"operationId":"ReengageBotController_queue","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueDraftDto"}}}},"responses":{"201":{"description":""}},"tags":["reengage"]}},"/v1/unsubscribe":{"get":{"operationId":"UnsubscribeController_unsubscribe","parameters":[{"name":"token","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["reengage"]}},"/v1/documents/{id}/publish":{"post":{"operationId":"PublicDocsController_publish","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishDto"}}}},"responses":{"201":{"description":""}},"tags":["public-docs"]}},"/v1/documents/{id}/public":{"patch":{"operationId":"PublicDocsController_setPublic","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSettingsDto"}}}},"responses":{"200":{"description":""}},"tags":["public-docs"]}},"/v1/documents/{id}/public-status":{"get":{"operationId":"PublicDocsController_publicStatus","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["public-docs"]}},"/v1/documents/{id}/commits":{"get":{"operationId":"PublicDocsController_listCommits","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["OPEN","MERGED","REJECTED"]}}],"responses":{"200":{"description":""}},"tags":["public-docs"]}},"/v1/documents/{id}/commits/{cid}":{"get":{"operationId":"PublicDocsController_getCommit","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"cid","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["public-docs"]}},"/v1/documents/{id}/commits/{cid}/merge":{"post":{"operationId":"PublicDocsController_mergeCommit","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"cid","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergeCommitDto"}}}},"responses":{"201":{"description":""}},"tags":["public-docs"]}},"/v1/documents/{id}/commits/{cid}/reject":{"post":{"operationId":"PublicDocsController_rejectCommit","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"cid","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectCommitDto"}}}},"responses":{"201":{"description":""}},"tags":["public-docs"]}},"/v1/public/docs/{slug}":{"get":{"operationId":"PublicDocsController_publicDocument","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}},{"name":"pass","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["public-docs"]}},"/v1/public/docs/{slug}/unlock":{"post":{"operationId":"PublicDocsController_unlockPublicDocument","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnlockPublicDocDto"}}}},"responses":{"201":{"description":""}},"tags":["public-docs"]}},"/v1/public/docs/{slug}/commits":{"post":{"operationId":"PublicDocsController_proposeCommit","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProposeCommitDto"}}}},"responses":{"201":{"description":""}},"tags":["public-docs"]}},"/v1/public/docs/{slug}/comments":{"get":{"operationId":"PublicDocsController_publicComments","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["public-docs"]},"post":{"operationId":"PublicDocsController_addPublicComment","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCommentDto"}}}},"responses":{"201":{"description":""}},"tags":["public-docs"]}},"/v1/public/docs/{slug}/commits/{cid}/withdraw":{"post":{"operationId":"PublicDocsController_withdrawCommit","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}},{"name":"cid","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["public-docs"]}},"/v1/public/docs/{slug}/clone":{"post":{"operationId":"PublicDocsController_cloneDocument","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloneDocDto"}}}},"responses":{"201":{"description":""}},"tags":["public-docs"]}},"/v1/nodes/{id}/publish":{"post":{"operationId":"PublicNodesController_publish","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishNodeDto"}}}},"responses":{"201":{"description":""}},"tags":["public-nodes"]}},"/v1/nodes/{id}/public":{"patch":{"operationId":"PublicNodesController_setPublic","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicNodeSettingsDto"}}}},"responses":{"200":{"description":""}},"tags":["public-nodes"]}},"/v1/nodes/{id}/public-status":{"get":{"operationId":"PublicNodesController_status","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["public-nodes"]}},"/v1/public/nodes/{slug}":{"get":{"operationId":"PublicNodesController_publicNode","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}},{"name":"pass","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["public-nodes"]}},"/v1/public/nodes/{slug}/children":{"get":{"operationId":"PublicNodesController_children","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["public-nodes"]}},"/v1/public/nodes/{slug}/form-uploads":{"post":{"operationId":"PublicNodesController_uploadPublicFormFile","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}},{"name":"filename","required":true,"in":"query","schema":{"type":"string"}},{"name":"mimeType","required":true,"in":"query","schema":{"type":"string"}},{"name":"pass","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["public-nodes"]}},"/v1/public/nodes/{slug}/sign/claim":{"post":{"operationId":"PublicNodesController_claimSign","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}},{"name":"pass","required":true,"in":"query","schema":{"type":"string"}},{"name":"accept-language","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSignClaimDto"}}}},"responses":{"201":{"description":""}},"tags":["public-nodes"]}},"/v1/public/nodes/{slug}/sign":{"post":{"operationId":"PublicNodesController_signPublic","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}},{"name":"pass","required":true,"in":"query","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSignByEmailDto"}}}},"responses":{"201":{"description":""}},"tags":["public-nodes"]}},"/v1/public/nodes/{slug}/form-responses":{"post":{"operationId":"PublicNodesController_submitPublicForm","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}},{"name":"pass","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["public-nodes"]}},"/v1/public/nodes/{slug}/unlock":{"post":{"operationId":"PublicNodesController_unlock","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnlockNodeDto"}}}},"responses":{"201":{"description":""}},"tags":["public-nodes"]}},"/v1/public/nodes/{slug}/clone":{"post":{"operationId":"PublicNodesController_clone","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloneNodeDto"}}}},"responses":{"201":{"description":""}},"tags":["public-nodes"]}},"/v1/public/sitemap":{"get":{"operationId":"SeoController_publicSitemap","parameters":[],"responses":{"200":{"description":""}},"tags":["Seo"]}},"/.well-known/oauth-authorization-server":{"get":{"operationId":"McpOAuthController_authServerMetadata","parameters":[],"responses":{"200":{"description":""}},"tags":["McpOAuth"]}},"/.well-known/oauth-protected-resource":{"get":{"operationId":"McpOAuthController_protectedResourceMetadata","parameters":[],"responses":{"200":{"description":""}},"tags":["McpOAuth"]}},"/mcp/register":{"post":{"operationId":"McpOAuthController_register","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterClientDto"}}}},"responses":{"201":{"description":""}},"tags":["McpOAuth"]}},"/mcp/authorize":{"get":{"operationId":"McpOAuthController_authorize","parameters":[],"responses":{"200":{"description":""}},"tags":["McpOAuth"]}},"/mcp/oauth/consent":{"post":{"operationId":"McpOAuthController_consent","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentDto"}}}},"responses":{"201":{"description":""}},"tags":["McpOAuth"]}},"/mcp/oauth/workspaces":{"get":{"operationId":"McpOAuthController_grantableWorkspaces","parameters":[],"responses":{"200":{"description":""}},"tags":["McpOAuth"]}},"/mcp/token":{"post":{"operationId":"McpOAuthController_token","parameters":[],"responses":{"200":{"description":""}},"tags":["McpOAuth"]}},"/mcp/revoke":{"post":{"operationId":"McpOAuthController_revoke","parameters":[],"responses":{"200":{"description":""}},"tags":["McpOAuth"]}},"/mcp":{"get":{"operationId":"McpTransportController_handle_get","parameters":[],"responses":{"200":{"description":""}},"tags":["McpTransport"]},"post":{"operationId":"McpTransportController_handle_post","parameters":[],"responses":{"200":{"description":""}},"tags":["McpTransport"]},"put":{"operationId":"McpTransportController_handle_put","parameters":[],"responses":{"200":{"description":""}},"tags":["McpTransport"]},"delete":{"operationId":"McpTransportController_handle_delete","parameters":[],"responses":{"200":{"description":""}},"tags":["McpTransport"]},"patch":{"operationId":"McpTransportController_handle_patch","parameters":[],"responses":{"200":{"description":""}},"tags":["McpTransport"]},"options":{"operationId":"McpTransportController_handle_options","parameters":[],"responses":{"200":{"description":""}},"tags":["McpTransport"]},"head":{"operationId":"McpTransportController_handle_head","parameters":[],"responses":{"200":{"description":""}},"tags":["McpTransport"]},"search":{"operationId":"McpTransportController_handle_search","parameters":[],"responses":{"200":{"description":""}},"tags":["McpTransport"]}}},"info":{"title":"Rootr API","description":"Markdown document CRUD + knowledge graph API. Authenticate with a JWT (Authorization: Bearer) or a workspace API key (X-Api-Key).","version":"1.0","contact":{}},"tags":[],"servers":[],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"},"api-key":{"type":"apiKey","in":"header","name":"X-Api-Key"}},"schemas":{"AttributionUtmDto":{"type":"object","properties":{"source":{"type":"string","maxLength":255},"medium":{"type":"string","maxLength":255},"campaign":{"type":"string","maxLength":255},"term":{"type":"string","maxLength":255},"content":{"type":"string","maxLength":255}}},"AttributionDto":{"type":"object","properties":{"referrer":{"type":"string","maxLength":2048},"utm":{"$ref":"#/components/schemas/AttributionUtmDto"},"landingPath":{"type":"string","maxLength":2048},"ref":{"type":"string","description":"추천인 코드 — 랜딩의 `?ref=CODE`. 유입 채널과 같은 first-touch 규칙으로 실려온다.\n형식 검증은 여기서 하지 않는다(ReferralService.normalizeCode 가 좁게 거른다):\n오타난 코드 하나 때문에 가입 요청이 400 으로 튕기는 게 훨씬 나쁘다.","maxLength":64}}},"SignupDto":{"type":"object","properties":{"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":8,"maxLength":128},"name":{"type":"string","minLength":1,"maxLength":80},"attribution":{"$ref":"#/components/schemas/AttributionDto"}},"required":["email","password","name"]},"LoginDto":{"type":"object","properties":{"email":{"type":"string","format":"email"},"password":{"type":"string"}},"required":["email","password"]},"GoogleLoginDto":{"type":"object","properties":{"credential":{"type":"string","description":"The ID token (JWT credential) returned by Google Identity Services in the browser.","minLength":1,"maxLength":4096},"attribution":{"$ref":"#/components/schemas/AttributionDto"}},"required":["credential"]},"TotpLoginDto":{"type":"object","properties":{"tempToken":{"type":"string"},"code":{"type":"string","minLength":6,"maxLength":6}},"required":["tempToken","code"]},"TotpCodeDto":{"type":"object","properties":{"code":{"type":"string","minLength":6,"maxLength":6}},"required":["code"]},"RefreshDto":{"type":"object","properties":{"refreshToken":{"type":"string"}},"required":["refreshToken"]},"UiPrefsDto":{"type":"object","properties":{"sidebarWidth":{"type":"number","description":"왼쪽 문서 목록의 폭(px). 너무 좁으면 글씨가 안 보이고 너무 넓으면 본문이 사라진다.","minimum":180,"maximum":560},"contentWidth":{"type":"number","description":"본문 폭(화면 대비 %). 100이면 지금까지와 같은 전체 너비.","minimum":30,"maximum":100}}},"UpdateMeDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"avatarUrl":{"type":"string"},"preferredLocale":{"type":"string","description":"Synced from the frontend's language switcher so mail/error locale follows the account, not just the browser cookie.","enum":["en","ko"]},"uiPrefs":{"description":"VIEW-PREF — 계정에 붙는 화면 설정. 지금은 사이드바 폭(px)과 본문 폭(%) 둘뿐이라\n자유 JSON이 아니라 아는 값만 받는다(모르는 키가 들어와 쌓이지 않게).","allOf":[{"$ref":"#/components/schemas/UiPrefsDto"}]}}},"ChangePasswordDto":{"type":"object","properties":{"currentPassword":{"type":"string"},"newPassword":{"type":"string","minLength":8,"maxLength":128},"code":{"type":"string","description":"Emailed verification code — requested via POST /me/change-password/request-code.","minLength":6,"maxLength":6}},"required":["currentPassword","newPassword","code"]},"VerifyEmailDto":{"type":"object","properties":{"token":{"type":"string"}},"required":["token"]},"ResendVerificationDto":{"type":"object","properties":{"email":{"type":"string","format":"email"}},"required":["email"]},"RequestPasswordResetDto":{"type":"object","properties":{"email":{"type":"string","format":"email"}},"required":["email"]},"ResetPasswordDto":{"type":"object","properties":{"token":{"type":"string"},"newPassword":{"type":"string","minLength":8,"maxLength":128}},"required":["token","newPassword"]},"FindIdDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80}},"required":["name"]},"CreateWorkspaceDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$"}},"required":["name"]},"UpdateWorkspaceDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"defaultVisibility":{"type":"string","enum":["PUBLIC","PRIVATE"]}}},"DeleteWorkspaceDto":{"type":"object","properties":{"confirmName":{"type":"string","description":"Safety: must retype the workspace name."}},"required":["confirmName"]},"UpdateMemberDto":{"type":"object","properties":{"role":{"type":"string","enum":["OWNER","ADMIN","MEMBER","VIEWER"]}},"required":["role"]},"CreateInvitationDto":{"type":"object","properties":{"email":{"type":"string","format":"email"},"role":{"type":"string","default":"MEMBER","enum":["OWNER","ADMIN","MEMBER","VIEWER"]}},"required":["email","role"]},"CreateGroupDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80}},"required":["name"]},"GroupMemberDto":{"type":"object","properties":{"userId":{"type":"string"}},"required":["userId"]},"CreateApiKeyDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"scopes":{"type":"array","minItems":1,"items":{"type":"string","enum":["docs:read","docs:write","graph:read","ask","workspaces:create","webhooks:manage"]}}},"required":["name","scopes"]},"SetVisibilityDto":{"type":"object","properties":{"visibility":{"type":"string","nullable":true,"enum":["PUBLIC","PRIVATE"]}}},"SetRestrictedDto":{"type":"object","properties":{"restricted":{"type":"boolean"}},"required":["restricted"]},"SetPermissionDto":{"type":"object","properties":{"subjectType":{"type":"string","enum":["USER","GROUP"]},"subjectId":{"type":"string"},"level":{"type":"string","enum":["NONE","READ","COMMENT","WRITE","MANAGE"]}},"required":["subjectType","subjectId","level"]},"RemovePermissionDto":{"type":"object","properties":{"subjectType":{"type":"string","enum":["USER","GROUP"]},"subjectId":{"type":"string"}},"required":["subjectType","subjectId"]},"CreateShareLinkDto":{"type":"object","properties":{"expiresAt":{"type":"string"}}},"CreateDatabaseDto":{"type":"object","properties":{"name":{"type":"string"},"rowPageType":{"type":"string","description":"SIGN-001 — 행 상세 문서의 타입. 'SIGNED'면 행마다 서명문서(연구노트)가 붙는다.\n실험 기록 표처럼 \"행 하나 = 서명해야 하는 기록 하나\"인 표를 위한 것이다.","enum":["DOCUMENT","SIGNED","SPREADSHEET","WHITEBOARD","PRESENTATION","RECORDING","FORM","ISSUE_TRACKER","LOG","CRM"]},"parentId":{"type":"string","description":"Either parentId or path must locate the target parent."},"path":{"type":"string","description":"Full path incl. name — wins over parentId+name.","maxLength":2000},"createParents":{"type":"boolean"},"autoRename":{"type":"boolean","description":"On sibling name conflict: false → 409, true → \" (2)\" suffix."},"icon":{"type":"string","maxLength":16},"properties":{"description":"Property definitions; defaults to a single 'title' property \"Name\".","type":"array","items":{"type":"object"}},"views":{"description":"View definitions; defaults to a single table view.","type":"array","items":{"type":"object"}},"rows":{"type":"array","items":{"type":"object","properties":{"values":{"type":"object","additionalProperties":true},"body":{"type":"string"}},"required":["values"]}}}},"PatchDatabaseDto":{"type":"object","properties":{"properties":{"type":"array","items":{"type":"object"}},"rowPageType":{"type":"string","description":"SIGN-001 — 이 표의 행을 열었을 때 나오는 상세 문서의 타입.\n'SIGNED'로 바꾸면 그 뒤로 만들어지는 행마다 서명문서(연구노트)가 붙는다.\n이미 만들어진 행의 문서는 그대로 둔다 — 서명된 것을 소급해 바꿀 수는 없다.","enum":["DOCUMENT","SIGNED","SPREADSHEET","WHITEBOARD","PRESENTATION","RECORDING","FORM","ISSUE_TRACKER","LOG","CRM"]},"views":{"type":"array","items":{"type":"object"}},"icon":{"type":"string","maxLength":16}}},"PatchViewDto":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"config":{"type":"object","properties":{"groupBy":{"type":"string"},"dateProp":{"type":"string"},"endDateProp":{"type":"string"},"hiddenProps":{"type":"array","items":{"type":"string"}},"sort":{"type":"object","properties":{"propId":{"type":"string"},"dir":{"enum":["asc","desc"],"type":"string"}},"selfRequired":false},"filters":{"type":"array","items":{"type":"object","properties":{"propId":{"type":"string"},"op":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}},"required":["propId","op"]},"selfRequired":false}},"required":["sort"]},"hiddenProps":{"description":"이 뷰에서 감출 컬럼(id 또는 이름). 빈 배열을 주면 전부 다시 보인다.","type":"array","items":{"type":"string"}},"groupBy":{"type":"string"},"dateProp":{"type":"string"},"endDateProp":{"type":"string"},"sort":{"type":"object","properties":{"propId":{"type":"string"},"dir":{"enum":["asc","desc"],"type":"string"}},"required":["propId","dir"]},"filters":{"type":"array","items":{"type":"object","properties":{"propId":{"type":"string"},"op":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}},"required":["propId","op"]}},"colWidths":{"type":"object","additionalProperties":{"type":"number"},"nullable":true,"description":"COL-WIDTH — 이 뷰의 열 너비(px). `{ \"공고명\": 420 }`처럼 칸 이름으로 줘도 된다.\n빈 객체를 주면 전부 자동 너비로 되돌린다."}}},"AddViewDto":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"type":{"type":"string","enum":["table","board","gallery","calendar","timeline","list"]},"groupBy":{"type":"string","description":"board 뷰의 그룹 기준 컬럼(이름 또는 id)."},"dateProp":{"type":"string","description":"calendar/timeline 뷰의 날짜 컬럼(이름 또는 id)."},"endDateProp":{"type":"string","description":"timeline 뷰의 종료일 컬럼(이름 또는 id)."},"sort":{"type":"object","properties":{"propId":{"type":"string"},"dir":{"enum":["asc","desc"],"type":"string"}},"required":["propId","dir"]},"filters":{"type":"array","items":{"type":"object","properties":{"propId":{"type":"string"},"op":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}},"required":["propId","op"]}},"colWidths":{"type":"object","additionalProperties":{"type":"number"},"nullable":true}},"required":["name","type"]},"AddColumnDto":{"type":"object","properties":{"name":{"type":"string","maxLength":200},"type":{"type":"string","description":"One of PROPERTY_TYPES except 'title' (a database already has exactly one)."},"options":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"color":{"type":"string"}},"required":["name","color"]}},"relationDatabaseId":{"type":"string","description":"relation only: the node id of the database this column points at."},"prefix":{"type":"string","description":"unique_id only: 번호 앞에 붙는 말머리(`TASK` → \"TASK-42\").","maxLength":12},"formula":{"type":"string","description":"formula only: 계산식. 예: `{수량} * {단가}`","maxLength":1000},"rollup":{"type":"object","additionalProperties":true,"description":"rollup only: `{ relation, property?, function }`"}},"required":["name","type"]},"PatchColumnDto":{"type":"object","properties":{"name":{"type":"string","maxLength":200},"options":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"color":{"type":"string"}},"required":["name","color"]}},"formula":{"type":"string","description":"DB-COL-EDIT — 계산식을 고친다. 예전에는 받아만 두고 버려서, 한 번 만든 수식을\n 고칠 길이 없었다(칸을 지우고 다시 만들어야 했다).","maxLength":1000},"rollup":{"type":"object","additionalProperties":true,"description":"롤업 설정을 고친다: `{ relation, property?, function }`"},"prefix":{"type":"string","description":"unique_id 말머리를 고친다.","maxLength":12}}},"DatabasePermissionsDto":{"type":"object","properties":{"schemaLock":{"type":"string","description":"'open'(기본) | 'managers' — 칸과 뷰를 관리자만 바꾸게.","enum":["open","managers"]},"rowScope":{"type":"string","description":"'all'(기본) | 'own' — 본인이 만든 행만 보고 고치게(지원서·신고함).","enum":["all","own"]},"lockedProps":{"description":"관리자만 고칠 수 있는 칸(이름 또는 id). 예: 승인 여부, 최종 점수.","type":"array","items":{"type":"string"}}}},"DatabaseWatchersDto":{"type":"object","properties":{"watchers":{"type":"array","items":{"type":"object"}}},"required":["watchers"]},"BulkRowPatchDto":{"type":"object","properties":{"rowId":{"type":"string"},"values":{"type":"object","additionalProperties":true}},"required":["rowId","values"]},"BulkPatchRowsEachDto":{"type":"object","properties":{"updates":{"type":"array","items":{"$ref":"#/components/schemas/BulkRowPatchDto"}}},"required":["updates"]},"CreateRowDto":{"type":"object","properties":{"values":{"type":"object","additionalProperties":true},"body":{"type":"string","description":"DB-BODY — 행의 상세 내용(본문 메모). 칸반 카드를 열면 속성 아래에 붙는 그 글이다.\n마크다운으로 준다. 행에 붙는 문서가 아직 없으면 이때 만들어진다."},"position":{"type":"number"}}},"PatchRowDto":{"type":"object","properties":{"values":{"type":"object","additionalProperties":true,"description":"Merge semantics: only passed keys change; null deletes the key."},"body":{"type":"string","description":"DB-BODY — 행의 상세 내용(본문 메모)을 통째로 바꾼다(마크다운)."},"position":{"type":"number"}}},"BulkPatchRowsDto":{"type":"object","properties":{"values":{"type":"object","additionalProperties":true,"description":"고른 행 **전부**에 같은 값을 덮어쓴다. `null`이면 그 칸을 비운다."},"rowIds":{"type":"array","items":{"type":"string"}}},"required":["values","rowIds"]},"BulkCreateRowsDto":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object"}}},"required":["rows"]},"BulkRowIdsDto":{"type":"object","properties":{"rowIds":{"type":"array","items":{"type":"string"}}},"required":["rowIds"]},"CreateRowPageDto":{"type":"object","properties":{"type":{"type":"string","enum":["DOCUMENT","SIGNED","SPREADSHEET","WHITEBOARD","PRESENTATION","RECORDING","FORM","ISSUE_TRACKER","LOG","CRM"]},"nodeId":{"type":"string","description":"ROW-PAGE-LINK — **이미 있는 문서를 이 행에 잇는다**(창업자 지적 2026-08-27:\n\"기존 문서랑 연결하는 기능은 왜 없어\").\n\n만들기만 있고 잇기가 없으면, 이미 써 둔 회의록을 표에 얹으려는 사람은 복사해\n붙이는 수밖에 없다 — 그 순간 같은 글이 두 벌이 되고 둘 다 낡는다.\n\n`type`과 같이 줄 수 없다. 새로 만들 것인지 있는 것을 이을 것인지 둘 중 하나다."}}},"CreateNodeDto":{"type":"object","properties":{"type":{"type":"string","enum":["FOLDER","DOCUMENT","DATABASE","LOG","SPREADSHEET","WHITEBOARD","FORM","ISSUE_TRACKER","PRESENTATION","CRM","RECORDING","SIGNED"]},"name":{"type":"string"},"parentId":{"type":"string","description":"Either parentId or path must locate the target folder."},"path":{"type":"string","description":"Full path incl. name, e.g. /ops/incidents/outage.md — wins over parentId+name.","maxLength":2000},"createParents":{"type":"boolean"},"autoRename":{"type":"boolean","description":"On sibling name conflict: false → 409, true → \" (2)\" suffix."},"content":{"type":"string","description":"Initial markdown for DOCUMENT nodes."},"icon":{"type":"string","maxLength":16}},"required":["type"]},"RenameNodeDto":{"type":"object","properties":{"name":{"type":"string"},"icon":{"type":"string","maxLength":16},"tags":{"description":"NODE-TAGS — full replacement list. Each tag is trimmed, must be 1-30\nchars, max 20 tags, case-insensitive duplicates dropped (first spelling\nwins) — enforced in TreeService.sanitizeTags.","maxItems":20,"type":"array","items":{"type":"string"}},"parentId":{"type":"string","nullable":true,"description":"ISSUE-96 — same PATCH accepts a move: null moves to workspace root,\na string reparents under that folder. Combined with name in one call so\n\"rename while moving\" doesn't need two requests."},"position":{"type":"number"}}},"ConvertNodeTypeDto":{"type":"object","properties":{"to":{"type":"string","enum":["SIGNED","DOCUMENT"]}},"required":["to"]},"MoveNodeDto":{"type":"object","properties":{"newParentId":{"type":"string","nullable":true,"description":"null → workspace root"},"position":{"type":"number"}}},"ReorderNodeDto":{"type":"object","properties":{"position":{"type":"number"}},"required":["position"]},"DuplicateNodeDto":{"type":"object","properties":{"deep":{"type":"boolean"},"targetWorkspaceId":{"type":"string"}}},"PutDocumentDto":{"type":"object","properties":{"content":{"type":"string"}}},"AppendDocumentDto":{"type":"object","properties":{"content":{"type":"string"},"underHeading":{"type":"string","description":"e.g. \"## ✅ 승인 대기\" (or just the heading text) — appends at that section's end"},"createIfMissing":{"type":"boolean","description":"default true: a missing underHeading section is created at the document end"}},"required":["content"]},"PatchDocumentDto":{"type":"object","properties":{"op":{"type":"string","enum":["replace","append","prepend"]},"heading":{"type":"string"},"content":{"type":"string"},"createIfMissing":{"type":"boolean"},"find":{"type":"string"},"replace":{"type":"string"},"replaceAll":{"type":"boolean"},"ifMatch":{"type":"string","description":"body-level alternative to the If-Match header, for clients that can't set headers easily"}}},"NotionApiImportDto":{"type":"object","properties":{"token":{"type":"string"},"rootPath":{"type":"string"},"reconcile":{"type":"boolean"}},"required":["token"]},"ConfluenceImportDto":{"type":"object","properties":{"siteUrl":{"type":"string","description":"`acme`, `acme.atlassian.net`, or the full `https://acme.atlassian.net/wiki`"},"email":{"type":"string","description":"Atlassian account the API token belongs to"},"token":{"type":"string"},"spaceKeys":{"description":"optional space-key whitelist; omitted/empty = every space the account can read","type":"array","items":{"type":"string"}},"rootPath":{"type":"string"},"reconcile":{"type":"boolean"}},"required":["siteUrl","email","token"]},"PresignDto":{"type":"object","properties":{"filename":{"type":"string","maxLength":255},"mimeType":{"type":"string","maxLength":120},"size":{"type":"number","minimum":1,"maximum":78643200},"workspaceId":{"type":"string"},"nodeId":{"type":"string","description":"Document node the attachment belongs to (optional at presign time)."}},"required":["filename","mimeType","size","workspaceId"]},"DataRefDto":{"type":"object","properties":{"kind":{"type":"string","enum":["node","row","logentry"]},"id":{"type":"string"}},"required":["kind","id"]},"AddEdgeDto":{"type":"object","properties":{"from":{"$ref":"#/components/schemas/DataRefDto"},"to":{"$ref":"#/components/schemas/DataRefDto"},"relation":{"type":"string","description":"Ontology relation type (CORE_RELATION_TYPES ∪ workspace APPROVED RELATION)."},"transform":{"type":"string","description":"Free-text description of the transformation/tool that produced the edge."},"meta":{"type":"object","additionalProperties":true}},"required":["from","to","relation"]},"CreateSpreadsheetDto":{"type":"object","properties":{"name":{"type":"string"},"parentId":{"type":"string","description":"Either parentId or path must locate the target parent."},"path":{"type":"string","description":"Full path incl. name — wins over parentId+name.","maxLength":2000},"createParents":{"type":"boolean"},"autoRename":{"type":"boolean","description":"On sibling name conflict: false -> 409, true -> \" (2)\" suffix."},"icon":{"type":"string","maxLength":16},"data":{"type":"object","properties":{"sheets":{"type":"array","items":{"type":"object"}}},"required":[]},"config":{"type":"object","additionalProperties":true}}},"PatchSpreadsheetDto":{"type":"object","properties":{"sheets":{"description":"Full sheets replace (rare — prefer the cells/sheet endpoints for incremental edits).","type":"array","items":{"type":"object"}},"config":{"type":"object","additionalProperties":true},"icon":{"type":"string","maxLength":16}}},"CreateSheetDto":{"type":"object","properties":{"name":{"type":"string"},"formLink":{"type":"string","description":"이 시트를 폼에 연결한다(구글 폼→시트처럼). 값은 같은 워크스페이스의 FORM\n노드 id이고, 응답이 A1부터 표로 깔린다. 사람이 직접 쓴 칸은 덮지 않는다.","maxLength":64},"rowCount":{"type":"number","minimum":1,"maximum":10000},"colCount":{"type":"number","minimum":1,"maximum":500}}},"PatchSheetDto":{"type":"object","properties":{"name":{"type":"string"},"rowCount":{"type":"number","minimum":1,"maximum":10000},"colCount":{"type":"number","minimum":1,"maximum":500},"rowSizes":{"type":"object","additionalProperties":{"type":"number"},"description":"Per-row heights px, keyed by row-index string (Wave 4b). Deep-validated in validateSheet."},"colSizes":{"type":"object","additionalProperties":{"type":"number"},"description":"Per-column widths px, keyed by col-index string (Wave 4b)."},"merges":{"description":"Merged-cell ranges (Wave 4b). Deep-validated in validateSheet.","type":"array","items":{"type":"object"}},"frozenRows":{"type":"number","description":"Freeze panes: leading rows/cols pinned while scrolling. 0 clears.","minimum":0,"maximum":100},"frozenCols":{"type":"number","minimum":0,"maximum":26},"formLink":{"type":"string","nullable":true,"description":"폼 연결. 같은 워크스페이스의 FORM 노드 id, 또는 null로 연결 해제.","maxLength":64}}},"PatchCellsDto":{"type":"object","properties":{"cells":{"type":"object","additionalProperties":true}},"required":["cells"]},"ImportSpreadsheetDto":{"type":"object","properties":{"format":{"type":"string","enum":["xlsx","csv","tsv"]},"xlsx":{"type":"string","description":"xlsx file, base64-encoded (binary can't travel as raw JSON text)."},"text":{"type":"string","description":"Raw CSV/TSV text."},"sheetId":{"type":"string","description":"Target existing sheet id; if omitted a new sheet is created."},"sheetName":{"type":"string","description":"Name for the newly created sheet when `sheetId` is omitted.","maxLength":200},"xlsxSheetName":{"type":"string","description":"xlsx only — which worksheet to import; defaults to the first one."}},"required":["format"]},"PatchNodeViewDto":{"type":"object","properties":{"smallText":{"type":"boolean"},"fullWidth":{"type":"boolean"}}},"PutReadRequirementDto":{"type":"object","properties":{"userIds":{"maxItems":500,"type":"array","items":{"type":"string"}},"dueAt":{"type":"string","nullable":true,"description":"ISO 날짜. null이면 마감 없음."},"requireExplicitAck":{"type":"boolean"}},"required":["userIds"]},"CreateLogDto":{"type":"object","properties":{"name":{"type":"string"},"parentId":{"type":"string"},"path":{"type":"string"},"icon":{"type":"string"},"fields":{"type":"array","items":{"type":"object"}},"config":{"type":"object","additionalProperties":true},"createParents":{"type":"boolean"},"autoRename":{"type":"boolean"}}},"PatchLogDto":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"object"}},"config":{"type":"object","additionalProperties":true},"icon":{"type":"string"}}},"LogEntryInput":{"type":"object","properties":{"ts":{"type":"string"},"source":{"type":"string"},"level":{"type":"string"},"message":{"type":"string"},"data":{"type":"object","additionalProperties":true},"externalKey":{"type":"string"}}},"AppendEntriesDto":{"type":"object","properties":{"entries":{"type":"array","items":{"$ref":"#/components/schemas/LogEntryInput"}}},"required":["entries"]},"ImportLogCsvDto":{"type":"object","properties":{"format":{"type":"string","enum":["csv","parquet"]},"csv":{"type":"string"},"parquet":{"type":"string","description":"Parquet file, base64-encoded (binary can't travel as raw JSON text)."},"mapping":{"type":"object","additionalProperties":{"type":"string"}},"hasHeader":{"type":"boolean"},"externalKeyColumn":{"type":"string"}}},"CreateTemplateDto":{"type":"object","properties":{"name":{"type":"string"},"emoji":{"type":"string"},"description":{"type":"string"},"kind":{"type":"string","enum":["document","database","tree"]},"spec":{"type":"object","additionalProperties":true}},"required":["name","kind","spec"]},"UpdateTemplateDto":{"type":"object","properties":{"name":{"type":"string"},"emoji":{"type":"string"},"description":{"type":"string"},"kind":{"type":"string","enum":["document","database","tree"]},"spec":{"type":"object","additionalProperties":true}}},"ApplyTemplateDto":{"type":"object","properties":{"parentId":{"type":"string"}}},"SaveFromNodeDto":{"type":"object","properties":{"name":{"type":"string"},"emoji":{"type":"string"},"description":{"type":"string"}}},"CreateCommentDto":{"type":"object","properties":{"body":{"type":"string","minLength":1,"maxLength":4000},"blockId":{"type":"string"},"parentId":{"type":"string"}},"required":["body"]},"UpdateCommentDto":{"type":"object","properties":{"body":{"type":"string","minLength":1,"maxLength":4000},"resolved":{"type":"boolean"}}},"CreateIssueTrackerDto":{"type":"object","properties":{"name":{"type":"string"},"path":{"type":"string"},"parentId":{"type":"string"},"icon":{"type":"string"},"labels":{"type":"object","description":"[{ id?, name, color? }] — validated by issue-schema.validateLabels."},"types":{"type":"object","description":"[{ id?, name, color? }] — validated by issue-schema.validateTypes. Omit for the default bug/feature/task set."},"config":{"type":"object"},"createParents":{"type":"boolean"},"autoRename":{"type":"boolean"}}},"PatchIssueTrackerDto":{"type":"object","properties":{"labels":{"type":"object"},"types":{"type":"object","description":"[{ id?, name, color? }] — validated by issue-schema.validateTypes."},"config":{"type":"object"},"icon":{"type":"string"}}},"CreateIssueDto":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":300},"body":{"type":"string","maxLength":100000},"labels":{"description":"Label ids (must exist on the tracker).","type":"array","items":{"type":"string"}},"assigneeId":{"type":"string"},"type":{"type":"string","description":"Issue type id — must be defined on the tracker's `types` (ISSUE-P1)."},"parentIssueId":{"type":"string","description":"Parent issue id (same tracker) — creates this as a sub-issue."}},"required":["title"]},"PatchIssueDto":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":300},"body":{"type":"string","maxLength":100000},"labels":{"type":"array","items":{"type":"string"}},"assigneeId":{"type":"string","nullable":true,"description":"null clears the assignee."},"state":{"type":"string","enum":["OPEN","CLOSED"]},"stateReason":{"type":"string","nullable":true,"description":"Close reason; defaults to 'completed' when closing. null clears.","enum":["completed","not_planned","duplicate"]},"type":{"type":"string","nullable":true,"description":"Issue type id — must be defined on the tracker's `types`. null clears the type."},"parentIssueId":{"type":"string","nullable":true,"description":"null detaches from the parent (no longer a sub-issue)."}}},"CreateWebhookDto":{"type":"object","properties":{"name":{"type":"string","description":"WHK-SCOPE — display label, e.g. \"marketing agent\".","maxLength":100},"url":{"type":"string","format":"uri"},"events":{"type":"array","description":"WHK-UNIFY — subscribable names only. Content changes of every node type\n(issues, database rows, spreadsheets, …) arrive as `document.updated`\nwith the specific mutation in `data.change`.","minItems":1,"items":{"type":"string","enum":["document.created","document.updated","document.moved","document.deleted","comment.created","extraction.completed","extraction.failed","log.anomaly.rca","scaffold.applied"]}},"scopeNodeId":{"type":"string","nullable":true,"description":"WHK-SCOPE — restrict to a node's subtree; null/omit = whole workspace."},"debounceSeconds":{"type":"number","description":"WHK-SCOPE — coalescing window (seconds, 0-600). 0 = deliver immediately.","minimum":0,"maximum":600},"filterTags":{"description":"WHK-TAGS — only deliver events whose node (or an ancestor folder) has at\nleast one of these tags (case-insensitive OR; AND with scopeNodeId).\nEmpty/omitted = no tag filtering.","maxItems":20,"type":"array","items":{"type":"string","maxLength":30}}},"required":["url","events"]},"UpdateWebhookDto":{"type":"object","properties":{"name":{"type":"string","maxLength":100},"url":{"type":"string","format":"uri"},"events":{"type":"array","minItems":1,"items":{"type":"string","enum":["document.created","document.updated","document.moved","document.deleted","comment.created","extraction.completed","extraction.failed","log.anomaly.rca","scaffold.applied"]}},"scopeNodeId":{"type":"string","nullable":true,"description":"null clears the scope back to whole-workspace."},"debounceSeconds":{"type":"number","minimum":0,"maximum":600},"filterTags":{"nullable":true,"description":"WHK-TAGS — [] or null clears the tag filter.","maxItems":20,"type":"array","items":{"type":"string","maxLength":30}},"active":{"type":"boolean"}}},"GraphSyncDto":{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"]},"CreateSchemaTypeDto":{"type":"object","properties":{"kind":{"type":"string","enum":["ENTITY","RELATION"]},"name":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{1,40}$"}},"required":["kind","name"]},"ReviewSchemaTypeDto":{"type":"object","properties":{"status":{"type":"string","enum":["REJECTED","CORE","APPROVED","PROPOSED"]}},"required":["status"]},"CreateThreadDto":{"type":"object","properties":{"question":{"type":"string","description":"Optional first question — used to derive the thread title.","maxLength":4000}}},"AskScopeDto":{"type":"object","properties":{"pathPrefix":{"type":"string","maxLength":2000},"tags":{"type":"array","items":{"type":"string"}}}},"PostMessageDto":{"type":"object","properties":{"question":{"type":"string","minLength":1,"maxLength":4000},"scope":{"$ref":"#/components/schemas/AskScopeDto"}},"required":["question"]},"PostChatMessageDto":{"type":"object","properties":{"content":{"type":"string","minLength":1,"maxLength":8000},"contextNodeId":{"type":"string","description":"Node the user currently has open — injected into the agent's context.","maxLength":64},"refNodeIds":{"description":"@mentioned node references attached to the message (max 5).","maxItems":5,"type":"array","items":{"type":"string","maxLength":64}}},"required":["content"]},"CreateWhiteboardDto":{"type":"object","properties":{"name":{"type":"string"},"parentId":{"type":"string","description":"Either parentId or path must locate the target parent."},"path":{"type":"string","description":"Full path incl. name — wins over parentId+name.","maxLength":2000},"createParents":{"type":"boolean"},"autoRename":{"type":"boolean","description":"On sibling name conflict: false → 409, true → \" (2)\" suffix."},"icon":{"type":"string","maxLength":16},"scene":{"type":"object","additionalProperties":true,"description":"Initial scene; defaults to an empty board."},"config":{"type":"object","additionalProperties":true}}},"PatchWhiteboardDto":{"type":"object","properties":{"scene":{"type":"object","additionalProperties":true},"merge":{"type":"boolean","description":"Only meaningful with a legacy {shapes,edges} scene: true = upsert those\nshapes/edges by id onto the existing board (everything else untouched),\nfalse/omitted = replace the whole scene."},"config":{"type":"object","additionalProperties":true},"icon":{"type":"string","maxLength":16}}},"CreateFormDto":{"type":"object","properties":{"name":{"type":"string"},"parentId":{"type":"string","description":"Either parentId or path must locate the target parent."},"path":{"type":"string","description":"Full path incl. name — wins over parentId+name.","maxLength":2000},"createParents":{"type":"boolean"},"autoRename":{"type":"boolean","description":"On sibling name conflict: false → 409, true → \" (2)\" suffix."},"icon":{"type":"string","maxLength":16},"fields":{"description":"Field definitions; defaults to an empty array (form under construction).","type":"array","items":{"type":"object"}},"targetDatabaseId":{"type":"string","description":"DATABASE node id whose rows should mirror this form's responses."},"config":{"type":"object","additionalProperties":true}}},"PatchFormDto":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"object"}},"targetDatabaseId":{"type":"string","nullable":true},"config":{"type":"object","additionalProperties":true},"icon":{"type":"string","maxLength":16}}},"CreateFormResponseDto":{"type":"object","properties":{"values":{"type":"object","additionalProperties":true}},"required":["values"]},"CreateCollectorDto":{"type":"object","properties":{"target":{"type":"string","enum":["database","spreadsheet"]}},"required":["target"]},"CreateCheckoutDto":{"type":"object","properties":{"planId":{"type":"string"},"seats":{"type":"number","minimum":1},"interval":{"description":"Billing cadence — \"month\" (default) or \"year\" (annual, ~17% off).","enum":["month","year"],"type":"string"}},"required":["planId"]},"ChangePlanDto":{"type":"object","properties":{"planId":{"type":"string"},"interval":{"type":"string","enum":["month","year"]}},"required":["planId"]},"CancelSubscriptionDto":{"type":"object","properties":{"reason":{"type":"string","enum":["too_expensive","not_using","missing_features","switching","other"]}}},"CreateSupportConversationDto":{"type":"object","properties":{"workspaceId":{"type":"string","description":"문의 당시 보고 있던 워크스페이스 — 담당자가 옆 정보(플랜·좌석)를 보는 데 쓴다."},"locale":{"type":"string","maxLength":10}}},"RateSupportDto":{"type":"object","properties":{"rating":{"type":"number","description":"1 = 👎, 5 = 👍","minimum":1,"maximum":5}},"required":["rating"]},"PostSupportMessageDto":{"type":"object","properties":{"content":{"type":"string","minLength":1,"maxLength":4000}},"required":["content"]},"StaffReplyDto":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":8000}},"required":["text"]},"KbSuggestionDto":{"type":"object","properties":{"question":{"type":"string","minLength":1,"maxLength":500},"answer":{"type":"string","minLength":1,"maxLength":8000}},"required":["question","answer"]},"CreateFeedbackDto":{"type":"object","properties":{"body":{"type":"string","minLength":2,"maxLength":8000,"description":"제보 본문. 무엇을 하려다 무엇이 일어났는지."},"title":{"type":"string","maxLength":200,"description":"한 줄 제목. 없으면 본문 첫 줄로 만든다."},"kind":{"enum":["BUG","FRICTION","IDEA","PRAISE","OTHER"],"type":"string","description":"오류/불편/제안/칭찬/기타"},"contactEmail":{"type":"string","maxLength":254,"format":"email","description":"답을 받고 싶을 때의 연락처"},"reporter":{"type":"string","maxLength":120,"description":"보내는 쪽 이름(에이전트 이름·앱 이름). 표시용."},"context":{"type":"object","additionalProperties":true,"description":"재현 단서 — 화면 주소·노드 id·도구 이름·오류 문구·버전"},"workspaceId":{"type":"string","description":"이 제보가 난 워크스페이스(알면)"}},"required":["body"]},"UpdateFeedbackDto":{"type":"object","properties":{"status":{"enum":["NEW","TRIAGED","PLANNED","DONE","DECLINED"],"type":"string"},"kind":{"enum":["BUG","FRICTION","IDEA","PRAISE","OTHER"],"type":"string","description":"사람이 다시 분류할 수 있다"},"adminNote":{"type":"string","maxLength":4000,"description":"처리 메모"}}},"CreateIngestionSourceDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"type":{"type":"string","enum":["mqtt","kafka","opcua"]},"enabled":{"type":"boolean"},"config":{"type":"object","additionalProperties":true,"description":"Connector-specific: for 'mqtt', { url, topics: [{ topic, logId, ...mapping }] }."}},"required":["name","type","config"]},"PatchIngestionSourceDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"enabled":{"type":"boolean"},"config":{"type":"object","additionalProperties":true}}},"AdminRequestCodeDto":{"type":"object","properties":{"email":{"type":"string","format":"email"}},"required":["email"]},"AdminVerifyCodeDto":{"type":"object","properties":{"email":{"type":"string","format":"email"},"code":{"type":"string","minLength":6,"maxLength":6}},"required":["email","code"]},"GrantCreditsDto":{"type":"object","properties":{"amount":{"type":"number","minimum":1}},"required":["amount"]},"SetPlanDto":{"type":"object","properties":{"planId":{"type":"string"},"seats":{"type":"number","minimum":1},"expiresAt":{"type":"string","nullable":true},"unlimitedSeats":{"type":"boolean","description":"Lift the plan's seat ceiling for this workspace (e.g. a Team pilot past 25)."}},"required":["planId","seats"]},"CreateReferrerDto":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string","description":"정산 연락처이자 본인 대시보드 접근 키 — 이 사람이 루터에 로그인하는 이메일이어야 한다."},"code":{"type":"string"},"ratePercent":{"type":"number","minimum":0,"maximum":100},"durationMonths":{"type":"number","description":"귀속된 팀의 결제 중 몇 개월치까지 분배할지. 0 = 무기한.","minimum":0,"maximum":120},"payoutNote":{"type":"string"},"note":{"type":"string"},"taxType":{"type":"string","enum":["individual","business","overseas"]},"withholdingPercent":{"type":"number","minimum":0,"maximum":100}},"required":["name","email"]},"UpdateReferrerDto":{"type":"object","properties":{"name":{"type":"string"},"code":{"type":"string","description":"홍보 링크의 코드. 바꾸면 이미 뿌린 옛 링크(/?ref=옛코드)는 그때부터 무효다."},"ratePercent":{"type":"number","minimum":0,"maximum":100},"durationMonths":{"type":"number","minimum":0,"maximum":120},"status":{"type":"string","enum":["active","paused"]},"payoutNote":{"type":"string"},"note":{"type":"string"},"taxType":{"type":"string","enum":["individual","business","overseas"]},"withholdingPercent":{"type":"number","minimum":0,"maximum":100}}},"ReferralPayoutDto":{"type":"object","properties":{"commissionIds":{"type":"array","items":{"type":"string"}},"payoutRef":{"type":"string","description":"이체 메모/날짜 등 송금 근거."}}},"PageViewDto":{"type":"object","properties":{"path":{"type":"string","maxLength":512},"referrer":{"type":"string","maxLength":512},"visitorId":{"type":"string","maxLength":64},"utmSource":{"type":"string","description":"광고 유입 태그. 프론트가 현재 주소의 utm_* 를, 없으면 저장해 둔 first-touch\n기록을 채워 보낸다(lib/attribution.ts). 길이는 그쪽 clip(255) 과 맞춘다 —\n넘쳐서 400 이 나면 방문 기록이 통째로 사라진다.","maxLength":255},"utmMedium":{"type":"string","maxLength":255},"utmCampaign":{"type":"string","maxLength":255},"utmContent":{"type":"string","maxLength":255},"utmTerm":{"type":"string","maxLength":255}},"required":["path"]},"DiagnoseRequestDto":{"type":"object","properties":{"text":{"type":"string","minLength":20,"maxLength":8000},"locale":{"type":"string","description":"UI locale, so the model is nudged to answer in the same language even for short/ambiguous input.","enum":["en","ko"]}},"required":["text"]},"MobileBridgeRequestDto":{"type":"object","properties":{"email":{"type":"string","maxLength":255,"format":"email"},"attribution":{"$ref":"#/components/schemas/AttributionDto"}},"required":["email"]},"ScaffoldAccessDto":{"type":"object","properties":{"subjectId":{"type":"string","maxLength":64},"level":{"type":"string","enum":["READ","WRITE","MANAGE"]},"subjectType":{"type":"string","description":"'USER'(기본) 또는 'GROUP'.","enum":["USER","GROUP"]}},"required":["subjectId","level"]},"ScaffoldDatabaseDto":{"type":"object","properties":{"properties":{"description":"Column defs IN DISPLAY ORDER:\n[{ name, type: title|text|number|select|multi_select|date|checkbox|url|person, options?:[{name,color}] }].\nFirst must be type 'title'. `id` is filled in for you when omitted — the caller\ncan't know the id the server will assign.","maxItems":50,"type":"array","items":{"type":"object"}},"views":{"description":"View defs: [{ name, type: table|board|gallery|calendar|timeline, config?:{groupBy,dateProp,endDateProp,sort,hiddenProps} }].\nOptional — omit for a single table view. `id` is filled in when omitted, and\nconfig may reference a column by NAME instead of its id.","maxItems":20,"type":"array","items":{"type":"object"}},"rows":{"type":"array","items":{"type":"object","properties":{"values":{"type":"object","additionalProperties":true},"body":{"type":"string"},"pageType":{"enum":["DOCUMENT","LOG","SPREADSHEET","WHITEBOARD","FORM","ISSUE_TRACKER","PRESENTATION","CRM","RECORDING","SIGNED"],"type":"string"},"pagePath":{"type":"string"}},"required":["values"]}},"rowPageType":{"type":"string","description":"ROW-PAGE-TYPE — 행을 열면 무엇이 만들어질지의 **기본값**.\n`DOCUMENT`(기본)·SIGNED·SPREADSHEET·WHITEBOARD·PRESENTATION·RECORDING·FORM·ISSUE_TRACKER.\n\n회의 기록 표는 행마다 녹음, 측정 표는 행마다 스프레드시트, 점검 기록은 행마다\n서명문서가 자연스럽다. 이게 없으면 표만 만들어 주고 \"행을 열면 녹음이 되게\"는\n사람이 표마다 손으로 다시 골라야 했다.\n\n행마다 다르게 하려면 위 `rows[].pageType`을 쓴다(노션의 `New ▾`와 같다).","enum":["DOCUMENT","SIGNED","SPREADSHEET","WHITEBOARD","PRESENTATION","RECORDING","FORM","ISSUE_TRACKER","LOG","CRM"]},"permissions":{"type":"object","additionalProperties":true,"description":"DB-PERM-001 — 표에 거는 자물쇠. `{ schemaLock?: 'open'|'managers',\nrowScope?: 'all'|'own', lockedProps?: ['승인'] }` (칸은 이름으로 적어도 된다).\n\n여기 없으면 \"지원서 표 만들어 줘, 서로 못 보게\" 같은 부탁의 절반만 이뤄진다 —\n표는 생기는데 잠그는 것은 사람이 따로 해야 했다."},"notifications":{"description":"DB-WATCH — 행이 들어오거나 바뀌거나 지워질 때 알릴 사람.\n`[{ userIds: ['…'], events: ['created'], filter?: { propId, op, value } }]`\n(propId는 칸 이름으로 적어도 된다). 노션에는 없는 기능이다.","maxItems":20,"type":"array","items":{"type":"object"}}},"required":["properties"]},"ScaffoldSpreadsheetDto":{"type":"object","properties":{"sheets":{"description":"SCAFFOLD-SHEETS — 시트를 **바로** 적는 길. 다른 종류는 전부 짐을 바로 받는데\n(`database: { properties }`, `form: { fields }`, `whiteboard: { scene }`)\n시트만 `data`로 한 겹 더 싸야 했다. 그래서 `spreadsheet: { sheets: [...] }`라고\n쓴 것이 **아무 말 없이 버려지고 빈 시트**가 만들어졌다(2026-08-29 실측:\n예산표 20칸이 통째로 사라졌는데 응답은 201이었다). 이제 둘 다 받는다.","maxItems":50,"type":"array","items":{"type":"object"}},"data":{"type":"object","additionalProperties":true},"config":{"type":"object","additionalProperties":true}}},"ScaffoldWhiteboardDto":{"type":"object","properties":{"scene":{"type":"object","additionalProperties":true},"config":{"type":"object","additionalProperties":true}}},"ScaffoldFormDto":{"type":"object","properties":{"fields":{"maxItems":50,"type":"array","items":{"type":"object"}},"targetDatabaseId":{"type":"string","maxLength":200},"collectInto":{"type":"string","description":"FORM-COLLECT — 응답 모을 곳을 **만들면서 같이** 붙인다.\n`'database'`면 폼 질문 그대로 칸이 있는 표가, `'spreadsheet'`면 응답이 깔리는\n시트가 함께 생긴다. 이게 없으면 \"지원서 폼 만들고 답은 표로 모아 줘\"의 절반만\n이뤄진다 — 폼은 생기는데 표는 사람이 따로 만들어 칸 이름을 맞춰야 했다.\n(`targetDatabaseId`로 이미 있는 표를 지정한 경우에는 무시한다.)","enum":["database","spreadsheet"]},"config":{"type":"object","additionalProperties":true}},"required":["fields"]},"ScaffoldIssuesDto":{"type":"object","properties":{"labels":{"description":"Label defs: [{ id?, name, color? }]. Omit for the default bug/enhancement/question set.","maxItems":100,"type":"array","items":{"type":"object"}},"types":{"description":"Issue type defs: [{ id?, name, color? }]. Omit for the default bug/feature/task set.","maxItems":25,"type":"array","items":{"type":"object"}},"config":{"type":"object","additionalProperties":true},"issues":{"description":"SEED-ISSUES — **씨앗 이슈.**\n\n예전엔 이 칸 자체가 없어서, 짓는 사람이 무엇을 적든 조용히 버려졌다. 검사\n(review·selftest)도 100점을 줬고, 만들기 응답도 201이었다 — 트래커가 실제로는\n0건이라는 걸 아무도 못 잡았다(2026-08-30 실측, 반려동물 미용실 워크스페이스).\n`title`만 필수 — `labels`/`type`은 이름으로 적으면 위 배열에서 찾아 잇는다.","maxItems":200,"type":"array","items":{"type":"object"}}}},"ScaffoldCrmDto":{"type":"object","properties":{"pipelines":{"description":"Pipeline defs: [{ id?, name, stages:[{ id?, name, probability(0-100), color? }] }]. Omit for the default 5-stage Sales Pipeline (Lead In 10%→Qualified 25%→Meeting 40%→Proposal 60%→Negotiation 80%). Validated by crm-schema's validatePipelines.","maxItems":20,"type":"array","items":{"type":"object"}},"fields":{"type":"object","additionalProperties":true,"description":"Custom field defs: { contact?:[{id?,name,type:text|number|select|date|url|checkbox,options?}], company?:[...], deal?:[...] }."},"config":{"type":"object","additionalProperties":true}}},"ScaffoldPresentationDto":{"type":"object","properties":{"slides":{"description":"Slides array (see presentations/presentation-schema.ts). Omit for a starter deck.","maxItems":200,"type":"array","items":{"type":"object"}},"theme":{"type":"object","additionalProperties":true,"description":"Deck theme (colors/fonts). Omit for the default theme."},"config":{"type":"object","additionalProperties":true}}},"ScaffoldLogDto":{"type":"object","properties":{"fields":{"description":"Field defs: [{ name, type, relation? }] — see logs/log-schema.ts. Omit for the default shape.","maxItems":64,"type":"array","items":{"type":"object"}},"config":{"type":"object","additionalProperties":true}}},"ScaffoldRecordingDto":{"type":"object","properties":{"expectedSpeakers":{"description":"Who is expected to speak, e.g. [\"김대표\",\"이팀장\"]. Speaker labels can't be\nassigned up front (diarization only happens once there is audio), so this\nis a naming HINT: at transcription time a voice that identifies itself is\nlabeled with the matching name instead of \"S1\".","maxItems":64,"type":"array","items":{"type":"string"}},"config":{"type":"object","additionalProperties":true}}},"ScaffoldSignedMemberDto":{"type":"object","properties":{"userId":{"type":"string","maxLength":64},"email":{"type":"string","maxLength":254,"format":"email"},"displayName":{"type":"string","description":"메일 결재자를 화면에 뭐라고 부를지. 없으면 메일 주소를 그대로 보여준다.","maxLength":80},"role":{"type":"string","description":"'AUTHOR'(기재자) | 'REVIEWER'(점검자) | 'APPROVER'(결재자). 안 적으면 자리로 정해진다.","enum":["AUTHOR","REVIEWER","APPROVER"]}}},"ScaffoldSignedStepDto":{"type":"object","properties":{"label":{"type":"string","description":"단계 이름, 예: \"기재자\" / \"점검자\" / \"부서장\".","maxLength":80},"rule":{"type":"string","description":"'ALL'(전원) | 'ANY'(아무나 한 명) | 'N_OF_M'(N명). 기본 ALL.","enum":["ALL","ANY","N_OF_M"]},"requiredCount":{"type":"number","description":"rule이 N_OF_M일 때 필요한 인원 수.","minimum":1},"members":{"minItems":1,"maxItems":50,"type":"array","items":{"$ref":"#/components/schemas/ScaffoldSignedMemberDto"}}},"required":["members"]},"ScaffoldSignedDto":{"type":"object","properties":{"content":{"type":"string","description":"본문 마크다운. 노드의 `content`를 써도 되고 여기 적어도 된다.","maxLength":200000},"mode":{"type":"string","description":"'APPROVAL'(전자결재, 기본) | 'RESEARCH_NOTE'(연구노트).\nRESEARCH_NOTE인데 결재라인을 안 적고 `reviewerUserId`만 주면\n\"기재자(만든 사람) → 점검자\" 두 단계가 자동으로 짜인다.","enum":["APPROVAL","RESEARCH_NOTE"]},"reviewerUserId":{"type":"string","description":"연구노트 프리셋용 점검자(연구책임자) userId.","maxLength":64},"noteMeta":{"type":"object","additionalProperties":true,"description":"과제번호·과제명·연구책임자·기관 등 표지 정보."},"approvalLine":{"description":"결재라인. 배열 순서가 곧 서명 순서다.","maxItems":20,"type":"array","items":{"$ref":"#/components/schemas/ScaffoldSignedStepDto"}}}},"ScaffoldNodeDto":{"type":"object","properties":{"name":{"type":"string","maxLength":200},"type":{"type":"string","description":"SCAFFOLD-TYPE — 여기서 노드 종류를 **`type`으로 적는 사람이 많다**(AI가 특히\n그렇게 쓴다). 실제 규칙은 `form: {…}` `database: {…}` 처럼 **그 종류의 짐을\n실어 주는 것**인데, 모르는 항목은 조용히 버려지므로 예전에는 `type: 'FORM'`이\n아무 말 없이 **빈 일반 문서**를 만들었다(2026-08-28 실측). 받아 두었다가\n짐이 없으면 무엇을 어떻게 적어야 하는지 말해 준다.","maxLength":40},"visibility":{"type":"string","description":"VIS-001 — 이 노드(와 그 아래 전부)를 누가 볼 수 있는지.\n'PRIVATE'면 만든 사람·워크스페이스 관리자·아래 `access`로 따로 준 사람만 본다.\n'PUBLIC'이면 워크스페이스 전체. 안 적으면 상위 폴더/워크스페이스 기본값을 따른다.\n\n이게 없으면 \"지원팀 폴더 만들고 서로 못 보게\"의 절반만 이뤄진다 — 폴더는\n생기는데 잠그는 것은 사람이 따로 해야 했다. 웹에 공개하는 것과는 다른 얘기다.","enum":["PUBLIC","PRIVATE"]},"access":{"description":"이 노드에 따로 주는 권한: `[{ subjectId, level: 'READ'|'WRITE'|'MANAGE' }]`.\n`visibility: 'PRIVATE'`와 같이 쓰면 \"이 세 명만 보는 폴더\"가 한 번에 만들어진다.","maxItems":100,"type":"array","items":{"$ref":"#/components/schemas/ScaffoldAccessDto"}},"content":{"type":"string","description":"Markdown body — for DOCUMENT nodes (narrative pages).","maxLength":200000},"icon":{"type":"string","maxLength":16},"database":{"description":"Makes this node a DATABASE (mutually exclusive with children/content).","allOf":[{"$ref":"#/components/schemas/ScaffoldDatabaseDto"}]},"spreadsheet":{"description":"Makes this node a SPREADSHEET (mutually exclusive with the other type payloads).","allOf":[{"$ref":"#/components/schemas/ScaffoldSpreadsheetDto"}]},"whiteboard":{"description":"Makes this node a WHITEBOARD (mutually exclusive with the other type payloads).","allOf":[{"$ref":"#/components/schemas/ScaffoldWhiteboardDto"}]},"form":{"description":"Makes this node a FORM (mutually exclusive with the other type payloads).","allOf":[{"$ref":"#/components/schemas/ScaffoldFormDto"}]},"issues":{"description":"Makes this node an ISSUE_TRACKER (mutually exclusive with the other type payloads).","allOf":[{"$ref":"#/components/schemas/ScaffoldIssuesDto"}]},"crm":{"description":"Makes this node a CRM (mutually exclusive with the other type payloads).","allOf":[{"$ref":"#/components/schemas/ScaffoldCrmDto"}]},"presentation":{"description":"Makes this node a PRESENTATION — a deck (mutually exclusive with the other type payloads).","allOf":[{"$ref":"#/components/schemas/ScaffoldPresentationDto"}]},"log":{"description":"Makes this node a LOG — a typed event table (mutually exclusive with the other type payloads).","allOf":[{"$ref":"#/components/schemas/ScaffoldLogDto"}]},"recording":{"description":"Makes this node a RECORDING — an empty audio slot (mutually exclusive with\nthe other type payloads). Scaffolding can only place the slot; the audio\nitself arrives later from the web recorder or an upload, which then\ntriggers transcription.","allOf":[{"$ref":"#/components/schemas/ScaffoldRecordingDto"}]},"signed":{"description":"Makes this node a SIGNED document — 서명문서 · 연구노트 (mutually exclusive\nwith the other type payloads). 결재라인까지 같이 짜인다.","allOf":[{"$ref":"#/components/schemas/ScaffoldSignedDto"}]},"children":{"maxItems":200,"type":"array","items":{"$ref":"#/components/schemas/ScaffoldNodeDto"}}},"required":["name"]},"ScaffoldWorkspaceDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"intent":{"type":"string","maxLength":2000},"rootPath":{"type":"string","maxLength":1000},"tree":{"maxItems":200,"type":"array","items":{"$ref":"#/components/schemas/ScaffoldNodeDto"}}},"required":["name","tree"]},"ScaffoldPlanDto":{"type":"object","properties":{"intent":{"type":"string","description":"Natural-language request, e.g. \"프로젝트 관리 워크스페이스 만들어줘\".","maxLength":2000},"locale":{"type":"string","description":"Optional 'en' | 'ko' override; otherwise inferred from the intent text.","maxLength":8}},"required":["intent"]},"ScaffoldApplyDto":{"type":"object","properties":{"intent":{"type":"string","description":"The natural-language request that produced this tree (for audit/telemetry).","maxLength":2000},"rootPath":{"type":"string","description":"Optional folder to create and nest the tree under, e.g. \"/프로젝트 관리\".","maxLength":1000},"tree":{"maxItems":200,"type":"array","items":{"$ref":"#/components/schemas/ScaffoldNodeDto"}}},"required":["tree"]},"CreateCrmDto":{"type":"object","properties":{"name":{"type":"string","maxLength":200},"path":{"type":"string"},"parentId":{"type":"string"},"icon":{"type":"string"},"pipelines":{"type":"object","description":"[{ id?, name, stages: [{ id?, name, probability?, color? }] }] — validated by crm-schema.validatePipelines."},"fields":{"type":"object","description":"{ contact?: FieldDef[], company?: FieldDef[], deal?: FieldDef[] } — validated by crm-schema.validateCrmFields."},"config":{"type":"object"},"createParents":{"type":"boolean"},"autoRename":{"type":"boolean"}}},"PatchCrmDto":{"type":"object","properties":{"pipelines":{"type":"object"},"fields":{"type":"object"},"config":{"type":"object"},"icon":{"type":"string"}}},"CreateCompanyDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"domain":{"type":"string","maxLength":300},"industry":{"type":"string","maxLength":200},"size":{"type":"string","maxLength":100},"address":{"type":"string","maxLength":1000},"description":{"type":"string","maxLength":10000},"ownerId":{"type":"string"},"source":{"type":"string","maxLength":200},"tags":{"type":"array","items":{"type":"string"}},"custom":{"type":"object","description":"{fieldId: value} — validated against the CRM's company field defs."}},"required":["name"]},"PatchCompanyDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"domain":{"type":"string","nullable":true},"industry":{"type":"string","nullable":true},"size":{"type":"string","nullable":true},"address":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"ownerId":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"tags":{"type":"array","items":{"type":"string"}},"custom":{"type":"object"}}},"CreateContactDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"email":{"type":"string","maxLength":320},"phone":{"type":"string","maxLength":50},"title":{"type":"string","maxLength":200},"companyId":{"type":"string"},"lifecycleStage":{"type":"string","enum":["lead","mql","sql","opportunity","customer","evangelist"]},"leadStatus":{"type":"string","enum":["new","attempting","connected","open_deal","unqualified"]},"ownerId":{"type":"string"},"source":{"type":"string","maxLength":200},"linkedinUrl":{"type":"string","maxLength":500},"tags":{"type":"array","items":{"type":"string"}},"custom":{"type":"object"}},"required":["name"]},"PatchContactDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"email":{"type":"string","nullable":true},"phone":{"type":"string","nullable":true},"title":{"type":"string","nullable":true},"companyId":{"type":"string","nullable":true,"description":"null detaches the contact from its company."},"lifecycleStage":{"type":"string","enum":["lead","mql","sql","opportunity","customer","evangelist"]},"leadStatus":{"type":"string","nullable":true},"ownerId":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"linkedinUrl":{"type":"string","nullable":true},"tags":{"type":"array","items":{"type":"string"}},"custom":{"type":"object"}}},"DealContactLinkDto":{"type":"object","properties":{"contactId":{"type":"string"},"role":{"type":"string","maxLength":50}},"required":["contactId"]},"CreateDealDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"value":{"type":"number","minimum":0},"currency":{"type":"string","maxLength":10},"pipelineId":{"type":"string","description":"Defaults to the first pipeline."},"stageId":{"type":"string","description":"Defaults to the pipeline's first stage."},"probability":{"type":"number","minimum":0,"maximum":100},"expectedCloseDate":{"type":"string"},"priority":{"type":"string","enum":["low","medium","high"]},"ownerId":{"type":"string"},"source":{"type":"string","maxLength":200},"tags":{"type":"array","items":{"type":"string"}},"companyId":{"type":"string"},"primaryContactId":{"type":"string"},"contacts":{"description":"Extra participants with roles: [{ contactId, role? }].","type":"array","items":{"$ref":"#/components/schemas/DealContactLinkDto"}},"custom":{"type":"object"}},"required":["name"]},"PatchDealDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"value":{"type":"number","minimum":0},"currency":{"type":"string","maxLength":10},"status":{"type":"string","description":"won/lost sets closedAt (+reason); open reopens.","enum":["open","won","lost"]},"wonLostReason":{"type":"string","nullable":true,"maxLength":500},"probability":{"type":"number","nullable":true,"description":"null reverts to the stage's default probability."},"expectedCloseDate":{"type":"string","nullable":true},"priority":{"type":"string","nullable":true},"ownerId":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"tags":{"type":"array","items":{"type":"string"}},"companyId":{"type":"string","nullable":true},"primaryContactId":{"type":"string","nullable":true},"contacts":{"description":"Full replacement of the participants list.","type":"array","items":{"$ref":"#/components/schemas/DealContactLinkDto"}},"custom":{"type":"object"}}},"MoveDealDto":{"type":"object","properties":{"stageId":{"type":"string","description":"Target stage (same or another pipeline of this CRM)."},"pipelineId":{"type":"string"},"position":{"type":"number","description":"Board ordering within the target column."}},"required":["stageId"]},"CreateActivityDto":{"type":"object","properties":{"type":{"type":"string","enum":["note","call","email","meeting"]},"subject":{"type":"string","maxLength":300},"body":{"type":"string","maxLength":50000},"occurredAt":{"type":"string"},"contactId":{"type":"string"},"companyId":{"type":"string"},"dealId":{"type":"string"}},"required":["type"]},"CreateTaskDto":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":300},"type":{"type":"string","enum":["todo","call","email","meeting"]},"dueAt":{"type":"string"},"assigneeId":{"type":"string"},"contactId":{"type":"string"},"companyId":{"type":"string"},"dealId":{"type":"string"}},"required":["title"]},"PatchTaskDto":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":300},"type":{"type":"string","enum":["todo","call","email","meeting"]},"status":{"type":"string","description":"done stamps completedAt (+ a task_done timeline entry); open clears it.","enum":["open","done"]},"dueAt":{"type":"string","nullable":true},"assigneeId":{"type":"string","nullable":true},"contactId":{"type":"string","nullable":true},"companyId":{"type":"string","nullable":true},"dealId":{"type":"string","nullable":true}}},"ImportRowsDto":{"type":"object","properties":{"entity":{"type":"string","enum":["contact","company","deal"]},"rows":{"description":"Parsed rows (client parses CSV): array of column→value objects.","type":"array","items":{"type":"object"}}},"required":["entity","rows"]},"CreateRecordingDto":{"type":"object","properties":{"expectedSpeakers":{"description":"Known attendees, used as naming hints when this recording is transcribed.","maxItems":64,"type":"array","items":{"type":"string"}},"name":{"type":"string"},"parentId":{"type":"string"},"path":{"type":"string"},"icon":{"type":"string","maxLength":16},"createParents":{"type":"boolean"},"autoRename":{"type":"boolean"}}},"PatchRecordingDto":{"type":"object","properties":{"speakerNames":{"type":"object","additionalProperties":{"type":"string"},"description":"{\"S1\":\"김대표\"} — validated/bounded in validateSpeakerNames."},"expectedSpeakers":{"description":"Known attendees, used as naming hints during transcription.","maxItems":64,"type":"array","items":{"type":"string"}},"icon":{"type":"string","maxLength":16}}},"SummarizeRecordingDto":{"type":"object","properties":{"locale":{"type":"string","enum":["ko","en"]},"format":{"type":"string","description":"'summary' (default) = short minutes; 'onepager' = the detailed briefing for\nsomeone who wasn't in the meeting. Each lands in its own document.","enum":["summary","onepager"]}}},"CreatePresentationDto":{"type":"object","properties":{"name":{"type":"string"},"parentId":{"type":"string","description":"Either parentId or path must locate the target parent."},"path":{"type":"string","description":"Full path incl. name — wins over parentId+name.","maxLength":2000},"createParents":{"type":"boolean"},"autoRename":{"type":"boolean","description":"On sibling name conflict: false → 409, true → \" (2)\" suffix."},"icon":{"type":"string","maxLength":16},"theme":{"type":"object","additionalProperties":true,"description":"Design theme (Outlier theme.json shape); defaults applied for missing keys."},"slides":{"description":"Initial slides; defaults to an empty deck.","type":"array","items":{"type":"object"}},"config":{"type":"object","additionalProperties":true}}},"PatchPresentationDto":{"type":"object","properties":{"theme":{"type":"object","additionalProperties":true},"slides":{"description":"Full replacement of the slides array.","type":"array","items":{"type":"object"}},"config":{"type":"object","additionalProperties":true},"icon":{"type":"string","maxLength":16}}},"AppendSlidesDto":{"type":"object","properties":{"slides":{"type":"array","items":{"type":"object"}}},"required":["slides"]},"UpdateSlideDto":{"type":"object","properties":{"slide":{"type":"object","additionalProperties":true,"description":"Partial slide fields to merge into the slide with this id."}},"required":["slide"]},"ReorderSlidesDto":{"type":"object","properties":{"order":{"description":"Slide ids in the desired order; must be a permutation of existing ids.","type":"array","items":{"type":"string"}}},"required":["order"]},"DiagramSlideDto":{"type":"object","properties":{"type":{"type":"string","description":"architecture | workflow | sequence | dataflow | lifecycle"},"spec":{"type":"object","additionalProperties":true,"description":"Typed diagram spec (the renderer's JSON IR). Validated fail-closed."},"title":{"type":"string","description":"Assertion-style slide title. Also drawn as the slide's heading."},"subtitle":{"type":"string"},"blocks":{"description":"Text spine — the diagram itself is never indexed, so the facts go here.","type":"array","items":{"type":"object"}},"notes":{"type":"string"},"quality":{"type":"string","description":"'standard' (default) or 'showcase' — the strict composition bar."},"slideId":{"type":"string","description":"Replace this slide's drawing instead of appending a new slide."}},"required":["type","spec"]},"PresentationPublicSettingsDto":{"type":"object","properties":{"isPublic":{"type":"boolean"},"noIndex":{"type":"boolean"},"password":{"type":"string","nullable":true,"description":"PUBLIC-PARITY — 덱도 다른 타입과 **같은 공개 설정**을 갖는다(창업자 지적\n2026-08-28). 빈 문자열이나 null이면 잠금을 푼다."},"allowClone":{"type":"boolean"},"expiresAt":{"type":"string","nullable":true}}},"GenerateImageDto":{"type":"object","properties":{"prompt":{"type":"string","minLength":2,"maxLength":2000},"nodeId":{"type":"string","description":"Optional node to attach the image to (permission-checked)."},"context":{"type":"object","properties":{"title":{"type":"string"},"points":{"type":"array","items":{"type":"string"}},"palette":{"type":"array","items":{"type":"string"}},"images":{"type":"array","items":{"type":"string"}}},"required":[]}},"required":["prompt"]},"DescribeImageDto":{"type":"object","properties":{"attachmentId":{"type":"string"},"nodeId":{"type":"string"}},"required":["attachmentId"]},"RemoveBackgroundDto":{"type":"object","properties":{"attachmentId":{"type":"string"},"nodeId":{"type":"string"}},"required":["attachmentId"]},"ApprovalMemberDto":{"type":"object","properties":{"userId":{"type":"string","maxLength":64},"email":{"type":"string","maxLength":254,"format":"email"},"displayName":{"type":"string","description":"외부 결재자를 화면에 뭐라고 부를지. 없으면 메일 주소를 그대로 보여준다.","maxLength":80},"role":{"type":"string","enum":["AUTHOR","REVIEWER","APPROVER"]}}},"ApprovalStepDto":{"type":"object","properties":{"label":{"type":"string","maxLength":80},"rule":{"type":"string","enum":["ALL","ANY","N_OF_M"]},"requiredCount":{"type":"number","minimum":1},"members":{"minItems":1,"maxItems":50,"type":"array","items":{"$ref":"#/components/schemas/ApprovalMemberDto"}}},"required":["members"]},"CreateSignedDocDto":{"type":"object","properties":{"name":{"type":"string","maxLength":200},"path":{"type":"string","description":"트리 경로로 만들 때, 예: \"/연구노트/2026-08-25 실험기록\".","maxLength":2000},"parentId":{"type":"string"},"createParents":{"type":"boolean"},"autoRename":{"type":"boolean"},"icon":{"type":"string","maxLength":16},"content":{"type":"string","description":"본문 마크다운. 올리기(submit) 전까지는 얼마든지 고칠 수 있다.","maxLength":200000},"mode":{"type":"string","enum":["APPROVAL","RESEARCH_NOTE"]},"reviewerUserId":{"type":"string","description":"연구노트 프리셋용 점검자(연구책임자) userId.","maxLength":64},"noteMeta":{"type":"object","additionalProperties":true},"approvalLine":{"maxItems":20,"type":"array","items":{"$ref":"#/components/schemas/ApprovalStepDto"}}}},"SetApprovalLineDto":{"type":"object","properties":{"steps":{"description":"APPROVAL-LINE-ALIAS — **만들 때 쓰는 이름을 고칠 때도 그대로 받아 준다.**\n\n서명문서를 만드는 `POST /signed-docs`의 결재라인 칸은 `approvalLine`이다.\n고치는 이 API만 `steps`를 요구해서, 만들 때 쓴 이름을 그대로 재사용하면\n(`{approvalLine: [...]}`) 전역 whitelist가 조용히 벗겨내고 \"steps must be\nan array\"라는 **원인과 무관한 오류**가 났다(2026-08-30 실측).\n\n둘 다 `@IsOptional`로 두고 실제 검증(배열인지·1~20개인지·필수인지)은\n컨트롤러에서 둘을 합친 뒤 한 번만 한다 — 여기서 각각 required 로 걸면\n\"둘 다 안 줬을 때\" 두 개의 서로 다른 오류가 동시에 난다.","minItems":1,"maxItems":20,"type":"array","items":{"$ref":"#/components/schemas/ApprovalStepDto"}},"approvalLine":{"minItems":1,"maxItems":20,"type":"array","items":{"$ref":"#/components/schemas/ApprovalStepDto"}}}},"ResearchNotePresetDto":{"type":"object","properties":{"reviewerUserId":{"type":"string","maxLength":64},"noteMeta":{"type":"object","additionalProperties":true,"description":"과제번호·과제명·연구책임자 등 표지 정보."}},"required":["reviewerUserId"]},"ReauthDto":{"type":"object","properties":{"code":{"type":"string","maxLength":12}}},"RejectDto":{"type":"object","properties":{"code":{"type":"string","maxLength":12},"comment":{"type":"string","maxLength":2000}},"required":["comment"]},"ReviseDto":{"type":"object","properties":{"note":{"type":"string","maxLength":2000}},"required":["note"]},"PublicSignDto":{"type":"object","properties":{"code":{"type":"string","maxLength":12},"signerName":{"type":"string","description":"서명하는 본인이 적는 이름. 결재선을 짤 때 이름을 안 넣으면 메일 주소가\n이름 자리에 들어가 사본에 주소가 두 번 나온다. 본인이 댄 이름이 증빙으로도\n낫다 — 남이 대신 적어 준 이름보다.","maxLength":60}},"required":["code"]},"PublicRejectDto":{"type":"object","properties":{"comment":{"type":"string","maxLength":2000}},"required":["comment"]},"BulkSignDto":{"type":"object","properties":{"code":{"type":"string","maxLength":12},"nodeIds":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"string"}}},"required":["nodeIds"]},"QueueDraftDto":{"type":"object","properties":{"userId":{"type":"string"},"email":{"type":"string","format":"email"},"subject":{"type":"string","minLength":1,"maxLength":300},"bodyHtml":{"type":"string","minLength":1},"lang":{"type":"string","enum":["ko","en"]},"kind":{"type":"string","description":"Segment kind: 'reengage' (new) · 'reengage_7d' · 'reengage_30d'. Defaults to 'reengage'.","enum":["reengage","reengage_7d","reengage_30d"]},"domainInfo":{"type":"object","additionalProperties":true},"personalization":{"type":"object","additionalProperties":true}},"required":["email","subject","bodyHtml"]},"PublicLayoutPatchDto":{"type":"object","properties":{"cover":{"type":"boolean"},"toc":{"type":"boolean"},"width":{"type":"string","enum":["narrow","wide"]},"paging":{"type":"boolean"}}},"PublishDto":{"type":"object","properties":{"skin":{"type":"string","enum":["classic","minimal","magazine","paper","tech-dark","vivid","manual","book","editorial","bento","glass","mesh","immersive","brutal","neumorph","y2k"]},"layout":{"$ref":"#/components/schemas/PublicLayoutPatchDto"}}},"PublicSettingsDto":{"type":"object","properties":{"isPublic":{"type":"boolean"},"allowCommits":{"type":"boolean"},"noIndex":{"type":"boolean"},"expiresAt":{"type":"string","nullable":true},"allowClone":{"type":"boolean"},"allowComments":{"type":"boolean"},"password":{"type":"string","nullable":true,"maxLength":200},"skin":{"type":"string","enum":["classic","minimal","magazine","paper","tech-dark","vivid","manual","book","editorial","bento","glass","mesh","immersive","brutal","neumorph","y2k"]},"layout":{"$ref":"#/components/schemas/PublicLayoutPatchDto"}}},"MergeCommitDto":{"type":"object","properties":{"force":{"type":"boolean"}}},"RejectCommitDto":{"type":"object","properties":{"reason":{"type":"string","maxLength":2000}}},"UnlockPublicDocDto":{"type":"object","properties":{"password":{"type":"string","maxLength":200}},"required":["password"]},"ProposeCommitDto":{"type":"object","properties":{"contentMd":{"type":"string"},"message":{"type":"string","maxLength":500}},"required":["contentMd"]},"PublicCommentDto":{"type":"object","properties":{"body":{"type":"string","maxLength":2000}},"required":["body"]},"CloneDocDto":{"type":"object","properties":{"targetWorkspaceId":{"type":"string"}},"required":["targetWorkspaceId"]},"PublicDesignDto":{"type":"object","properties":{"layout":{"type":"string","enum":["table","cards","gallery","board","timeline","calendar","list","chart","ranking"]},"skin":{"type":"string","enum":["clean","paper","dark","vivid","bento","brutal"]}}},"PublishNodeDto":{"type":"object","properties":{"view":{"type":"string","description":"공개 페이지에서 처음 보여줄 뷰(표에서만 뜻이 있다).","maxLength":64},"includeChildren":{"type":"boolean","description":"하위 문서도 같이 공개할지. **기본은 안 한다** — 아래에 뭐가 달려 있는지\n주인이 다 기억하지 못하는데 그것까지 나가면 버튼 한 번이 사고가 된다."},"design":{"description":"PUBLIC-DB-DESIGN — 공개 페이지의 보기 방식·분위기(표에서만 뜻이 있다).","allOf":[{"$ref":"#/components/schemas/PublicDesignDto"}]}}},"PublicNodeSettingsDto":{"type":"object","properties":{"isPublic":{"type":"boolean"},"noIndex":{"type":"boolean"},"allowClone":{"type":"boolean"},"expiresAt":{"type":"string","nullable":true,"description":"ISO 날짜 또는 null(만료 해제)."},"view":{"type":"string","nullable":true,"maxLength":64},"includeChildren":{"type":"boolean"},"password":{"type":"string","nullable":true,"description":"빈 문자열이나 null이면 잠금을 푼다."},"design":{"description":"PUBLIC-DB-DESIGN — 공개 페이지의 보기 방식·분위기(표에서만 뜻이 있다).","allOf":[{"$ref":"#/components/schemas/PublicDesignDto"}]}}},"PublicSignClaimDto":{"type":"object","properties":{"email":{"type":"string","maxLength":200}},"required":["email"]},"PublicSignByEmailDto":{"type":"object","properties":{"email":{"type":"string","maxLength":200},"code":{"type":"string","maxLength":12},"signerName":{"type":"string","description":"서명하는 사람이 직접 적은 자기 이름. 증빙으로는 이게 제일 낫다.","maxLength":60}},"required":["email","code"]},"UnlockNodeDto":{"type":"object","properties":{"password":{"type":"string","maxLength":200}},"required":["password"]},"CloneNodeDto":{"type":"object","properties":{"targetWorkspaceId":{"type":"string"}},"required":["targetWorkspaceId"]},"RegisterClientDto":{"type":"object","properties":{"client_name":{"type":"string"},"redirect_uris":{"type":"array","items":{"type":"string"}}},"required":["redirect_uris"]},"ConsentDto":{"type":"object","properties":{"clientId":{"type":"string"},"redirectUri":{"type":"string"},"codeChallenge":{"type":"string"},"codeChallengeMethod":{"type":"string"},"workspaceId":{"type":"string"},"permission":{"type":"string","enum":["read","write"]},"state":{"type":"string"}},"required":["clientId","redirectUri","codeChallenge","workspaceId","permission"]}}}}