From 5fa2c76bd4eab651b506581f342ccabc228bad23 Mon Sep 17 00:00:00 2001 From: Sam Clemente Date: Wed, 12 Aug 2026 21:00:48 -0500 Subject: [PATCH] fix: make Lexicons publication-ready Adds primary descriptions, removes defs-only main declarations, and bounds every string flagged by the ATProto publication linter. --- packages/lexicons/link.latr.auth.probe.json | 1 + .../link.latr.developer.createClient.json | 1 + .../link.latr.developer.createKey.json | 1 + .../lexicons/link.latr.developer.defs.json | 9 +++----- .../link.latr.developer.deleteClient.json | 1 + .../link.latr.developer.getUsage.json | 1 + .../link.latr.developer.listClients.json | 1 + .../link.latr.developer.listKeys.json | 1 + .../link.latr.developer.revokeKey.json | 1 + .../link.latr.discovery.resolveUrl.json | 1 + .../link.latr.preview.getOpenGraph.json | 1 + packages/lexicons/link.latr.saved.defs.json | 17 +++++++------- .../lexicons/link.latr.saved.deleteItem.json | 1 + .../lexicons/link.latr.saved.getItem.json | 1 + packages/lexicons/link.latr.saved.item.json | 6 ++++- .../lexicons/link.latr.saved.listItems.json | 1 + .../link.latr.saved.migrateLegacy.json | 1 + .../lexicons/link.latr.saved.saveSubject.json | 1 + .../lexicons/link.latr.saved.saveUrl.json | 1 + .../lexicons/link.latr.saved.setState.json | 5 +++- scripts/generate-xrpc-lexicons.ts | 23 ++++++++++++------- 21 files changed, 52 insertions(+), 24 deletions(-) diff --git a/packages/lexicons/link.latr.auth.probe.json b/packages/lexicons/link.latr.auth.probe.json index e097d6f..a83e77f 100644 --- a/packages/lexicons/link.latr.auth.probe.json +++ b/packages/lexicons/link.latr.auth.probe.json @@ -3,6 +3,7 @@ "id": "link.latr.auth.probe", "defs": { "main": { + "description": "L@tr XRPC method link.latr.auth.probe.", "type": "query", "parameters": { "type": "params", diff --git a/packages/lexicons/link.latr.developer.createClient.json b/packages/lexicons/link.latr.developer.createClient.json index 017cb18..a881a46 100644 --- a/packages/lexicons/link.latr.developer.createClient.json +++ b/packages/lexicons/link.latr.developer.createClient.json @@ -3,6 +3,7 @@ "id": "link.latr.developer.createClient", "defs": { "main": { + "description": "L@tr XRPC method link.latr.developer.createClient.", "type": "procedure", "input": { "encoding": "application/json", diff --git a/packages/lexicons/link.latr.developer.createKey.json b/packages/lexicons/link.latr.developer.createKey.json index d4dbf06..7e36acd 100644 --- a/packages/lexicons/link.latr.developer.createKey.json +++ b/packages/lexicons/link.latr.developer.createKey.json @@ -3,6 +3,7 @@ "id": "link.latr.developer.createKey", "defs": { "main": { + "description": "L@tr XRPC method link.latr.developer.createKey.", "type": "procedure", "input": { "encoding": "application/json", diff --git a/packages/lexicons/link.latr.developer.defs.json b/packages/lexicons/link.latr.developer.defs.json index 16616dd..d183f6a 100644 --- a/packages/lexicons/link.latr.developer.defs.json +++ b/packages/lexicons/link.latr.developer.defs.json @@ -2,11 +2,6 @@ "lexicon": 1, "id": "link.latr.developer.defs", "defs": { - "main": { - "type": "object", - "required": [], - "properties": {} - }, "client": { "type": "object", "required": [ @@ -29,7 +24,9 @@ "type": "string", "knownValues": [ "developer" - ] + ], + "maxLength": 16, + "maxGraphemes": 16 }, "createdAt": { "type": "string", diff --git a/packages/lexicons/link.latr.developer.deleteClient.json b/packages/lexicons/link.latr.developer.deleteClient.json index 0291854..05df7dc 100644 --- a/packages/lexicons/link.latr.developer.deleteClient.json +++ b/packages/lexicons/link.latr.developer.deleteClient.json @@ -3,6 +3,7 @@ "id": "link.latr.developer.deleteClient", "defs": { "main": { + "description": "L@tr XRPC method link.latr.developer.deleteClient.", "type": "procedure", "input": { "encoding": "application/json", diff --git a/packages/lexicons/link.latr.developer.getUsage.json b/packages/lexicons/link.latr.developer.getUsage.json index c392c80..0cb1165 100644 --- a/packages/lexicons/link.latr.developer.getUsage.json +++ b/packages/lexicons/link.latr.developer.getUsage.json @@ -3,6 +3,7 @@ "id": "link.latr.developer.getUsage", "defs": { "main": { + "description": "L@tr XRPC method link.latr.developer.getUsage.", "type": "query", "parameters": { "type": "params", diff --git a/packages/lexicons/link.latr.developer.listClients.json b/packages/lexicons/link.latr.developer.listClients.json index 2035df7..7436cef 100644 --- a/packages/lexicons/link.latr.developer.listClients.json +++ b/packages/lexicons/link.latr.developer.listClients.json @@ -3,6 +3,7 @@ "id": "link.latr.developer.listClients", "defs": { "main": { + "description": "L@tr XRPC method link.latr.developer.listClients.", "type": "query", "parameters": { "type": "params", diff --git a/packages/lexicons/link.latr.developer.listKeys.json b/packages/lexicons/link.latr.developer.listKeys.json index 2eb010a..4bc6cad 100644 --- a/packages/lexicons/link.latr.developer.listKeys.json +++ b/packages/lexicons/link.latr.developer.listKeys.json @@ -3,6 +3,7 @@ "id": "link.latr.developer.listKeys", "defs": { "main": { + "description": "L@tr XRPC method link.latr.developer.listKeys.", "type": "query", "parameters": { "type": "params", diff --git a/packages/lexicons/link.latr.developer.revokeKey.json b/packages/lexicons/link.latr.developer.revokeKey.json index 5b21aa0..c51ad7f 100644 --- a/packages/lexicons/link.latr.developer.revokeKey.json +++ b/packages/lexicons/link.latr.developer.revokeKey.json @@ -3,6 +3,7 @@ "id": "link.latr.developer.revokeKey", "defs": { "main": { + "description": "L@tr XRPC method link.latr.developer.revokeKey.", "type": "procedure", "input": { "encoding": "application/json", diff --git a/packages/lexicons/link.latr.discovery.resolveUrl.json b/packages/lexicons/link.latr.discovery.resolveUrl.json index 87815f3..3d09b75 100644 --- a/packages/lexicons/link.latr.discovery.resolveUrl.json +++ b/packages/lexicons/link.latr.discovery.resolveUrl.json @@ -3,6 +3,7 @@ "id": "link.latr.discovery.resolveUrl", "defs": { "main": { + "description": "L@tr XRPC method link.latr.discovery.resolveUrl.", "type": "query", "parameters": { "type": "params", diff --git a/packages/lexicons/link.latr.preview.getOpenGraph.json b/packages/lexicons/link.latr.preview.getOpenGraph.json index 5ac84c4..b6891b6 100644 --- a/packages/lexicons/link.latr.preview.getOpenGraph.json +++ b/packages/lexicons/link.latr.preview.getOpenGraph.json @@ -3,6 +3,7 @@ "id": "link.latr.preview.getOpenGraph", "defs": { "main": { + "description": "L@tr XRPC method link.latr.preview.getOpenGraph.", "type": "query", "parameters": { "type": "params", diff --git a/packages/lexicons/link.latr.saved.defs.json b/packages/lexicons/link.latr.saved.defs.json index 5bb2aef..f1e20c7 100644 --- a/packages/lexicons/link.latr.saved.defs.json +++ b/packages/lexicons/link.latr.saved.defs.json @@ -2,11 +2,6 @@ "lexicon": 1, "id": "link.latr.saved.defs", "defs": { - "main": { - "type": "object", - "required": [], - "properties": {} - }, "record": { "type": "object", "required": [ @@ -55,11 +50,15 @@ "knownValues": [ "url", "subject" - ] + ], + "maxLength": 16, + "maxGraphemes": 16 }, "subjectUri": { "type": "string", - "format": "at-uri" + "format": "at-uri", + "maxLength": 8192, + "maxGraphemes": 2048 }, "linkedWebUrl": { "type": "string", @@ -72,7 +71,9 @@ "knownValues": [ "native", "external" - ] + ], + "maxLength": 16, + "maxGraphemes": 16 } } }, diff --git a/packages/lexicons/link.latr.saved.deleteItem.json b/packages/lexicons/link.latr.saved.deleteItem.json index f1c8d1a..e8fce14 100644 --- a/packages/lexicons/link.latr.saved.deleteItem.json +++ b/packages/lexicons/link.latr.saved.deleteItem.json @@ -3,6 +3,7 @@ "id": "link.latr.saved.deleteItem", "defs": { "main": { + "description": "L@tr XRPC method link.latr.saved.deleteItem.", "type": "procedure", "input": { "encoding": "application/json", diff --git a/packages/lexicons/link.latr.saved.getItem.json b/packages/lexicons/link.latr.saved.getItem.json index 162009a..91dbf2b 100644 --- a/packages/lexicons/link.latr.saved.getItem.json +++ b/packages/lexicons/link.latr.saved.getItem.json @@ -3,6 +3,7 @@ "id": "link.latr.saved.getItem", "defs": { "main": { + "description": "L@tr XRPC method link.latr.saved.getItem.", "type": "query", "parameters": { "type": "params", diff --git a/packages/lexicons/link.latr.saved.item.json b/packages/lexicons/link.latr.saved.item.json index e77e799..ad35fef 100644 --- a/packages/lexicons/link.latr.saved.item.json +++ b/packages/lexicons/link.latr.saved.item.json @@ -12,7 +12,9 @@ "properties": { "subjectUri": { "type": "string", - "format": "at-uri" + "format": "at-uri", + "maxLength": 8192, + "maxGraphemes": 2048 }, "savedAt": { "type": "string", @@ -21,6 +23,8 @@ "state": { "type": "string", "enum": ["unread", "archived"], + "maxLength": 16, + "maxGraphemes": 16, "description": "Queue state; defaults to unread in clients when omitted." }, "tags": { diff --git a/packages/lexicons/link.latr.saved.listItems.json b/packages/lexicons/link.latr.saved.listItems.json index 635d0aa..59b5f18 100644 --- a/packages/lexicons/link.latr.saved.listItems.json +++ b/packages/lexicons/link.latr.saved.listItems.json @@ -3,6 +3,7 @@ "id": "link.latr.saved.listItems", "defs": { "main": { + "description": "L@tr XRPC method link.latr.saved.listItems.", "type": "query", "parameters": { "type": "params", diff --git a/packages/lexicons/link.latr.saved.migrateLegacy.json b/packages/lexicons/link.latr.saved.migrateLegacy.json index a78c5e0..dc71ee1 100644 --- a/packages/lexicons/link.latr.saved.migrateLegacy.json +++ b/packages/lexicons/link.latr.saved.migrateLegacy.json @@ -3,6 +3,7 @@ "id": "link.latr.saved.migrateLegacy", "defs": { "main": { + "description": "L@tr XRPC method link.latr.saved.migrateLegacy.", "type": "procedure", "input": { "encoding": "application/json", diff --git a/packages/lexicons/link.latr.saved.saveSubject.json b/packages/lexicons/link.latr.saved.saveSubject.json index 6229712..83b6f1c 100644 --- a/packages/lexicons/link.latr.saved.saveSubject.json +++ b/packages/lexicons/link.latr.saved.saveSubject.json @@ -3,6 +3,7 @@ "id": "link.latr.saved.saveSubject", "defs": { "main": { + "description": "L@tr XRPC method link.latr.saved.saveSubject.", "type": "procedure", "input": { "encoding": "application/json", diff --git a/packages/lexicons/link.latr.saved.saveUrl.json b/packages/lexicons/link.latr.saved.saveUrl.json index 7c989a9..9df712d 100644 --- a/packages/lexicons/link.latr.saved.saveUrl.json +++ b/packages/lexicons/link.latr.saved.saveUrl.json @@ -3,6 +3,7 @@ "id": "link.latr.saved.saveUrl", "defs": { "main": { + "description": "L@tr XRPC method link.latr.saved.saveUrl.", "type": "procedure", "input": { "encoding": "application/json", diff --git a/packages/lexicons/link.latr.saved.setState.json b/packages/lexicons/link.latr.saved.setState.json index d24a6f1..30a4d5a 100644 --- a/packages/lexicons/link.latr.saved.setState.json +++ b/packages/lexicons/link.latr.saved.setState.json @@ -3,6 +3,7 @@ "id": "link.latr.saved.setState", "defs": { "main": { + "description": "L@tr XRPC method link.latr.saved.setState.", "type": "procedure", "input": { "encoding": "application/json", @@ -23,7 +24,9 @@ "enum": [ "unread", "archived" - ] + ], + "maxLength": 16, + "maxGraphemes": 16 } } } diff --git a/scripts/generate-xrpc-lexicons.ts b/scripts/generate-xrpc-lexicons.ts index 84d068e..9f8b246 100644 --- a/scripts/generate-xrpc-lexicons.ts +++ b/scripts/generate-xrpc-lexicons.ts @@ -16,7 +16,14 @@ const object = (required: string[], properties: Record) => ({ t const params = (required: string[], properties: Record) => ({ type: "params", required, properties }); function schema(id: string, main: Record, defs: Record = {}) { - return { lexicon: 1, id, defs: { main, ...defs } }; + const describedMain = main.type === "query" || main.type === "procedure" + ? { description: `L@tr XRPC method ${id}.`, ...main } + : main; + return { lexicon: 1, id, defs: { main: describedMain, ...defs } }; +} + +function defsSchema(id: string, defs: Record) { + return { lexicon: 1, id, defs }; } function query(parameters: unknown, output: unknown, methodErrors = errors) { @@ -38,16 +45,16 @@ const emptyParams = params([], {}); const emptyInput = object([], {}); const schemas: Record = { - "link.latr.saved.defs": schema("link.latr.saved.defs", object([], {}), { + "link.latr.saved.defs": defsSchema("link.latr.saved.defs", { record: object(["uri", "cid", "value"], { uri: string({ format: "at-uri" }), cid: string({ format: "cid" }), value: ref("link.latr.saved.item"), }), simpleOk: object(["ok"], { ok: boolean }), saveResult: object(["ok", "kind"], { ok: boolean, - kind: string({ knownValues: ["url", "subject"] }), - subjectUri: string({ format: "at-uri" }), linkedWebUrl: string({ format: "uri", maxLength: 8192, maxGraphemes: 2048 }), - storage: string({ knownValues: ["native", "external"] }), + kind: string({ knownValues: ["url", "subject"], maxLength: 16, maxGraphemes: 16 }), + subjectUri: string({ format: "at-uri", maxLength: 8192, maxGraphemes: 2048 }), linkedWebUrl: string({ format: "uri", maxLength: 8192, maxGraphemes: 2048 }), + storage: string({ knownValues: ["native", "external"], maxLength: 16, maxGraphemes: 16 }), }), migrationResult: object(["ok", "externalCopied", "itemsCopied", "externalDeleted", "itemsDeleted"], { ok: boolean, externalCopied: integer({ minimum: 0 }), itemsCopied: integer({ minimum: 0 }), @@ -72,7 +79,7 @@ const schemas: Record = { }), saveOutput )), "link.latr.saved.setState": schema("link.latr.saved.setState", procedure( - object(["itemRkey", "state"], { itemRkey: string({ format: "record-key", maxLength: 512 }), state: string({ enum: ["unread", "archived"] }) }), simpleOK + object(["itemRkey", "state"], { itemRkey: string({ format: "record-key", maxLength: 512 }), state: string({ enum: ["unread", "archived"], maxLength: 16, maxGraphemes: 16 }) }), simpleOK )), "link.latr.saved.deleteItem": schema("link.latr.saved.deleteItem", procedure( object(["itemRkey"], { itemRkey: string({ format: "record-key", maxLength: 512 }) }), simpleOK @@ -103,10 +110,10 @@ const schemas: Record = { )), }; -schemas["link.latr.developer.defs"] = schema("link.latr.developer.defs", object([], {}), { +schemas["link.latr.developer.defs"] = defsSchema("link.latr.developer.defs", { client: object(["clientId", "kind", "createdAt"], { clientId: string({ maxLength: 128, maxGraphemes: 128 }), displayName: string({ maxLength: 256, maxGraphemes: 128 }), - kind: string({ knownValues: ["developer"] }), createdAt: string({ format: "datetime" }), + kind: string({ knownValues: ["developer"], maxLength: 16, maxGraphemes: 16 }), createdAt: string({ format: "datetime" }), }), key: object(["keyId", "createdAt"], { keyId: string({ maxLength: 128, maxGraphemes: 128 }), label: string({ maxLength: 256, maxGraphemes: 128 }),