An experimental TypeSpec syntax for Lexicon

wip

+1461 -2
+28
packages/emitter/test/integration/atproto/input/tools/ozone/communication/createTemplate.tsp
··· 1 + import "@tlex/emitter"; 2 + 3 + namespace tools.ozone.communication.createTemplate { 4 + model DuplicateTemplateName {} 5 + 6 + @doc("Administrative action to create a new, re-usable communication (email for now) template.") 7 + @procedure 8 + @errors(DuplicateTemplateName) 9 + op main(input: { 10 + @doc("Subject of the message, used in emails.") 11 + @required 12 + subject: string; 13 + 14 + @doc("Content of the template, markdown supported, can contain variable placeholders.") 15 + @required 16 + contentMarkdown: string; 17 + 18 + @doc("Name of the template.") 19 + @required 20 + name: string; 21 + 22 + @doc("Message language.") 23 + lang?: language; 24 + 25 + @doc("DID of the user who is creating the template.") 26 + createdBy?: did; 27 + }): tools.ozone.communication.defs.TemplateView; 28 + }
+30
packages/emitter/test/integration/atproto/input/tools/ozone/communication/defs.tsp
··· 1 + import "@tlex/emitter"; 2 + 3 + namespace tools.ozone.communication.defs { 4 + model TemplateView { 5 + @required id: string; 6 + 7 + @doc("Name of the template.") 8 + @required 9 + name: string; 10 + 11 + @doc("Content of the template, can contain markdown and variable placeholders.") 12 + subject?: string; 13 + 14 + @doc("Subject of the message, used in emails.") 15 + @required 16 + contentMarkdown: string; 17 + 18 + @required disabled: boolean; 19 + 20 + @doc("Message language.") 21 + lang?: language; 22 + 23 + @doc("DID of the user who last updated the template.") 24 + @required 25 + lastUpdatedBy: did; 26 + 27 + @required createdAt: datetime; 28 + @required updatedAt: datetime; 29 + } 30 + }
+9
packages/emitter/test/integration/atproto/input/tools/ozone/communication/deleteTemplate.tsp
··· 1 + import "@tlex/emitter"; 2 + 3 + namespace tools.ozone.communication.deleteTemplate { 4 + @doc("Delete a communication template.") 5 + @procedure 6 + op main(input: { 7 + @required id: string; 8 + }): void; 9 + }
+9
packages/emitter/test/integration/atproto/input/tools/ozone/communication/listTemplates.tsp
··· 1 + import "@tlex/emitter"; 2 + 3 + namespace tools.ozone.communication.listTemplates { 4 + @doc("Get list of all communication templates.") 5 + @query 6 + op main(): { 7 + @required communicationTemplates: tools.ozone.communication.defs.TemplateView[]; 8 + }; 9 + }
+31
packages/emitter/test/integration/atproto/input/tools/ozone/communication/updateTemplate.tsp
··· 1 + import "@tlex/emitter"; 2 + 3 + namespace tools.ozone.communication.updateTemplate { 4 + model DuplicateTemplateName {} 5 + 6 + @doc("Administrative action to update an existing communication template. Allows passing partial fields to patch specific fields only.") 7 + @procedure 8 + @errors(DuplicateTemplateName) 9 + op main(input: { 10 + @doc("ID of the template to be updated.") 11 + @required 12 + id: string; 13 + 14 + @doc("Name of the template.") 15 + name?: string; 16 + 17 + @doc("Message language.") 18 + lang?: language; 19 + 20 + @doc("Content of the template, markdown supported, can contain variable placeholders.") 21 + contentMarkdown?: string; 22 + 23 + @doc("Subject of the message, used in emails.") 24 + subject?: string; 25 + 26 + @doc("DID of the user who is updating the template.") 27 + updatedBy?: did; 28 + 29 + disabled?: boolean; 30 + }): tools.ozone.communication.defs.TemplateView; 31 + }
+52
packages/emitter/test/integration/atproto/input/tools/ozone/hosting/getAccountHistory.tsp
··· 1 + import "@tlex/emitter"; 2 + 3 + namespace tools.ozone.hosting.getAccountHistory { 4 + @doc("Get account history, e.g. log of updated email addresses or other identity information.") 5 + @query 6 + op main( 7 + @required did: did, 8 + events?: ("accountCreated" | "emailUpdated" | "emailConfirmed" | "passwordUpdated" | "handleUpdated" | string)[], 9 + cursor?: string, 10 + 11 + @minValue(1) 12 + @maxValue(100) 13 + limit?: int32 = 50 14 + ): { 15 + cursor?: string; 16 + @required events: Event[]; 17 + }; 18 + 19 + model Event { 20 + @required 21 + details: ( 22 + | AccountCreated 23 + | EmailUpdated 24 + | EmailConfirmed 25 + | PasswordUpdated 26 + | HandleUpdated 27 + | unknown 28 + ); 29 + 30 + @required createdBy: string; 31 + @required createdAt: datetime; 32 + } 33 + 34 + model AccountCreated { 35 + email?: string; 36 + handle?: handle; 37 + } 38 + 39 + model EmailUpdated { 40 + @required email: string; 41 + } 42 + 43 + model EmailConfirmed { 44 + @required email: string; 45 + } 46 + 47 + model PasswordUpdated {} 48 + 49 + model HandleUpdated { 50 + @required handle: handle; 51 + } 52 + }
+603
packages/emitter/test/integration/atproto/input/tools/ozone/moderation/defs.tsp
··· 1 + import "@tlex/emitter"; 2 + 3 + namespace tools.ozone.moderation.defs { 4 + model ModEventView { 5 + @required id: int32; 6 + 7 + @required 8 + event: 9 + | ModEventTakedown 10 + | ModEventReverseTakedown 11 + | ModEventComment 12 + | ModEventReport 13 + | ModEventLabel 14 + | ModEventAcknowledge 15 + | ModEventEscalate 16 + | ModEventMute 17 + | ModEventUnmute 18 + | ModEventMuteReporter 19 + | ModEventUnmuteReporter 20 + | ModEventEmail 21 + | ModEventResolveAppeal 22 + | ModEventDivert 23 + | ModEventTag 24 + | AccountEvent 25 + | IdentityEvent 26 + | RecordEvent 27 + | ModEventPriorityScore 28 + | AgeAssuranceEvent 29 + | AgeAssuranceOverrideEvent 30 + | RevokeAccountCredentialsEvent; 31 + 32 + @required 33 + subject: 34 + | com.atproto.admin.defs.RepoRef 35 + | com.atproto.repo.strongRef.Main 36 + | chat.bsky.convo.defs.MessageRef; 37 + 38 + @required subjectBlobCids: string[]; 39 + @required createdBy: did; 40 + @required createdAt: datetime; 41 + creatorHandle?: string; 42 + subjectHandle?: string; 43 + modTool?: ModTool; 44 + } 45 + 46 + model ModEventViewDetail { 47 + @required id: int32; 48 + 49 + @required 50 + event: 51 + | ModEventTakedown 52 + | ModEventReverseTakedown 53 + | ModEventComment 54 + | ModEventReport 55 + | ModEventLabel 56 + | ModEventAcknowledge 57 + | ModEventEscalate 58 + | ModEventMute 59 + | ModEventUnmute 60 + | ModEventMuteReporter 61 + | ModEventUnmuteReporter 62 + | ModEventEmail 63 + | ModEventResolveAppeal 64 + | ModEventDivert 65 + | ModEventTag 66 + | AccountEvent 67 + | IdentityEvent 68 + | RecordEvent 69 + | ModEventPriorityScore 70 + | AgeAssuranceEvent 71 + | AgeAssuranceOverrideEvent 72 + | RevokeAccountCredentialsEvent; 73 + 74 + @required 75 + subject: RepoView | RepoViewNotFound | RecordView | RecordViewNotFound; 76 + 77 + @required subjectBlobs: BlobView[]; 78 + @required createdBy: did; 79 + @required createdAt: datetime; 80 + modTool?: ModTool; 81 + } 82 + 83 + model SubjectStatusView { 84 + @required id: int32; 85 + 86 + @required 87 + subject: 88 + | com.atproto.admin.defs.RepoRef 89 + | com.atproto.repo.strongRef.Main 90 + | chat.bsky.convo.defs.MessageRef; 91 + 92 + hosting?: AccountHosting | RecordHosting; 93 + 94 + subjectBlobCids?: cid[]; 95 + subjectRepoHandle?: string; 96 + 97 + @doc("Timestamp referencing when the last update was made to the moderation status of the subject") 98 + @required 99 + updatedAt: datetime; 100 + 101 + @doc("Timestamp referencing the first moderation status impacting event was emitted on the subject") 102 + @required 103 + createdAt: datetime; 104 + 105 + @required reviewState: SubjectReviewState; 106 + 107 + @doc("Sticky comment on the subject.") 108 + comment?: string; 109 + 110 + @doc("Numeric value representing the level of priority. Higher score means higher priority.") 111 + @minValue(0) 112 + @maxValue(100) 113 + priorityScore?: int32; 114 + 115 + muteUntil?: datetime; 116 + muteReportingUntil?: datetime; 117 + lastReviewedBy?: did; 118 + lastReviewedAt?: datetime; 119 + lastReportedAt?: datetime; 120 + 121 + @doc("Timestamp referencing when the author of the subject appealed a moderation action") 122 + lastAppealedAt?: datetime; 123 + 124 + takendown?: boolean; 125 + 126 + @doc("True indicates that the a previously taken moderator action was appealed against, by the author of the content. False indicates last appeal was resolved by moderators.") 127 + appealed?: boolean; 128 + 129 + suspendUntil?: datetime; 130 + tags?: string[]; 131 + 132 + @doc("Statistics related to the account subject") 133 + accountStats?: AccountStats; 134 + 135 + @doc("Statistics related to the record subjects authored by the subject's account") 136 + recordsStats?: RecordsStats; 137 + 138 + @doc("Current age assurance state of the subject.") 139 + ageAssuranceState?: "pending" | "assured" | "unknown" | "reset" | "blocked" | string; 140 + 141 + @doc("Whether or not the last successful update to age assurance was made by the user or admin.") 142 + ageAssuranceUpdatedBy?: "admin" | "user" | string; 143 + } 144 + 145 + @doc("Detailed view of a subject. For record subjects, the author's repo and profile will be returned.") 146 + model SubjectView { 147 + @required type: com.atproto.moderation.defs.SubjectType; 148 + @required subject: string; 149 + status?: SubjectStatusView; 150 + repo?: RepoViewDetail; 151 + profile?: unknown; 152 + record?: RecordViewDetail; 153 + } 154 + 155 + @doc("Statistics about a particular account subject") 156 + model AccountStats { 157 + @doc("Total number of reports on the account") 158 + reportCount?: int32; 159 + 160 + @doc("Total number of appeals against a moderation action on the account") 161 + appealCount?: int32; 162 + 163 + @doc("Number of times the account was suspended") 164 + suspendCount?: int32; 165 + 166 + @doc("Number of times the account was escalated") 167 + escalateCount?: int32; 168 + 169 + @doc("Number of times the account was taken down") 170 + takedownCount?: int32; 171 + } 172 + 173 + @doc("Statistics about a set of record subject items") 174 + model RecordsStats { 175 + @doc("Cumulative sum of the number of reports on the items in the set") 176 + totalReports?: int32; 177 + 178 + @doc("Number of items that were reported at least once") 179 + reportedCount?: int32; 180 + 181 + @doc("Number of items that were escalated at least once") 182 + escalatedCount?: int32; 183 + 184 + @doc("Number of items that were appealed at least once") 185 + appealedCount?: int32; 186 + 187 + @doc("Total number of item in the set") 188 + subjectCount?: int32; 189 + 190 + @doc("Number of item currently in \"reviewOpen\" or \"reviewEscalated\" state") 191 + pendingCount?: int32; 192 + 193 + @doc("Number of item currently in \"reviewNone\" or \"reviewClosed\" state") 194 + processedCount?: int32; 195 + 196 + @doc("Number of item currently taken down") 197 + takendownCount?: int32; 198 + } 199 + 200 + union SubjectReviewState { 201 + "#reviewOpen", 202 + "#reviewEscalated", 203 + "#reviewClosed", 204 + "#reviewNone", 205 + string, 206 + } 207 + 208 + @doc("Moderator review status of a subject: Open. Indicates that the subject needs to be reviewed by a moderator") 209 + @token 210 + model ReviewOpen {} 211 + 212 + @doc("Moderator review status of a subject: Escalated. Indicates that the subject was escalated for review by a moderator") 213 + @token 214 + model ReviewEscalated {} 215 + 216 + @doc("Moderator review status of a subject: Closed. Indicates that the subject was already reviewed and resolved by a moderator") 217 + @token 218 + model ReviewClosed {} 219 + 220 + @doc("Moderator review status of a subject: Unnecessary. Indicates that the subject does not need a review at the moment but there is probably some moderation related metadata available for it") 221 + @token 222 + model ReviewNone {} 223 + 224 + @doc("Take down a subject permanently or temporarily") 225 + model ModEventTakedown { 226 + comment?: string; 227 + 228 + @doc("Indicates how long the takedown should be in effect before automatically expiring.") 229 + durationInHours?: int32; 230 + 231 + @doc("If true, all other reports on content authored by this account will be resolved (acknowledged).") 232 + acknowledgeAccountSubjects?: boolean; 233 + 234 + @doc("Names/Keywords of the policies that drove the decision.") 235 + @maxItems(5) 236 + policies?: string[]; 237 + } 238 + 239 + @doc("Revert take down action on a subject") 240 + model ModEventReverseTakedown { 241 + @doc("Describe reasoning behind the reversal.") 242 + comment?: string; 243 + } 244 + 245 + @doc("Resolve appeal on a subject") 246 + model ModEventResolveAppeal { 247 + @doc("Describe resolution.") 248 + comment?: string; 249 + } 250 + 251 + @doc("Add a comment to a subject. An empty comment will clear any previously set sticky comment.") 252 + model ModEventComment { 253 + comment?: string; 254 + 255 + @doc("Make the comment persistent on the subject") 256 + sticky?: boolean; 257 + } 258 + 259 + @doc("Report a subject") 260 + model ModEventReport { 261 + comment?: string; 262 + 263 + @doc("Set to true if the reporter was muted from reporting at the time of the event. These reports won't impact the reviewState of the subject.") 264 + isReporterMuted?: boolean; 265 + 266 + @required reportType: com.atproto.moderation.defs.ReasonType; 267 + } 268 + 269 + @doc("Apply/Negate labels on a subject") 270 + model ModEventLabel { 271 + comment?: string; 272 + @required createLabelVals: string[]; 273 + @required negateLabelVals: string[]; 274 + 275 + @doc("Indicates how long the label will remain on the subject. Only applies on labels that are being added.") 276 + durationInHours?: int32; 277 + } 278 + 279 + @doc("Set priority score of the subject. Higher score means higher priority.") 280 + model ModEventPriorityScore { 281 + comment?: string; 282 + 283 + @minValue(0) 284 + @maxValue(100) 285 + @required 286 + score: int32; 287 + } 288 + 289 + @doc("Age assurance info coming directly from users. Only works on DID subjects.") 290 + model AgeAssuranceEvent { 291 + @doc("The date and time of this write operation.") 292 + @required 293 + createdAt: datetime; 294 + 295 + @doc("The status of the age assurance process.") 296 + @required 297 + status: "unknown" | "pending" | "assured" | string; 298 + 299 + @doc("The unique identifier for this instance of the age assurance flow, in UUID format.") 300 + @required 301 + attemptId: string; 302 + 303 + @doc("The IP address used when initiating the AA flow.") 304 + initIp?: string; 305 + 306 + @doc("The user agent used when initiating the AA flow.") 307 + initUa?: string; 308 + 309 + @doc("The IP address used when completing the AA flow.") 310 + completeIp?: string; 311 + 312 + @doc("The user agent used when completing the AA flow.") 313 + completeUa?: string; 314 + } 315 + 316 + @doc("Age assurance status override by moderators. Only works on DID subjects.") 317 + model AgeAssuranceOverrideEvent { 318 + @doc("Comment describing the reason for the override.") 319 + @required 320 + comment: string; 321 + 322 + @doc("The status to be set for the user decided by a moderator, overriding whatever value the user had previously. Use reset to default to original state.") 323 + @required 324 + status: "assured" | "reset" | "blocked" | string; 325 + } 326 + 327 + @doc("Account credentials revocation by moderators. Only works on DID subjects.") 328 + model RevokeAccountCredentialsEvent { 329 + @doc("Comment describing the reason for the revocation.") 330 + @required 331 + comment: string; 332 + } 333 + 334 + model ModEventAcknowledge { 335 + comment?: string; 336 + 337 + @doc("If true, all other reports on content authored by this account will be resolved (acknowledged).") 338 + acknowledgeAccountSubjects?: boolean; 339 + } 340 + 341 + model ModEventEscalate { 342 + comment?: string; 343 + } 344 + 345 + @doc("Mute incoming reports on a subject") 346 + model ModEventMute { 347 + comment?: string; 348 + 349 + @doc("Indicates how long the subject should remain muted.") 350 + @required 351 + durationInHours: int32; 352 + } 353 + 354 + @doc("Unmute action on a subject") 355 + model ModEventUnmute { 356 + @doc("Describe reasoning behind the reversal.") 357 + comment?: string; 358 + } 359 + 360 + @doc("Mute incoming reports from an account") 361 + model ModEventMuteReporter { 362 + comment?: string; 363 + 364 + @doc("Indicates how long the account should remain muted. Falsy value here means a permanent mute.") 365 + durationInHours?: int32; 366 + } 367 + 368 + @doc("Unmute incoming reports from an account") 369 + model ModEventUnmuteReporter { 370 + @doc("Describe reasoning behind the reversal.") 371 + comment?: string; 372 + } 373 + 374 + @doc("Keep a log of outgoing email to a user") 375 + model ModEventEmail { 376 + @doc("The subject line of the email sent to the user.") 377 + @required 378 + subjectLine: string; 379 + 380 + @doc("The content of the email sent to the user.") 381 + content?: string; 382 + 383 + @doc("Additional comment about the outgoing comm.") 384 + comment?: string; 385 + } 386 + 387 + @doc("Divert a record's blobs to a 3rd party service for further scanning/tagging") 388 + model ModEventDivert { 389 + comment?: string; 390 + } 391 + 392 + @doc("Add/Remove a tag on a subject") 393 + model ModEventTag { 394 + @doc("Tags to be added to the subject. If already exists, won't be duplicated.") 395 + @required 396 + add: string[]; 397 + 398 + @doc("Tags to be removed to the subject. Ignores a tag If it doesn't exist, won't be duplicated.") 399 + @required 400 + remove: string[]; 401 + 402 + @doc("Additional comment about added/removed tags.") 403 + comment?: string; 404 + } 405 + 406 + @doc("Logs account status related events on a repo subject. Normally captured by automod from the firehose and emitted to ozone for historical tracking.") 407 + model AccountEvent { 408 + comment?: string; 409 + @required timestamp: datetime; 410 + 411 + @doc("Indicates that the account has a repository which can be fetched from the host that emitted this event.") 412 + @required 413 + active: boolean; 414 + 415 + status?: "unknown" | "deactivated" | "deleted" | "takendown" | "suspended" | "tombstoned" | string; 416 + } 417 + 418 + @doc("Logs identity related events on a repo subject. Normally captured by automod from the firehose and emitted to ozone for historical tracking.") 419 + model IdentityEvent { 420 + comment?: string; 421 + handle?: handle; 422 + pdsHost?: uri; 423 + tombstone?: boolean; 424 + @required timestamp: datetime; 425 + } 426 + 427 + @doc("Logs lifecycle event on a record subject. Normally captured by automod from the firehose and emitted to ozone for historical tracking.") 428 + model RecordEvent { 429 + comment?: string; 430 + @required timestamp: datetime; 431 + 432 + @required 433 + `op`: "create" | "update" | "delete" | string; 434 + 435 + cid?: cid; 436 + } 437 + 438 + model RepoView { 439 + @required did: did; 440 + @required handle: handle; 441 + email?: string; 442 + @required relatedRecords: unknown[]; 443 + @required indexedAt: datetime; 444 + @required moderation: Moderation; 445 + invitedBy?: com.atproto.server.defs.InviteCode; 446 + invitesDisabled?: boolean; 447 + inviteNote?: string; 448 + deactivatedAt?: datetime; 449 + threatSignatures?: com.atproto.admin.defs.ThreatSignature[]; 450 + } 451 + 452 + model RepoViewDetail { 453 + @required did: did; 454 + @required handle: handle; 455 + email?: string; 456 + @required relatedRecords: unknown[]; 457 + @required indexedAt: datetime; 458 + @required moderation: ModerationDetail; 459 + labels?: com.atproto.label.defs.Label[]; 460 + invitedBy?: com.atproto.server.defs.InviteCode; 461 + invites?: com.atproto.server.defs.InviteCode[]; 462 + invitesDisabled?: boolean; 463 + inviteNote?: string; 464 + emailConfirmedAt?: datetime; 465 + deactivatedAt?: datetime; 466 + threatSignatures?: com.atproto.admin.defs.ThreatSignature[]; 467 + } 468 + 469 + model RepoViewNotFound { 470 + @required did: did; 471 + } 472 + 473 + model RecordView { 474 + @required uri: atUri; 475 + @required cid: cid; 476 + @required value: unknown; 477 + @required blobCids: cid[]; 478 + @required indexedAt: datetime; 479 + @required moderation: Moderation; 480 + @required repo: RepoView; 481 + } 482 + 483 + model RecordViewDetail { 484 + @required uri: atUri; 485 + @required cid: cid; 486 + @required value: unknown; 487 + @required blobs: BlobView[]; 488 + labels?: com.atproto.label.defs.Label[]; 489 + @required indexedAt: datetime; 490 + @required moderation: ModerationDetail; 491 + @required repo: RepoView; 492 + } 493 + 494 + model RecordViewNotFound { 495 + @required uri: atUri; 496 + } 497 + 498 + model Moderation { 499 + subjectStatus?: SubjectStatusView; 500 + } 501 + 502 + model ModerationDetail { 503 + subjectStatus?: SubjectStatusView; 504 + } 505 + 506 + model BlobView { 507 + @required cid: cid; 508 + @required mimeType: string; 509 + @required size: int32; 510 + @required createdAt: datetime; 511 + details?: ImageDetails | VideoDetails; 512 + moderation?: Moderation; 513 + } 514 + 515 + model ImageDetails { 516 + @required width: int32; 517 + @required height: int32; 518 + } 519 + 520 + model VideoDetails { 521 + @required width: int32; 522 + @required height: int32; 523 + @required length: int32; 524 + } 525 + 526 + model AccountHosting { 527 + @required 528 + status: "takendown" | "suspended" | "deleted" | "deactivated" | "unknown" | string; 529 + 530 + updatedAt?: datetime; 531 + createdAt?: datetime; 532 + deletedAt?: datetime; 533 + deactivatedAt?: datetime; 534 + reactivatedAt?: datetime; 535 + } 536 + 537 + model RecordHosting { 538 + @required 539 + status: "deleted" | "unknown" | string; 540 + 541 + updatedAt?: datetime; 542 + createdAt?: datetime; 543 + deletedAt?: datetime; 544 + } 545 + 546 + model ReporterStats { 547 + @required did: did; 548 + 549 + @doc("The total number of reports made by the user on accounts.") 550 + @required 551 + accountReportCount: int32; 552 + 553 + @doc("The total number of reports made by the user on records.") 554 + @required 555 + recordReportCount: int32; 556 + 557 + @doc("The total number of accounts reported by the user.") 558 + @required 559 + reportedAccountCount: int32; 560 + 561 + @doc("The total number of records reported by the user.") 562 + @required 563 + reportedRecordCount: int32; 564 + 565 + @doc("The total number of accounts taken down as a result of the user's reports.") 566 + @required 567 + takendownAccountCount: int32; 568 + 569 + @doc("The total number of records taken down as a result of the user's reports.") 570 + @required 571 + takendownRecordCount: int32; 572 + 573 + @doc("The total number of accounts labeled as a result of the user's reports.") 574 + @required 575 + labeledAccountCount: int32; 576 + 577 + @doc("The total number of records labeled as a result of the user's reports.") 578 + @required 579 + labeledRecordCount: int32; 580 + } 581 + 582 + @doc("Moderation tool information for tracing the source of the action") 583 + model ModTool { 584 + @doc("Name/identifier of the source (e.g., 'automod', 'ozone/workspace')") 585 + @required 586 + name: string; 587 + 588 + @doc("Additional arbitrary metadata about the source") 589 + meta?: unknown; 590 + } 591 + 592 + @doc("Moderation event timeline event for a PLC create operation") 593 + @token 594 + model TimelineEventPlcCreate {} 595 + 596 + @doc("Moderation event timeline event for generic PLC operation") 597 + @token 598 + model TimelineEventPlcOperation {} 599 + 600 + @doc("Moderation event timeline event for a PLC tombstone operation") 601 + @token 602 + model TimelineEventPlcTombstone {} 603 + }
+240
packages/emitter/test/integration/atproto/input/tools/ozone/report/defs.tsp
··· 1 + import "@tlex/emitter"; 2 + 3 + namespace tools.ozone.report.defs { 4 + union ReasonType { 5 + string, 6 + 7 + ReasonAppeal: "tools.ozone.report.defs#reasonAppeal", 8 + 9 + ReasonViolenceAnimalWelfare: "tools.ozone.report.defs#reasonViolenceAnimalWelfare", 10 + ReasonViolenceThreats: "tools.ozone.report.defs#reasonViolenceThreats", 11 + ReasonViolenceGraphicContent: "tools.ozone.report.defs#reasonViolenceGraphicContent", 12 + ReasonViolenceSelfHarm: "tools.ozone.report.defs#reasonViolenceSelfHarm", 13 + ReasonViolenceGlorification: "tools.ozone.report.defs#reasonViolenceGlorification", 14 + ReasonViolenceExtremistContent: "tools.ozone.report.defs#reasonViolenceExtremistContent", 15 + ReasonViolenceTrafficking: "tools.ozone.report.defs#reasonViolenceTrafficking", 16 + ReasonViolenceOther: "tools.ozone.report.defs#reasonViolenceOther", 17 + 18 + ReasonSexualAbuseContent: "tools.ozone.report.defs#reasonSexualAbuseContent", 19 + ReasonSexualNCII: "tools.ozone.report.defs#reasonSexualNCII", 20 + ReasonSexualSextortion: "tools.ozone.report.defs#reasonSexualSextortion", 21 + ReasonSexualDeepfake: "tools.ozone.report.defs#reasonSexualDeepfake", 22 + ReasonSexualAnimal: "tools.ozone.report.defs#reasonSexualAnimal", 23 + ReasonSexualUnlabeled: "tools.ozone.report.defs#reasonSexualUnlabeled", 24 + ReasonSexualOther: "tools.ozone.report.defs#reasonSexualOther", 25 + 26 + ReasonChildSafetyCSAM: "tools.ozone.report.defs#reasonChildSafetyCSAM", 27 + ReasonChildSafetyGroom: "tools.ozone.report.defs#reasonChildSafetyGroom", 28 + ReasonChildSafetyMinorPrivacy: "tools.ozone.report.defs#reasonChildSafetyMinorPrivacy", 29 + ReasonChildSafetyEndangerment: "tools.ozone.report.defs#reasonChildSafetyEndangerment", 30 + ReasonChildSafetyHarassment: "tools.ozone.report.defs#reasonChildSafetyHarassment", 31 + ReasonChildSafetyPromotion: "tools.ozone.report.defs#reasonChildSafetyPromotion", 32 + ReasonChildSafetyOther: "tools.ozone.report.defs#reasonChildSafetyOther", 33 + 34 + ReasonHarassmentTroll: "tools.ozone.report.defs#reasonHarassmentTroll", 35 + ReasonHarassmentTargeted: "tools.ozone.report.defs#reasonHarassmentTargeted", 36 + ReasonHarassmentHateSpeech: "tools.ozone.report.defs#reasonHarassmentHateSpeech", 37 + ReasonHarassmentDoxxing: "tools.ozone.report.defs#reasonHarassmentDoxxing", 38 + ReasonHarassmentOther: "tools.ozone.report.defs#reasonHarassmentOther", 39 + 40 + ReasonMisleadingBot: "tools.ozone.report.defs#reasonMisleadingBot", 41 + ReasonMisleadingImpersonation: "tools.ozone.report.defs#reasonMisleadingImpersonation", 42 + ReasonMisleadingSpam: "tools.ozone.report.defs#reasonMisleadingSpam", 43 + ReasonMisleadingScam: "tools.ozone.report.defs#reasonMisleadingScam", 44 + ReasonMisleadingSyntheticContent: "tools.ozone.report.defs#reasonMisleadingSyntheticContent", 45 + ReasonMisleadingMisinformation: "tools.ozone.report.defs#reasonMisleadingMisinformation", 46 + ReasonMisleadingOther: "tools.ozone.report.defs#reasonMisleadingOther", 47 + 48 + ReasonRuleSiteSecurity: "tools.ozone.report.defs#reasonRuleSiteSecurity", 49 + ReasonRuleStolenContent: "tools.ozone.report.defs#reasonRuleStolenContent", 50 + ReasonRuleProhibitedSales: "tools.ozone.report.defs#reasonRuleProhibitedSales", 51 + ReasonRuleBanEvasion: "tools.ozone.report.defs#reasonRuleBanEvasion", 52 + ReasonRuleOther: "tools.ozone.report.defs#reasonRuleOther", 53 + 54 + ReasonCivicElectoralProcess: "tools.ozone.report.defs#reasonCivicElectoralProcess", 55 + ReasonCivicDisclosure: "tools.ozone.report.defs#reasonCivicDisclosure", 56 + ReasonCivicInterference: "tools.ozone.report.defs#reasonCivicInterference", 57 + ReasonCivicMisinformation: "tools.ozone.report.defs#reasonCivicMisinformation", 58 + ReasonCivicImpersonation: "tools.ozone.report.defs#reasonCivicImpersonation", 59 + } 60 + 61 + @doc("Appeal a previously taken moderation action") 62 + @token 63 + model ReasonAppeal {} 64 + 65 + @doc("Animal welfare violations") 66 + @token 67 + model ReasonViolenceAnimalWelfare {} 68 + 69 + @doc("Threats or incitement") 70 + @token 71 + model ReasonViolenceThreats {} 72 + 73 + @doc("Graphic violent content") 74 + @token 75 + model ReasonViolenceGraphicContent {} 76 + 77 + @doc("Self harm") 78 + @token 79 + model ReasonViolenceSelfHarm {} 80 + 81 + @doc("Glorification of violence") 82 + @token 83 + model ReasonViolenceGlorification {} 84 + 85 + @doc("Extremist content. These reports will be sent only be sent to the application's Moderation Authority.") 86 + @token 87 + model ReasonViolenceExtremistContent {} 88 + 89 + @doc("Human trafficking") 90 + @token 91 + model ReasonViolenceTrafficking {} 92 + 93 + @doc("Other violent content") 94 + @token 95 + model ReasonViolenceOther {} 96 + 97 + @doc("Adult sexual abuse content") 98 + @token 99 + model ReasonSexualAbuseContent {} 100 + 101 + @doc("Non-consensual intimate imagery") 102 + @token 103 + model ReasonSexualNCII {} 104 + 105 + @doc("Sextortion") 106 + @token 107 + model ReasonSexualSextortion {} 108 + 109 + @doc("Deepfake adult content") 110 + @token 111 + model ReasonSexualDeepfake {} 112 + 113 + @doc("Animal sexual abuse") 114 + @token 115 + model ReasonSexualAnimal {} 116 + 117 + @doc("Unlabelled adult content") 118 + @token 119 + model ReasonSexualUnlabeled {} 120 + 121 + @doc("Other sexual violence content") 122 + @token 123 + model ReasonSexualOther {} 124 + 125 + @doc("Child sexual abuse material (CSAM). These reports will be sent only be sent to the application's Moderation Authority.") 126 + @token 127 + model ReasonChildSafetyCSAM {} 128 + 129 + @doc("Grooming or predatory behavior. These reports will be sent only be sent to the application's Moderation Authority.") 130 + @token 131 + model ReasonChildSafetyGroom {} 132 + 133 + @doc("Privacy violation involving a minor") 134 + @token 135 + model ReasonChildSafetyMinorPrivacy {} 136 + 137 + @doc("Child endangerment. These reports will be sent only be sent to the application's Moderation Authority.") 138 + @token 139 + model ReasonChildSafetyEndangerment {} 140 + 141 + @doc("Harassment or bullying of minors") 142 + @token 143 + model ReasonChildSafetyHarassment {} 144 + 145 + @doc("Promotion of child exploitation. These reports will be sent only be sent to the application's Moderation Authority.") 146 + @token 147 + model ReasonChildSafetyPromotion {} 148 + 149 + @doc("Other child safety. These reports will be sent only be sent to the application's Moderation Authority.") 150 + @token 151 + model ReasonChildSafetyOther {} 152 + 153 + @doc("Trolling") 154 + @token 155 + model ReasonHarassmentTroll {} 156 + 157 + @doc("Targeted harassment") 158 + @token 159 + model ReasonHarassmentTargeted {} 160 + 161 + @doc("Hate speech") 162 + @token 163 + model ReasonHarassmentHateSpeech {} 164 + 165 + @doc("Doxxing") 166 + @token 167 + model ReasonHarassmentDoxxing {} 168 + 169 + @doc("Other harassing or hateful content") 170 + @token 171 + model ReasonHarassmentOther {} 172 + 173 + @doc("Fake account or bot") 174 + @token 175 + model ReasonMisleadingBot {} 176 + 177 + @doc("Impersonation") 178 + @token 179 + model ReasonMisleadingImpersonation {} 180 + 181 + @doc("Spam") 182 + @token 183 + model ReasonMisleadingSpam {} 184 + 185 + @doc("Scam") 186 + @token 187 + model ReasonMisleadingScam {} 188 + 189 + @doc("Unlabelled gen-AI or synthetic content") 190 + @token 191 + model ReasonMisleadingSyntheticContent {} 192 + 193 + @doc("Harmful false claims") 194 + @token 195 + model ReasonMisleadingMisinformation {} 196 + 197 + @doc("Other misleading content") 198 + @token 199 + model ReasonMisleadingOther {} 200 + 201 + @doc("Hacking or system attacks") 202 + @token 203 + model ReasonRuleSiteSecurity {} 204 + 205 + @doc("Stolen content") 206 + @token 207 + model ReasonRuleStolenContent {} 208 + 209 + @doc("Promoting or selling prohibited items or services") 210 + @token 211 + model ReasonRuleProhibitedSales {} 212 + 213 + @doc("Banned user returning") 214 + @token 215 + model ReasonRuleBanEvasion {} 216 + 217 + @doc("Other") 218 + @token 219 + model ReasonRuleOther {} 220 + 221 + @doc("Electoral process violations") 222 + @token 223 + model ReasonCivicElectoralProcess {} 224 + 225 + @doc("Disclosure & transparency violations") 226 + @token 227 + model ReasonCivicDisclosure {} 228 + 229 + @doc("Voter intimidation or interference") 230 + @token 231 + model ReasonCivicInterference {} 232 + 233 + @doc("Election misinformation") 234 + @token 235 + model ReasonCivicMisinformation {} 236 + 237 + @doc("Impersonation of electoral officials/entities") 238 + @token 239 + model ReasonCivicImpersonation {} 240 + }
+83
packages/emitter/test/integration/atproto/input/tools/ozone/safelink/defs.tsp
··· 1 + import "@tlex/emitter"; 2 + 3 + namespace tools.ozone.safelink.defs { 4 + @doc("An event for URL safety decisions") 5 + model Event { 6 + @doc("Auto-incrementing row ID") 7 + @required 8 + id: int32; 9 + 10 + @required eventType: EventType; 11 + 12 + @doc("The URL that this rule applies to") 13 + @required 14 + url: string; 15 + 16 + @required pattern: PatternType; 17 + @required action: ActionType; 18 + @required reason: ReasonType; 19 + 20 + @doc("DID of the user who created this rule") 21 + @required 22 + createdBy: did; 23 + 24 + @required createdAt: datetime; 25 + 26 + @doc("Optional comment about the decision") 27 + comment?: string; 28 + } 29 + 30 + union EventType { 31 + "addRule", 32 + "updateRule", 33 + "removeRule", 34 + string, 35 + } 36 + 37 + union PatternType { 38 + "domain", 39 + "url", 40 + string, 41 + } 42 + 43 + union ActionType { 44 + "block", 45 + "warn", 46 + "whitelist", 47 + string, 48 + } 49 + 50 + union ReasonType { 51 + "csam", 52 + "spam", 53 + "phishing", 54 + "none", 55 + string, 56 + } 57 + 58 + @doc("Input for creating a URL safety rule") 59 + model UrlRule { 60 + @doc("The URL or domain to apply the rule to") 61 + @required 62 + url: string; 63 + 64 + @required pattern: PatternType; 65 + @required action: ActionType; 66 + @required reason: ReasonType; 67 + 68 + @doc("Optional comment about the decision") 69 + comment?: string; 70 + 71 + @doc("DID of the user added the rule.") 72 + @required 73 + createdBy: did; 74 + 75 + @doc("Timestamp when the rule was created") 76 + @required 77 + createdAt: datetime; 78 + 79 + @doc("Timestamp when the rule was last updated") 80 + @required 81 + updatedAt: datetime; 82 + } 83 + }
+30
packages/emitter/test/integration/atproto/input/tools/ozone/server/getConfig.tsp
··· 1 + import "@tlex/emitter"; 2 + 3 + namespace tools.ozone.server.getConfig { 4 + @doc("Get details about ozone's server configuration.") 5 + @query 6 + op main(): { 7 + appview?: ServiceConfig; 8 + pds?: ServiceConfig; 9 + blobDivert?: ServiceConfig; 10 + chat?: ServiceConfig; 11 + viewer?: ViewerConfig; 12 + 13 + @doc("The did of the verifier used for verification.") 14 + verifierDid?: did; 15 + }; 16 + 17 + model ServiceConfig { 18 + url?: uri; 19 + } 20 + 21 + model ViewerConfig { 22 + role?: ( 23 + | "tools.ozone.team.defs#roleAdmin" 24 + | "tools.ozone.team.defs#roleModerator" 25 + | "tools.ozone.team.defs#roleTriage" 26 + | "tools.ozone.team.defs#roleVerifier" 27 + | string 28 + ); 29 + } 30 + }
+29
packages/emitter/test/integration/atproto/input/tools/ozone/set/defs.tsp
··· 1 + import "@tlex/emitter"; 2 + 3 + namespace tools.ozone.set.defs { 4 + model Set { 5 + @minLength(3) 6 + @maxLength(128) 7 + @required 8 + name: string; 9 + 10 + @maxGraphemes(1024) 11 + @maxLength(10240) 12 + description?: string; 13 + } 14 + 15 + model SetView { 16 + @minLength(3) 17 + @maxLength(128) 18 + @required 19 + name: string; 20 + 21 + @maxGraphemes(1024) 22 + @maxLength(10240) 23 + description?: string; 24 + 25 + @required setSize: int32; 26 + @required createdAt: datetime; 27 + @required updatedAt: datetime; 28 + } 29 + }
+30
packages/emitter/test/integration/atproto/input/tools/ozone/setting/defs.tsp
··· 1 + import "@tlex/emitter"; 2 + 3 + namespace tools.ozone.setting.defs { 4 + model Option { 5 + @required 6 + @format("nsid") 7 + key: string; 8 + 9 + @required did: did; 10 + @required value: unknown; 11 + 12 + @maxGraphemes(1024) 13 + @maxLength(10240) 14 + description?: string; 15 + 16 + createdAt?: datetime; 17 + updatedAt?: datetime; 18 + 19 + managerRole?: 20 + | "tools.ozone.team.defs#roleModerator" 21 + | "tools.ozone.team.defs#roleTriage" 22 + | "tools.ozone.team.defs#roleAdmin" 23 + | "tools.ozone.team.defs#roleVerifier" 24 + | string; 25 + 26 + @required scope: "instance" | "personal" | string; 27 + @required createdBy: did; 28 + @required lastUpdatedBy: did; 29 + } 30 + }
+8
packages/emitter/test/integration/atproto/input/tools/ozone/signature/defs.tsp
··· 1 + import "@tlex/emitter"; 2 + 3 + namespace tools.ozone.signature.defs { 4 + model SigDetail { 5 + @required property: string; 6 + @required value: string; 7 + } 8 + }
+22
packages/emitter/test/integration/atproto/input/tools/ozone/team/addMember.tsp
··· 1 + import "@tlex/emitter"; 2 + 3 + namespace tools.ozone.team.addMember { 4 + @doc("Member already exists in the team.") 5 + model MemberAlreadyExists {} 6 + 7 + @doc("Add a member to the ozone team. Requires admin role.") 8 + @procedure 9 + @errors(MemberAlreadyExists) 10 + op main(input: { 11 + @required did: did; 12 + 13 + @required 14 + role: ( 15 + | "tools.ozone.team.defs#roleAdmin" 16 + | "tools.ozone.team.defs#roleModerator" 17 + | "tools.ozone.team.defs#roleVerifier" 18 + | "tools.ozone.team.defs#roleTriage" 19 + | string 20 + ); 21 + }): tools.ozone.team.defs.Member; 22 + }
+29
packages/emitter/test/integration/atproto/input/tools/ozone/team/defs.tsp
··· 1 + import "@tlex/emitter"; 2 + 3 + namespace tools.ozone.team.defs { 4 + model Member { 5 + @required did: did; 6 + disabled?: boolean; 7 + profile?: app.bsky.actor.defs.ProfileViewDetailed; 8 + createdAt?: datetime; 9 + updatedAt?: datetime; 10 + lastUpdatedBy?: string; 11 + @required role: "#roleAdmin" | "#roleModerator" | "#roleTriage" | "#roleVerifier" | string; 12 + } 13 + 14 + @doc("Admin role. Highest level of access, can perform all actions.") 15 + @token 16 + model RoleAdmin {} 17 + 18 + @doc("Moderator role. Can perform most actions.") 19 + @token 20 + model RoleModerator {} 21 + 22 + @doc("Triage role. Mostly intended for monitoring and escalating issues.") 23 + @token 24 + model RoleTriage {} 25 + 26 + @doc("Verifier role. Only allowed to issue verifications.") 27 + @token 28 + model RoleVerifier {} 29 + }
+16
packages/emitter/test/integration/atproto/input/tools/ozone/team/deleteMember.tsp
··· 1 + import "@tlex/emitter"; 2 + 3 + namespace tools.ozone.team.deleteMember { 4 + @doc("The member being deleted does not exist") 5 + model MemberNotFound {} 6 + 7 + @doc("You can not delete yourself from the team") 8 + model CannotDeleteSelf {} 9 + 10 + @doc("Delete a member from ozone team. Requires admin role.") 11 + @procedure 12 + @errors(MemberNotFound, CannotDeleteSelf) 13 + op main(input: { 14 + @required did: did; 15 + }): void; 16 + }
+20
packages/emitter/test/integration/atproto/input/tools/ozone/team/listMembers.tsp
··· 1 + import "@tlex/emitter"; 2 + 3 + namespace tools.ozone.team.listMembers { 4 + @doc("List all members with access to the ozone service.") 5 + @query 6 + op main( 7 + q?: string, 8 + disabled?: boolean, 9 + roles?: string[], 10 + 11 + @minValue(1) 12 + @maxValue(100) 13 + limit?: int32 = 50, 14 + 15 + cursor?: string 16 + ): { 17 + cursor?: string; 18 + @required members: tools.ozone.team.defs.Member[]; 19 + }; 20 + }
+22
packages/emitter/test/integration/atproto/input/tools/ozone/team/updateMember.tsp
··· 1 + import "@tlex/emitter"; 2 + 3 + namespace tools.ozone.team.updateMember { 4 + @doc("The member being updated does not exist in the team") 5 + model MemberNotFound {} 6 + 7 + @doc("Update a member in the ozone service. Requires admin role.") 8 + @procedure 9 + @errors(MemberNotFound) 10 + op main(input: { 11 + @required did: did; 12 + disabled?: boolean; 13 + 14 + role?: ( 15 + | "tools.ozone.team.defs#roleAdmin" 16 + | "tools.ozone.team.defs#roleModerator" 17 + | "tools.ozone.team.defs#roleVerifier" 18 + | "tools.ozone.team.defs#roleTriage" 19 + | string 20 + ); 21 + }): tools.ozone.team.defs.Member; 22 + }
+54
packages/emitter/test/integration/atproto/input/tools/ozone/verification/defs.tsp
··· 1 + import "@tlex/emitter"; 2 + 3 + namespace tools.ozone.verification.defs { 4 + @doc("Verification data for the associated subject.") 5 + model VerificationView { 6 + @doc("The user who issued this verification.") 7 + @required 8 + issuer: did; 9 + 10 + @doc("The AT-URI of the verification record.") 11 + @required 12 + uri: atUri; 13 + 14 + @doc("The subject of the verification.") 15 + @required 16 + subject: did; 17 + 18 + @doc("Handle of the subject the verification applies to at the moment of verifying, which might not be the same at the time of viewing. The verification is only valid if the current handle matches the one at the time of verifying.") 19 + @required 20 + handle: handle; 21 + 22 + @doc("Display name of the subject the verification applies to at the moment of verifying, which might not be the same at the time of viewing. The verification is only valid if the current displayName matches the one at the time of verifying.") 23 + @required 24 + displayName: string; 25 + 26 + @doc("Timestamp when the verification was created.") 27 + @required 28 + createdAt: datetime; 29 + 30 + @doc("Describes the reason for revocation, also indicating that the verification is no longer valid.") 31 + revokeReason?: string; 32 + 33 + @doc("Timestamp when the verification was revoked.") 34 + revokedAt?: datetime; 35 + 36 + @doc("The user who revoked this verification.") 37 + revokedBy?: did; 38 + 39 + subjectProfile?: (never | unknown); 40 + issuerProfile?: (never | unknown); 41 + 42 + subjectRepo?: ( 43 + | tools.ozone.moderation.defs.RepoViewDetail 44 + | tools.ozone.moderation.defs.RepoViewNotFound 45 + | unknown 46 + ); 47 + 48 + issuerRepo?: ( 49 + | tools.ozone.moderation.defs.RepoViewDetail 50 + | tools.ozone.moderation.defs.RepoViewNotFound 51 + | unknown 52 + ); 53 + } 54 + }
+43
packages/emitter/test/integration/atproto/input/tools/ozone/verification/grantVerifications.tsp
··· 1 + import "@tlex/emitter"; 2 + 3 + namespace tools.ozone.verification.grantVerifications { 4 + @doc("Grant verifications to multiple subjects. Allows batch processing of up to 100 verifications at once.") 5 + @procedure 6 + op main(input: { 7 + @doc("Array of verification requests to process") 8 + @maxItems(100) 9 + @required 10 + verifications: VerificationInput[]; 11 + }): { 12 + @required verifications: tools.ozone.verification.defs.VerificationView[]; 13 + @required failedVerifications: GrantError[]; 14 + }; 15 + 16 + model VerificationInput { 17 + @doc("The did of the subject being verified") 18 + @required 19 + subject: did; 20 + 21 + @doc("Handle of the subject the verification applies to at the moment of verifying.") 22 + @required 23 + handle: handle; 24 + 25 + @doc("Display name of the subject the verification applies to at the moment of verifying.") 26 + @required 27 + displayName: string; 28 + 29 + @doc("Timestamp for verification record. Defaults to current time when not specified.") 30 + createdAt?: datetime; 31 + } 32 + 33 + @doc("Error object for failed verifications.") 34 + model GrantError { 35 + @doc("Error message describing the reason for failure.") 36 + @required 37 + error: string; 38 + 39 + @doc("The did of the subject being verified") 40 + @required 41 + subject: did; 42 + } 43 + }
+38
packages/emitter/test/integration/atproto/input/tools/ozone/verification/listVerifications.tsp
··· 1 + import "@tlex/emitter"; 2 + 3 + namespace tools.ozone.verification.listVerifications { 4 + @doc("List verifications") 5 + @query 6 + op main( 7 + @doc("Pagination cursor") 8 + cursor?: string, 9 + 10 + @doc("Maximum number of results to return") 11 + @minValue(1) 12 + @maxValue(100) 13 + limit?: int32 = 50, 14 + 15 + @doc("Filter to verifications created after this timestamp") 16 + createdAfter?: datetime, 17 + 18 + @doc("Filter to verifications created before this timestamp") 19 + createdBefore?: datetime, 20 + 21 + @doc("Filter to verifications from specific issuers") 22 + @maxItems(100) 23 + issuers?: did[], 24 + 25 + @doc("Filter to specific verified DIDs") 26 + @maxItems(100) 27 + subjects?: did[], 28 + 29 + @doc("Sort direction for creation date") 30 + sortDirection?: "asc" | "desc" | string = "desc", 31 + 32 + @doc("Filter to verifications that are revoked or not. By default, includes both.") 33 + isRevoked?: boolean 34 + ): { 35 + cursor?: string; 36 + @required verifications: tools.ozone.verification.defs.VerificationView[]; 37 + }; 38 + }
+35
packages/emitter/test/integration/atproto/input/tools/ozone/verification/revokeVerifications.tsp
··· 1 + import "@tlex/emitter"; 2 + 3 + namespace tools.ozone.verification.revokeVerifications { 4 + @doc("Revoke previously granted verifications in batches of up to 100.") 5 + @procedure 6 + op main(input: { 7 + @doc("Array of verification record uris to revoke") 8 + @maxItems(100) 9 + @required 10 + uris: atUri[]; 11 + 12 + @doc("Reason for revoking the verification. This is optional and can be omitted if not needed.") 13 + @maxLength(1000) 14 + revokeReason?: string; 15 + }): { 16 + @doc("List of verification uris successfully revoked") 17 + @required 18 + revokedVerifications: atUri[]; 19 + 20 + @doc("List of verification uris that couldn't be revoked, including failure reasons") 21 + @required 22 + failedRevocations: RevokeError[]; 23 + }; 24 + 25 + @doc("Error object for failed revocations") 26 + model RevokeError { 27 + @doc("The AT-URI of the verification record that failed to revoke.") 28 + @required 29 + uri: atUri; 30 + 31 + @doc("Description of the error that occurred during revocation.") 32 + @required 33 + error: string; 34 + } 35 + }
-2
packages/emitter/test/integration/atproto/output/tools/ozone/hosting/getAccountHistory.json
··· 70 70 }, 71 71 "accountCreated": { 72 72 "type": "object", 73 - "required": [], 74 73 "properties": { 75 74 "email": { "type": "string" }, 76 75 "handle": { "type": "string", "format": "handle" } ··· 92 91 }, 93 92 "passwordUpdated": { 94 93 "type": "object", 95 - "required": [], 96 94 "properties": {} 97 95 }, 98 96 "handleUpdated": {