This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

feat: stigmergic knowledge synthesis platform

Cloudflare Workers + Containers + Contrail appview that cross-references
Semble cards against local vault and carry data, producing org.latha.strata
synthesis records as stigmergic signals for the network.

- Worker (Hono) with Contrail indexing, connection graph, citation pipeline
- Container analysis engine: reads R2 vault+carry, extracts themes, finds
connections, detects tensions, generates open questions, synthesizes prose
- org.latha.strata lexicon with sourceRef, structuredAnalysis, carryCrossRef
- R2 sync endpoints and CLI script for vault + carry upload
- Frontend SPA with Strata analysis modal on cards and resources
- Per-DID container instances via Durable Objects (10m idle sleep)

👾 Generated with [Letta Code](https://letta.com)

Co-Authored-By: Letta Code <noreply@letta.com>

author
nandi
co-author
Letta Code
date (May 13, 2026, 3:54 AM UTC) commit 1ae6493b
+13082
+5
.gitignore
··· 1 + node_modules/ 2 + .wrangler/ 3 + .letta/ 4 + public/app.js 5 + public/app.js.map
+9
build-frontend.sh
··· 1 + #!/bin/bash 2 + set -e 3 + npx esbuild src/frontend/app.ts \ 4 + --bundle \ 5 + --outfile=public/app.js \ 6 + --format=esm \ 7 + --target=es2022 \ 8 + --sourcemap \ 9 + --minify
+15
container/Dockerfile
··· 1 + FROM node:22-slim 2 + 3 + WORKDIR /app 4 + 5 + # Install deps 6 + COPY container/package.json ./ 7 + RUN npm install --production 8 + 9 + # Copy analysis engine 10 + COPY container/server.ts ./ 11 + COPY container/analysis.ts ./ 12 + 13 + EXPOSE 8080 14 + 15 + CMD ["node", "--experimental-strip-types", "server.ts"]
+412
container/analysis.ts
··· 1 + // ─── Strata Analysis Engine ───────────────────────────────────────── 2 + // Reads vault (markdown) + carry (JSON) from R2 3 + // Cross-references source content against local knowledge 4 + // Returns structured analysis with carry cross-refs 5 + // 6 + // This runs inside a Cloudflare Container with R2 access. 7 + // The container is per-user (each DID gets its own instance). 8 + 9 + import { 10 + S3Client, 11 + GetObjectCommand, 12 + ListObjectsV2Command, 13 + } from "@aws-sdk/client-s3"; 14 + 15 + // R2 config — injected via Worker envVars when the container starts 16 + const R2_ACCOUNT_ID = process.env.R2_ACCOUNT_ID || ""; 17 + const R2_ACCESS_KEY = process.env.R2_ACCESS_KEY || ""; 18 + const R2_SECRET_KEY = process.env.R2_SECRET_KEY || ""; 19 + 20 + const s3 = new S3Client({ 21 + region: "auto", 22 + endpoint: `https://${R2_ACCOUNT_ID}.r2.cloudflarestorage.com`, 23 + credentials: { 24 + accessKeyId: R2_ACCESS_KEY, 25 + secretAccessKey: R2_SECRET_KEY, 26 + }, 27 + }); 28 + 29 + const VAULT_BUCKET = "stigmergic-vault"; 30 + const CARRY_BUCKET = "stigmergic-carry"; 31 + 32 + // ─── Types ────────────────────────────────────────────────────────── 33 + 34 + interface VaultNote { 35 + path: string; 36 + content: string; 37 + } 38 + 39 + interface CarryClaim { 40 + id: string; 41 + body: string; 42 + summary: string; 43 + sentiment: string; 44 + qualifier: string; 45 + atUri: string; 46 + entityType: string; 47 + } 48 + 49 + interface Connection { 50 + description: string; 51 + targetUri: string; 52 + relation: string; 53 + source: "vault" | "carry"; 54 + sourcePath?: string; 55 + carryId?: string; 56 + } 57 + 58 + interface CarryRef { 59 + entityType: "claim" | "citation" | "entity" | "reasoning"; 60 + carryId: string; 61 + atUri: string; 62 + summary: string; 63 + } 64 + 65 + interface AnalysisInput { 66 + sourceUri: string; 67 + sourceCid?: string; 68 + sourceRecord: any; 69 + did: string; 70 + } 71 + 72 + interface AnalysisResult { 73 + themes: string[]; 74 + connections: Connection[]; 75 + tensions: string[]; 76 + openQuestions: string[]; 77 + synthesis: string; 78 + carryRefs: CarryRef[]; 79 + } 80 + 81 + // ─── Main analysis function ──────────────────────────────────────── 82 + 83 + export async function analyze(input: AnalysisInput): Promise<AnalysisResult> { 84 + const { sourceRecord, did } = input; 85 + 86 + // 1. Read vault notes from R2 87 + const vaultNotes = await readVault(did); 88 + 89 + // 2. Read carry claims from R2 90 + const carryClaims = await readCarry(did); 91 + 92 + // 3. Extract themes from source record 93 + const sourceText = extractText(sourceRecord); 94 + const themes = extractThemes(sourceText); 95 + 96 + // 4. Find connections in vault + carry 97 + const connections = findConnections(sourceText, vaultNotes, carryClaims); 98 + 99 + // 5. Find tensions (contradictions, gaps) 100 + const tensions = findTensions(sourceText, carryClaims); 101 + 102 + // 6. Generate open questions 103 + const openQuestions = generateOpenQuestions(sourceText, connections, tensions); 104 + 105 + // 7. Synthesize prose 106 + const synthesis = synthesize( 107 + sourceText, 108 + themes, 109 + connections, 110 + tensions, 111 + openQuestions 112 + ); 113 + 114 + // 8. Build carry cross-refs 115 + const carryRefs = buildCarryRefs(connections, carryClaims); 116 + 117 + return { 118 + themes, 119 + connections, 120 + tensions, 121 + openQuestions, 122 + synthesis, 123 + carryRefs, 124 + }; 125 + } 126 + 127 + // ─── R2 readers ───────────────────────────────────────────────────── 128 + 129 + async function readVault(did: string): Promise<VaultNote[]> { 130 + const prefix = `${did}/`; 131 + try { 132 + const list = await s3.send( 133 + new ListObjectsV2Command({ Bucket: VAULT_BUCKET, Prefix: prefix }) 134 + ); 135 + 136 + const notes: VaultNote[] = []; 137 + for (const obj of list.Contents || []) { 138 + if (!obj.Key?.endsWith(".md")) continue; 139 + try { 140 + const get = await s3.send( 141 + new GetObjectCommand({ Bucket: VAULT_BUCKET, Key: obj.Key }) 142 + ); 143 + const body = await get.Body?.transformToString(); 144 + if (body) { 145 + notes.push({ 146 + path: obj.Key.replace(prefix, ""), 147 + content: body, 148 + }); 149 + } 150 + } catch (e) { 151 + console.error(`Failed to read vault file ${obj.Key}:`, e); 152 + } 153 + } 154 + return notes; 155 + } catch (e) { 156 + console.error("Failed to list vault objects:", e); 157 + return []; 158 + } 159 + } 160 + 161 + async function readCarry(did: string): Promise<CarryClaim[]> { 162 + const prefix = `${did}/`; 163 + try { 164 + const list = await s3.send( 165 + new ListObjectsV2Command({ Bucket: CARRY_BUCKET, Prefix: prefix }) 166 + ); 167 + 168 + const claims: CarryClaim[] = []; 169 + for (const obj of list.Contents || []) { 170 + if (!obj.Key?.endsWith(".json")) continue; 171 + try { 172 + const get = await s3.send( 173 + new GetObjectCommand({ Bucket: CARRY_BUCKET, Key: obj.Key }) 174 + ); 175 + const body = await get.Body?.transformToString(); 176 + if (body) { 177 + try { 178 + const data = JSON.parse(body); 179 + if (Array.isArray(data)) { 180 + claims.push(...data.map(normalizeClaim)); 181 + } else { 182 + claims.push(normalizeClaim(data)); 183 + } 184 + } catch { 185 + // Skip malformed JSON 186 + } 187 + } 188 + } catch (e) { 189 + console.error(`Failed to read carry file ${obj.Key}:`, e); 190 + } 191 + } 192 + return claims; 193 + } catch (e) { 194 + console.error("Failed to list carry objects:", e); 195 + return []; 196 + } 197 + } 198 + 199 + // ─── Analysis functions ───────────────────────────────────────────── 200 + 201 + function extractText(record: any): string { 202 + // Extract text from various Semble record shapes 203 + const parts: string[] = []; 204 + if (record.title) parts.push(record.title); 205 + if (record.text) parts.push(record.text); 206 + if (record.body) parts.push(record.body); 207 + if (record.content) parts.push(record.content); 208 + if (record.description) parts.push(record.description); 209 + if (record.embed?.title) parts.push(record.embed.title); 210 + if (record.embed?.description) parts.push(record.embed.description); 211 + // Semble card shape 212 + if (record.type === "URL" && record.content?.url) parts.push(record.content.url); 213 + if (record.content?.metadata?.title) parts.push(record.content.metadata.title); 214 + if (record.content?.metadata?.description) parts.push(record.content.metadata.description); 215 + if (record.type === "NOTE" && record.content?.text) parts.push(record.content.text); 216 + return parts.join(" "); 217 + } 218 + 219 + function extractThemes(text: string): string[] { 220 + // Keyword-based theme extraction. In production, call an LLM. 221 + const keywords: Record<string, string[]> = { 222 + "open science": ["open science", "open access", "oa", "preprint"], 223 + "data sharing": ["data sharing", "shared data", "open data", "dataset"], 224 + "reproducibility": ["reproducib", "replicab", "replication"], 225 + "atproto": ["atproto", "at protocol", "bluesky", "bsky", "semble"], 226 + "decentralization": ["decentraliz", "federat", "self-host"], 227 + "knowledge graphs": ["knowledge graph", "ontolog", "linked data", "semantic"], 228 + "ai/ml": ["machine learning", "deep learning", "neural", "llm", "gpt", "claude"], 229 + "community": ["community", "collective", "cooperative", "commons"], 230 + "governance": ["governance", "policy", "regulation", "standards"], 231 + "infrastructure": ["infrastructure", "platform", "tooling", "pipeline"], 232 + "stigmergy": ["stigmerg", "pheromone", "emergent", "self-organiz"], 233 + "provenance": ["provenance", "lineage", "traceability", "attribution"], 234 + "doi": ["doi", "zenodo", "citeable", "citation"], 235 + "privacy": ["privacy", "encryption", "e2ee", "consent"], 236 + "sovereignty": ["sovereignty", "self-determin", "autonomy", "agency"], 237 + }; 238 + 239 + const lower = text.toLowerCase(); 240 + return Object.entries(keywords) 241 + .filter(([_, terms]) => terms.some(t => lower.includes(t))) 242 + .map(([theme]) => theme); 243 + } 244 + 245 + function findConnections( 246 + sourceText: string, 247 + vaultNotes: VaultNote[], 248 + carryClaims: CarryClaim[] 249 + ): Connection[] { 250 + const connections: Connection[] = []; 251 + const lower = sourceText.toLowerCase(); 252 + 253 + // Check vault notes for overlapping themes 254 + for (const note of vaultNotes) { 255 + const noteLower = note.content.toLowerCase(); 256 + const overlap = keywordOverlap(lower, noteLower); 257 + if (overlap.length >= 2) { 258 + connections.push({ 259 + description: `Vault note "${note.path}" shares themes: ${overlap.join(", ")}`, 260 + targetUri: "", 261 + relation: "contextualizes", 262 + source: "vault", 263 + sourcePath: note.path, 264 + }); 265 + } 266 + } 267 + 268 + // Check carry claims for related claims 269 + for (const claim of carryClaims) { 270 + const claimText = (claim.body || claim.summary || "").toLowerCase(); 271 + const overlap = keywordOverlap(lower, claimText); 272 + if (overlap.length >= 1) { 273 + connections.push({ 274 + description: `Carry claim: "${claim.summary || claim.body?.slice(0, 100)}"`, 275 + targetUri: claim.atUri || "", 276 + relation: claim.sentiment === "negative" ? "contradicts" : "supports", 277 + source: "carry", 278 + carryId: claim.id, 279 + }); 280 + } 281 + } 282 + 283 + return connections.slice(0, 10); 284 + } 285 + 286 + function findTensions( 287 + sourceText: string, 288 + carryClaims: CarryClaim[] 289 + ): string[] { 290 + const tensions: string[] = []; 291 + const lower = sourceText.toLowerCase(); 292 + 293 + for (const claim of carryClaims) { 294 + if (claim.sentiment === "negative" || claim.qualifier === "but" || claim.qualifier === "however") { 295 + const claimText = (claim.body || claim.summary || "").toLowerCase(); 296 + const overlap = keywordOverlap(lower, claimText); 297 + if (overlap.length >= 1) { 298 + tensions.push( 299 + `Your carry data notes a tension: "${claim.summary || claim.body?.slice(0, 150)}"` 300 + ); 301 + } 302 + } 303 + } 304 + 305 + return tensions.slice(0, 5); 306 + } 307 + 308 + function generateOpenQuestions( 309 + sourceText: string, 310 + connections: Connection[], 311 + tensions: string[] 312 + ): string[] { 313 + const questions: string[] = []; 314 + 315 + if (connections.length > 0) { 316 + const carryCount = connections.filter(c => c.source === "carry").length; 317 + questions.push( 318 + `How does this source extend or challenge your existing ${carryCount} carry claims?` 319 + ); 320 + } 321 + 322 + if (tensions.length > 0) { 323 + questions.push( 324 + `What evidence would resolve the ${tensions.length} tension(s) identified?` 325 + ); 326 + } 327 + 328 + const lower = sourceText.toLowerCase(); 329 + if (lower.includes("data") || lower.includes("dataset")) { 330 + questions.push("What data artifacts does this source produce, and are they in Zenodo?"); 331 + } 332 + if (lower.includes("standard") || lower.includes("protocol")) { 333 + questions.push("Does this propose a new standard, and who are the adopters?"); 334 + } 335 + if (lower.includes("community") || lower.includes("collective")) { 336 + questions.push("What governance model does this community use?"); 337 + } 338 + 339 + return questions.slice(0, 5); 340 + } 341 + 342 + function synthesize( 343 + sourceText: string, 344 + themes: string[], 345 + connections: Connection[], 346 + tensions: string[], 347 + openQuestions: string[] 348 + ): string { 349 + // Template-based synthesis. In production, call an LLM. 350 + const themeStr = themes.length > 0 351 + ? `This source touches on ${themes.join(", ")}.` 352 + : "This source covers a specific topic."; 353 + 354 + const connStr = connections.length > 0 355 + ? `It connects to ${connections.length} items in your knowledge base: ${connections.slice(0, 3).map(c => c.description).join("; ")}.` 356 + : "No direct connections found in your existing knowledge."; 357 + 358 + const tensionStr = tensions.length > 0 359 + ? `There ${tensions.length === 1 ? "is 1 tension" : `are ${tensions.length} tensions`} with your existing claims.` 360 + : ""; 361 + 362 + const questionStr = openQuestions.length > 0 363 + ? `Open questions: ${openQuestions.join(" ")}` 364 + : ""; 365 + 366 + return [themeStr, connStr, tensionStr, questionStr].filter(Boolean).join(" "); 367 + } 368 + 369 + function buildCarryRefs( 370 + connections: Connection[], 371 + _carryClaims: CarryClaim[] 372 + ): CarryRef[] { 373 + return connections 374 + .filter(c => c.source === "carry") 375 + .map(c => ({ 376 + entityType: "claim" as const, 377 + carryId: c.carryId || "", 378 + atUri: c.targetUri || "", 379 + summary: c.description, 380 + })); 381 + } 382 + 383 + // ─── Utilities ────────────────────────────────────────────────────── 384 + 385 + const STOP_WORDS = new Set([ 386 + "the", "a", "an", "is", "are", "was", "were", "be", "been", "being", 387 + "have", "has", "had", "do", "does", "did", "will", "would", "could", 388 + "should", "may", "might", "shall", "can", "to", "of", "in", "for", 389 + "on", "with", "at", "by", "from", "as", "into", "through", "during", 390 + "before", "after", "above", "below", "between", "and", "but", "or", 391 + "not", "no", "nor", "so", "if", "then", "that", "this", "it", "its", 392 + ]); 393 + 394 + function keywordOverlap(textA: string, textB: string): string[] { 395 + const wordsA = new Set( 396 + textA.split(/\W+/).filter(w => w.length > 3 && !STOP_WORDS.has(w)) 397 + ); 398 + const wordsB = textB.split(/\W+/).filter(w => w.length > 3 && !STOP_WORDS.has(w)); 399 + return wordsB.filter(w => wordsA.has(w)); 400 + } 401 + 402 + function normalizeClaim(data: any): CarryClaim { 403 + return { 404 + id: data.id || data.claimId || crypto.randomUUID(), 405 + body: data.body || data.text || data.claim || "", 406 + summary: data.summary || data.title || "", 407 + sentiment: data.sentiment || "neutral", 408 + qualifier: data.qualifier || "", 409 + atUri: data.atUri || "", 410 + entityType: data.entityType || "claim", 411 + }; 412 + }
+9
container/package.json
··· 1 + { 2 + "name": "stigmergic-analysis", 3 + "version": "0.1.0", 4 + "private": true, 5 + "type": "module", 6 + "dependencies": { 7 + "@aws-sdk/client-s3": "^3.600.0" 8 + } 9 + }
+42
container/server.ts
··· 1 + // ─── Strata Analysis Container Server ──────────────────────────────── 2 + // HTTP server running inside the Cloudflare Container. 3 + // Accepts analysis requests, reads vault + carry from R2, returns 4 + // structured analysis. 5 + 6 + import { analyze } from "./analysis.js"; 7 + import { createServer } from "http"; 8 + 9 + const PORT = 8080; 10 + 11 + createServer(async (req, res) => { 12 + const url = new URL(req.url || "/", `http://localhost:${PORT}`); 13 + 14 + if (url.pathname === "/analyze" && req.method === "POST") { 15 + const chunks: Buffer[] = []; 16 + for await (const chunk of req) chunks.push(chunk); 17 + const body = Buffer.concat(chunks).toString(); 18 + 19 + try { 20 + const input = JSON.parse(body); 21 + const result = await analyze(input); 22 + res.writeHead(200, { "Content-Type": "application/json" }); 23 + res.end(JSON.stringify(result)); 24 + } catch (e: any) { 25 + console.error("Analysis error:", e); 26 + res.writeHead(500, { "Content-Type": "application/json" }); 27 + res.end(JSON.stringify({ error: e.message })); 28 + } 29 + return; 30 + } 31 + 32 + if (url.pathname === "/health") { 33 + res.writeHead(200); 34 + res.end("ok"); 35 + return; 36 + } 37 + 38 + res.writeHead(404); 39 + res.end("Not found"); 40 + }).listen(PORT, () => { 41 + console.log(`Strata analysis container listening on port ${PORT}`); 42 + });
+27
lex.config.js
··· 1 + import { defineLexiconConfig } from "@atcute/lex-cli"; 2 + 3 + export default defineLexiconConfig({ 4 + files: ["lexicons/custom/**/*.json", "lexicons/pulled/**/*.json", "lexicons/generated/**/*.json"], 5 + outdir: "src/lexicon-types/", 6 + imports: ["@atcute/atproto"], 7 + pull: { 8 + outdir: "lexicons/pulled/", 9 + sources: [ 10 + { 11 + type: "atproto", 12 + mode: "nsids", 13 + nsids: [ 14 + "app.bsky.actor.profile", 15 + "network.cosmik.card", 16 + "network.cosmik.collection", 17 + "network.cosmik.connection", 18 + "network.cosmik.defs", 19 + "network.cosmik.follow", 20 + "org.latha.strata.citation", 21 + "org.latha.strata.entity", 22 + "org.latha.strata.reasoning" 23 + ], 24 + }, 25 + ], 26 + }, 27 + });
+30
lexicons/generated/index.ts
··· 1 + // Auto-generated by @atmo-dev/contrail-lexicons. Do not edit. 2 + // Pass `lexicons` to `createWorker(config, { lexicons })` to expose them 3 + // at `/xrpc/<namespace>.lexicons` for consumer apps to typegen against. 4 + 5 + import _0 from "../pulled/app/bsky/actor/profile.json"; 6 + import _1 from "../pulled/network/cosmik/card.json"; 7 + import _2 from "../pulled/network/cosmik/collection.json"; 8 + import _3 from "../pulled/network/cosmik/connection.json"; 9 + import _4 from "../pulled/network/cosmik/follow.json"; 10 + import _5 from "./org/latha/strata/authFull.json"; 11 + import _6 from "./org/latha/strata/card/getRecord.json"; 12 + import _7 from "./org/latha/strata/card/listRecords.json"; 13 + import _8 from "./org/latha/strata/citation/getRecord.json"; 14 + import _9 from "./org/latha/strata/citation/listRecords.json"; 15 + import _10 from "./org/latha/strata/collection/getRecord.json"; 16 + import _11 from "./org/latha/strata/collection/listRecords.json"; 17 + import _12 from "./org/latha/strata/connection/getRecord.json"; 18 + import _13 from "./org/latha/strata/connection/listRecords.json"; 19 + import _14 from "./org/latha/strata/entity/getRecord.json"; 20 + import _15 from "./org/latha/strata/entity/listRecords.json"; 21 + import _16 from "./org/latha/strata/follow/getRecord.json"; 22 + import _17 from "./org/latha/strata/follow/listRecords.json"; 23 + import _18 from "./org/latha/strata/getCursor.json"; 24 + import _19 from "./org/latha/strata/getOverview.json"; 25 + import _20 from "./org/latha/strata/getProfile.json"; 26 + import _21 from "./org/latha/strata/notifyOfUpdate.json"; 27 + import _22 from "./org/latha/strata/reasoning/getRecord.json"; 28 + import _23 from "./org/latha/strata/reasoning/listRecords.json"; 29 + 30 + export const lexicons: object[] = [_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23];
+47
lexicons/generated/org/latha/strata/authFull.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.authFull", 4 + "defs": { 5 + "main": { 6 + "type": "permission-set", 7 + "title": "org.latha.strata", 8 + "description": "Full access to the org.latha.strata service", 9 + "permissions": [ 10 + { 11 + "type": "permission", 12 + "resource": "rpc", 13 + "aud": "*", 14 + "lxm": [ 15 + "org.latha.strata.card.getRecord", 16 + "org.latha.strata.card.listRecords", 17 + "org.latha.strata.citation.getRecord", 18 + "org.latha.strata.citation.listRecords", 19 + "org.latha.strata.collection.getRecord", 20 + "org.latha.strata.collection.listRecords", 21 + "org.latha.strata.connection.getRecord", 22 + "org.latha.strata.connection.listRecords", 23 + "org.latha.strata.entity.getRecord", 24 + "org.latha.strata.entity.listRecords", 25 + "org.latha.strata.follow.getRecord", 26 + "org.latha.strata.follow.listRecords", 27 + "org.latha.strata.getCursor", 28 + "org.latha.strata.getOverview", 29 + "org.latha.strata.getProfile", 30 + "org.latha.strata.notifyOfUpdate", 31 + "org.latha.strata.reasoning.getRecord", 32 + "org.latha.strata.reasoning.listRecords" 33 + ] 34 + }, 35 + { 36 + "type": "permission", 37 + "resource": "repo", 38 + "collection": [ 39 + "org.latha.strata.citation", 40 + "org.latha.strata.entity", 41 + "org.latha.strata.reasoning" 42 + ] 43 + } 44 + ] 45 + } 46 + } 47 + }
+218
lexicons/generated/org/latha/strata/card/getRecord.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.card.getRecord", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a single network.cosmik.card record by AT URI", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "uri" 12 + ], 13 + "properties": { 14 + "uri": { 15 + "type": "string", 16 + "format": "at-uri", 17 + "description": "AT URI of the record" 18 + }, 19 + "profiles": { 20 + "type": "boolean", 21 + "description": "Include profile + identity info keyed by DID" 22 + }, 23 + "hydrateParentCard": { 24 + "type": "boolean", 25 + "description": "Embed the referenced parentCard record" 26 + } 27 + } 28 + }, 29 + "output": { 30 + "encoding": "application/json", 31 + "schema": { 32 + "type": "object", 33 + "required": [ 34 + "uri", 35 + "value", 36 + "did", 37 + "collection", 38 + "rkey", 39 + "time_us" 40 + ], 41 + "properties": { 42 + "uri": { 43 + "type": "string", 44 + "format": "at-uri" 45 + }, 46 + "cid": { 47 + "type": "string", 48 + "format": "cid" 49 + }, 50 + "value": { 51 + "type": "ref", 52 + "ref": "network.cosmik.card#main" 53 + }, 54 + "did": { 55 + "type": "string", 56 + "format": "did" 57 + }, 58 + "collection": { 59 + "type": "string", 60 + "format": "nsid" 61 + }, 62 + "rkey": { 63 + "type": "string" 64 + }, 65 + "time_us": { 66 + "type": "integer" 67 + }, 68 + "parentCard": { 69 + "type": "ref", 70 + "ref": "#refParentCardRecord" 71 + }, 72 + "profiles": { 73 + "type": "array", 74 + "items": { 75 + "type": "ref", 76 + "ref": "#profileEntry" 77 + } 78 + } 79 + } 80 + } 81 + } 82 + }, 83 + "refParentCardRecord": { 84 + "type": "object", 85 + "required": [ 86 + "uri", 87 + "did", 88 + "collection", 89 + "rkey", 90 + "time_us" 91 + ], 92 + "properties": { 93 + "uri": { 94 + "type": "string", 95 + "format": "at-uri" 96 + }, 97 + "did": { 98 + "type": "string", 99 + "format": "did" 100 + }, 101 + "collection": { 102 + "type": "string", 103 + "format": "nsid" 104 + }, 105 + "rkey": { 106 + "type": "string" 107 + }, 108 + "cid": { 109 + "type": "string" 110 + }, 111 + "record": { 112 + "type": "ref", 113 + "ref": "network.cosmik.card#main" 114 + }, 115 + "time_us": { 116 + "type": "integer" 117 + } 118 + } 119 + }, 120 + "profileEntry": { 121 + "type": "object", 122 + "required": [ 123 + "did" 124 + ], 125 + "properties": { 126 + "did": { 127 + "type": "string", 128 + "format": "did" 129 + }, 130 + "handle": { 131 + "type": "string" 132 + }, 133 + "uri": { 134 + "type": "string", 135 + "format": "at-uri" 136 + }, 137 + "cid": { 138 + "type": "string", 139 + "format": "cid" 140 + }, 141 + "value": { 142 + "type": "ref", 143 + "ref": "#appBskyActorProfile" 144 + }, 145 + "collection": { 146 + "type": "string", 147 + "format": "nsid" 148 + }, 149 + "rkey": { 150 + "type": "string" 151 + } 152 + } 153 + }, 154 + "appBskyActorProfile": { 155 + "type": "object", 156 + "properties": { 157 + "avatar": { 158 + "type": "blob", 159 + "accept": [ 160 + "image/png", 161 + "image/jpeg" 162 + ], 163 + "maxSize": 1000000, 164 + "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'" 165 + }, 166 + "banner": { 167 + "type": "blob", 168 + "accept": [ 169 + "image/png", 170 + "image/jpeg" 171 + ], 172 + "maxSize": 1000000, 173 + "description": "Larger horizontal image to display behind profile view." 174 + }, 175 + "labels": { 176 + "refs": [ 177 + "com.atproto.label.defs#selfLabels" 178 + ], 179 + "type": "union", 180 + "description": "Self-label values, specific to the Bluesky application, on the overall account." 181 + }, 182 + "website": { 183 + "type": "string", 184 + "format": "uri" 185 + }, 186 + "pronouns": { 187 + "type": "string", 188 + "maxLength": 200, 189 + "description": "Free-form pronouns text.", 190 + "maxGraphemes": 20 191 + }, 192 + "createdAt": { 193 + "type": "string", 194 + "format": "datetime" 195 + }, 196 + "pinnedPost": { 197 + "ref": "com.atproto.repo.strongRef", 198 + "type": "ref" 199 + }, 200 + "description": { 201 + "type": "string", 202 + "maxLength": 2560, 203 + "description": "Free-form profile description text.", 204 + "maxGraphemes": 256 205 + }, 206 + "displayName": { 207 + "type": "string", 208 + "maxLength": 640, 209 + "maxGraphemes": 64 210 + }, 211 + "joinedViaStarterPack": { 212 + "ref": "com.atproto.repo.strongRef", 213 + "type": "ref" 214 + } 215 + } 216 + } 217 + } 218 + }
+271
lexicons/generated/org/latha/strata/card/listRecords.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.card.listRecords", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Query network.cosmik.card records with filters", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "limit": { 12 + "type": "integer", 13 + "minimum": 1, 14 + "maximum": 200, 15 + "default": 50 16 + }, 17 + "cursor": { 18 + "type": "string" 19 + }, 20 + "actor": { 21 + "type": "string", 22 + "format": "at-identifier", 23 + "description": "Filter by DID or handle (triggers on-demand backfill)" 24 + }, 25 + "profiles": { 26 + "type": "boolean", 27 + "description": "Include profile + identity info keyed by DID" 28 + }, 29 + "search": { 30 + "type": "string", 31 + "description": "Full-text search across: content.url, content.text, content.metadata.title, content.metadata.description" 32 + }, 33 + "type": { 34 + "type": "string", 35 + "description": "Filter by type" 36 + }, 37 + "contentUrl": { 38 + "type": "string", 39 + "description": "Filter by content.url" 40 + }, 41 + "hydrateParentCard": { 42 + "type": "boolean", 43 + "description": "Embed the referenced parentCard record" 44 + }, 45 + "sort": { 46 + "type": "string", 47 + "knownValues": [ 48 + "type", 49 + "contentUrl" 50 + ], 51 + "description": "Field to sort by (default: time_us)" 52 + }, 53 + "order": { 54 + "type": "string", 55 + "knownValues": [ 56 + "asc", 57 + "desc" 58 + ], 59 + "description": "Sort direction (default: desc for dates/numbers/counts, asc for strings)" 60 + } 61 + } 62 + }, 63 + "output": { 64 + "encoding": "application/json", 65 + "schema": { 66 + "type": "object", 67 + "required": [ 68 + "records" 69 + ], 70 + "properties": { 71 + "records": { 72 + "type": "array", 73 + "items": { 74 + "type": "ref", 75 + "ref": "#record" 76 + } 77 + }, 78 + "cursor": { 79 + "type": "string" 80 + }, 81 + "profiles": { 82 + "type": "array", 83 + "items": { 84 + "type": "ref", 85 + "ref": "#profileEntry" 86 + } 87 + } 88 + } 89 + } 90 + } 91 + }, 92 + "record": { 93 + "type": "object", 94 + "required": [ 95 + "uri", 96 + "cid", 97 + "value", 98 + "did", 99 + "collection", 100 + "rkey", 101 + "time_us" 102 + ], 103 + "properties": { 104 + "uri": { 105 + "type": "string", 106 + "format": "at-uri" 107 + }, 108 + "cid": { 109 + "type": "string", 110 + "format": "cid" 111 + }, 112 + "value": { 113 + "type": "ref", 114 + "ref": "network.cosmik.card#main" 115 + }, 116 + "did": { 117 + "type": "string", 118 + "format": "did" 119 + }, 120 + "collection": { 121 + "type": "string", 122 + "format": "nsid" 123 + }, 124 + "rkey": { 125 + "type": "string" 126 + }, 127 + "time_us": { 128 + "type": "integer" 129 + }, 130 + "parentCard": { 131 + "type": "ref", 132 + "ref": "#refParentCardRecord" 133 + } 134 + } 135 + }, 136 + "refParentCardRecord": { 137 + "type": "object", 138 + "required": [ 139 + "uri", 140 + "did", 141 + "collection", 142 + "rkey", 143 + "time_us" 144 + ], 145 + "properties": { 146 + "uri": { 147 + "type": "string", 148 + "format": "at-uri" 149 + }, 150 + "did": { 151 + "type": "string", 152 + "format": "did" 153 + }, 154 + "collection": { 155 + "type": "string", 156 + "format": "nsid" 157 + }, 158 + "rkey": { 159 + "type": "string" 160 + }, 161 + "cid": { 162 + "type": "string" 163 + }, 164 + "record": { 165 + "type": "ref", 166 + "ref": "network.cosmik.card#main" 167 + }, 168 + "time_us": { 169 + "type": "integer" 170 + } 171 + } 172 + }, 173 + "profileEntry": { 174 + "type": "object", 175 + "required": [ 176 + "did" 177 + ], 178 + "properties": { 179 + "did": { 180 + "type": "string", 181 + "format": "did" 182 + }, 183 + "handle": { 184 + "type": "string" 185 + }, 186 + "uri": { 187 + "type": "string", 188 + "format": "at-uri" 189 + }, 190 + "cid": { 191 + "type": "string", 192 + "format": "cid" 193 + }, 194 + "value": { 195 + "type": "ref", 196 + "ref": "#appBskyActorProfile" 197 + }, 198 + "collection": { 199 + "type": "string", 200 + "format": "nsid" 201 + }, 202 + "rkey": { 203 + "type": "string" 204 + } 205 + } 206 + }, 207 + "appBskyActorProfile": { 208 + "type": "object", 209 + "properties": { 210 + "avatar": { 211 + "type": "blob", 212 + "accept": [ 213 + "image/png", 214 + "image/jpeg" 215 + ], 216 + "maxSize": 1000000, 217 + "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'" 218 + }, 219 + "banner": { 220 + "type": "blob", 221 + "accept": [ 222 + "image/png", 223 + "image/jpeg" 224 + ], 225 + "maxSize": 1000000, 226 + "description": "Larger horizontal image to display behind profile view." 227 + }, 228 + "labels": { 229 + "refs": [ 230 + "com.atproto.label.defs#selfLabels" 231 + ], 232 + "type": "union", 233 + "description": "Self-label values, specific to the Bluesky application, on the overall account." 234 + }, 235 + "website": { 236 + "type": "string", 237 + "format": "uri" 238 + }, 239 + "pronouns": { 240 + "type": "string", 241 + "maxLength": 200, 242 + "description": "Free-form pronouns text.", 243 + "maxGraphemes": 20 244 + }, 245 + "createdAt": { 246 + "type": "string", 247 + "format": "datetime" 248 + }, 249 + "pinnedPost": { 250 + "ref": "com.atproto.repo.strongRef", 251 + "type": "ref" 252 + }, 253 + "description": { 254 + "type": "string", 255 + "maxLength": 2560, 256 + "description": "Free-form profile description text.", 257 + "maxGraphemes": 256 258 + }, 259 + "displayName": { 260 + "type": "string", 261 + "maxLength": 640, 262 + "maxGraphemes": 64 263 + }, 264 + "joinedViaStarterPack": { 265 + "ref": "com.atproto.repo.strongRef", 266 + "type": "ref" 267 + } 268 + } 269 + } 270 + } 271 + }
+225
lexicons/generated/org/latha/strata/citation/getRecord.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.citation.getRecord", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a single org.latha.strata.citation record by AT URI", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "uri" 12 + ], 13 + "properties": { 14 + "uri": { 15 + "type": "string", 16 + "format": "at-uri", 17 + "description": "AT URI of the record" 18 + }, 19 + "profiles": { 20 + "type": "boolean", 21 + "description": "Include profile + identity info keyed by DID" 22 + }, 23 + "hydrateReasoning": { 24 + "type": "integer", 25 + "minimum": 1, 26 + "maximum": 50, 27 + "description": "Number of reasoning records to embed" 28 + } 29 + } 30 + }, 31 + "output": { 32 + "encoding": "application/json", 33 + "schema": { 34 + "type": "object", 35 + "required": [ 36 + "uri", 37 + "value", 38 + "did", 39 + "collection", 40 + "rkey", 41 + "time_us" 42 + ], 43 + "properties": { 44 + "uri": { 45 + "type": "string", 46 + "format": "at-uri" 47 + }, 48 + "cid": { 49 + "type": "string", 50 + "format": "cid" 51 + }, 52 + "value": { 53 + "type": "unknown" 54 + }, 55 + "did": { 56 + "type": "string", 57 + "format": "did" 58 + }, 59 + "collection": { 60 + "type": "string", 61 + "format": "nsid" 62 + }, 63 + "rkey": { 64 + "type": "string" 65 + }, 66 + "time_us": { 67 + "type": "integer" 68 + }, 69 + "reasoningCount": { 70 + "type": "integer", 71 + "description": "Total reasoning count" 72 + }, 73 + "reasoning": { 74 + "type": "array", 75 + "items": { 76 + "type": "ref", 77 + "ref": "#hydrateReasoningRecord" 78 + } 79 + }, 80 + "profiles": { 81 + "type": "array", 82 + "items": { 83 + "type": "ref", 84 + "ref": "#profileEntry" 85 + } 86 + } 87 + } 88 + } 89 + } 90 + }, 91 + "hydrateReasoningRecord": { 92 + "type": "object", 93 + "required": [ 94 + "uri", 95 + "did", 96 + "collection", 97 + "rkey", 98 + "time_us" 99 + ], 100 + "properties": { 101 + "uri": { 102 + "type": "string", 103 + "format": "at-uri" 104 + }, 105 + "did": { 106 + "type": "string", 107 + "format": "did" 108 + }, 109 + "collection": { 110 + "type": "string", 111 + "format": "nsid" 112 + }, 113 + "rkey": { 114 + "type": "string" 115 + }, 116 + "cid": { 117 + "type": "string" 118 + }, 119 + "record": { 120 + "type": "unknown" 121 + }, 122 + "time_us": { 123 + "type": "integer" 124 + } 125 + } 126 + }, 127 + "profileEntry": { 128 + "type": "object", 129 + "required": [ 130 + "did" 131 + ], 132 + "properties": { 133 + "did": { 134 + "type": "string", 135 + "format": "did" 136 + }, 137 + "handle": { 138 + "type": "string" 139 + }, 140 + "uri": { 141 + "type": "string", 142 + "format": "at-uri" 143 + }, 144 + "cid": { 145 + "type": "string", 146 + "format": "cid" 147 + }, 148 + "value": { 149 + "type": "ref", 150 + "ref": "#appBskyActorProfile" 151 + }, 152 + "collection": { 153 + "type": "string", 154 + "format": "nsid" 155 + }, 156 + "rkey": { 157 + "type": "string" 158 + } 159 + } 160 + }, 161 + "appBskyActorProfile": { 162 + "type": "object", 163 + "properties": { 164 + "avatar": { 165 + "type": "blob", 166 + "accept": [ 167 + "image/png", 168 + "image/jpeg" 169 + ], 170 + "maxSize": 1000000, 171 + "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'" 172 + }, 173 + "banner": { 174 + "type": "blob", 175 + "accept": [ 176 + "image/png", 177 + "image/jpeg" 178 + ], 179 + "maxSize": 1000000, 180 + "description": "Larger horizontal image to display behind profile view." 181 + }, 182 + "labels": { 183 + "refs": [ 184 + "com.atproto.label.defs#selfLabels" 185 + ], 186 + "type": "union", 187 + "description": "Self-label values, specific to the Bluesky application, on the overall account." 188 + }, 189 + "website": { 190 + "type": "string", 191 + "format": "uri" 192 + }, 193 + "pronouns": { 194 + "type": "string", 195 + "maxLength": 200, 196 + "description": "Free-form pronouns text.", 197 + "maxGraphemes": 20 198 + }, 199 + "createdAt": { 200 + "type": "string", 201 + "format": "datetime" 202 + }, 203 + "pinnedPost": { 204 + "ref": "com.atproto.repo.strongRef", 205 + "type": "ref" 206 + }, 207 + "description": { 208 + "type": "string", 209 + "maxLength": 2560, 210 + "description": "Free-form profile description text.", 211 + "maxGraphemes": 256 212 + }, 213 + "displayName": { 214 + "type": "string", 215 + "maxLength": 640, 216 + "maxGraphemes": 64 217 + }, 218 + "joinedViaStarterPack": { 219 + "ref": "com.atproto.repo.strongRef", 220 + "type": "ref" 221 + } 222 + } 223 + } 224 + } 225 + }
+288
lexicons/generated/org/latha/strata/citation/listRecords.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.citation.listRecords", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Query org.latha.strata.citation records with filters", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "limit": { 12 + "type": "integer", 13 + "minimum": 1, 14 + "maximum": 200, 15 + "default": 50 16 + }, 17 + "cursor": { 18 + "type": "string" 19 + }, 20 + "actor": { 21 + "type": "string", 22 + "format": "at-identifier", 23 + "description": "Filter by DID or handle (triggers on-demand backfill)" 24 + }, 25 + "profiles": { 26 + "type": "boolean", 27 + "description": "Include profile + identity info keyed by DID" 28 + }, 29 + "search": { 30 + "type": "string", 31 + "description": "Full-text search across: title, takeaway" 32 + }, 33 + "url": { 34 + "type": "string", 35 + "description": "Filter by url" 36 + }, 37 + "confidence": { 38 + "type": "string", 39 + "description": "Filter by confidence" 40 + }, 41 + "domain": { 42 + "type": "string", 43 + "description": "Filter by domain" 44 + }, 45 + "reasoningCountMin": { 46 + "type": "integer", 47 + "description": "Minimum total reasoning count" 48 + }, 49 + "hydrateReasoning": { 50 + "type": "integer", 51 + "minimum": 1, 52 + "maximum": 50, 53 + "description": "Number of reasoning records to embed per record" 54 + }, 55 + "sort": { 56 + "type": "string", 57 + "knownValues": [ 58 + "url", 59 + "confidence", 60 + "domain", 61 + "reasoningCount" 62 + ], 63 + "description": "Field to sort by (default: time_us)" 64 + }, 65 + "order": { 66 + "type": "string", 67 + "knownValues": [ 68 + "asc", 69 + "desc" 70 + ], 71 + "description": "Sort direction (default: desc for dates/numbers/counts, asc for strings)" 72 + } 73 + } 74 + }, 75 + "output": { 76 + "encoding": "application/json", 77 + "schema": { 78 + "type": "object", 79 + "required": [ 80 + "records" 81 + ], 82 + "properties": { 83 + "records": { 84 + "type": "array", 85 + "items": { 86 + "type": "ref", 87 + "ref": "#record" 88 + } 89 + }, 90 + "cursor": { 91 + "type": "string" 92 + }, 93 + "profiles": { 94 + "type": "array", 95 + "items": { 96 + "type": "ref", 97 + "ref": "#profileEntry" 98 + } 99 + } 100 + } 101 + } 102 + } 103 + }, 104 + "record": { 105 + "type": "object", 106 + "required": [ 107 + "uri", 108 + "cid", 109 + "value", 110 + "did", 111 + "collection", 112 + "rkey", 113 + "time_us" 114 + ], 115 + "properties": { 116 + "uri": { 117 + "type": "string", 118 + "format": "at-uri" 119 + }, 120 + "cid": { 121 + "type": "string", 122 + "format": "cid" 123 + }, 124 + "value": { 125 + "type": "unknown" 126 + }, 127 + "did": { 128 + "type": "string", 129 + "format": "did" 130 + }, 131 + "collection": { 132 + "type": "string", 133 + "format": "nsid" 134 + }, 135 + "rkey": { 136 + "type": "string" 137 + }, 138 + "time_us": { 139 + "type": "integer" 140 + }, 141 + "reasoningCount": { 142 + "type": "integer", 143 + "description": "Total reasoning count" 144 + }, 145 + "reasoning": { 146 + "type": "array", 147 + "items": { 148 + "type": "ref", 149 + "ref": "#hydrateReasoningRecord" 150 + } 151 + } 152 + } 153 + }, 154 + "hydrateReasoningRecord": { 155 + "type": "object", 156 + "required": [ 157 + "uri", 158 + "did", 159 + "collection", 160 + "rkey", 161 + "time_us" 162 + ], 163 + "properties": { 164 + "uri": { 165 + "type": "string", 166 + "format": "at-uri" 167 + }, 168 + "did": { 169 + "type": "string", 170 + "format": "did" 171 + }, 172 + "collection": { 173 + "type": "string", 174 + "format": "nsid" 175 + }, 176 + "rkey": { 177 + "type": "string" 178 + }, 179 + "cid": { 180 + "type": "string" 181 + }, 182 + "record": { 183 + "type": "unknown" 184 + }, 185 + "time_us": { 186 + "type": "integer" 187 + } 188 + } 189 + }, 190 + "profileEntry": { 191 + "type": "object", 192 + "required": [ 193 + "did" 194 + ], 195 + "properties": { 196 + "did": { 197 + "type": "string", 198 + "format": "did" 199 + }, 200 + "handle": { 201 + "type": "string" 202 + }, 203 + "uri": { 204 + "type": "string", 205 + "format": "at-uri" 206 + }, 207 + "cid": { 208 + "type": "string", 209 + "format": "cid" 210 + }, 211 + "value": { 212 + "type": "ref", 213 + "ref": "#appBskyActorProfile" 214 + }, 215 + "collection": { 216 + "type": "string", 217 + "format": "nsid" 218 + }, 219 + "rkey": { 220 + "type": "string" 221 + } 222 + } 223 + }, 224 + "appBskyActorProfile": { 225 + "type": "object", 226 + "properties": { 227 + "avatar": { 228 + "type": "blob", 229 + "accept": [ 230 + "image/png", 231 + "image/jpeg" 232 + ], 233 + "maxSize": 1000000, 234 + "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'" 235 + }, 236 + "banner": { 237 + "type": "blob", 238 + "accept": [ 239 + "image/png", 240 + "image/jpeg" 241 + ], 242 + "maxSize": 1000000, 243 + "description": "Larger horizontal image to display behind profile view." 244 + }, 245 + "labels": { 246 + "refs": [ 247 + "com.atproto.label.defs#selfLabels" 248 + ], 249 + "type": "union", 250 + "description": "Self-label values, specific to the Bluesky application, on the overall account." 251 + }, 252 + "website": { 253 + "type": "string", 254 + "format": "uri" 255 + }, 256 + "pronouns": { 257 + "type": "string", 258 + "maxLength": 200, 259 + "description": "Free-form pronouns text.", 260 + "maxGraphemes": 20 261 + }, 262 + "createdAt": { 263 + "type": "string", 264 + "format": "datetime" 265 + }, 266 + "pinnedPost": { 267 + "ref": "com.atproto.repo.strongRef", 268 + "type": "ref" 269 + }, 270 + "description": { 271 + "type": "string", 272 + "maxLength": 2560, 273 + "description": "Free-form profile description text.", 274 + "maxGraphemes": 256 275 + }, 276 + "displayName": { 277 + "type": "string", 278 + "maxLength": 640, 279 + "maxGraphemes": 64 280 + }, 281 + "joinedViaStarterPack": { 282 + "ref": "com.atproto.repo.strongRef", 283 + "type": "ref" 284 + } 285 + } 286 + } 287 + } 288 + }
+227
lexicons/generated/org/latha/strata/collection/getRecord.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.collection.getRecord", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a single network.cosmik.collection record by AT URI", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "uri" 12 + ], 13 + "properties": { 14 + "uri": { 15 + "type": "string", 16 + "format": "at-uri", 17 + "description": "AT URI of the record" 18 + }, 19 + "profiles": { 20 + "type": "boolean", 21 + "description": "Include profile + identity info keyed by DID" 22 + }, 23 + "hydrateCards": { 24 + "type": "integer", 25 + "minimum": 1, 26 + "maximum": 50, 27 + "description": "Number of cards records to embed" 28 + } 29 + } 30 + }, 31 + "output": { 32 + "encoding": "application/json", 33 + "schema": { 34 + "type": "object", 35 + "required": [ 36 + "uri", 37 + "value", 38 + "did", 39 + "collection", 40 + "rkey", 41 + "time_us" 42 + ], 43 + "properties": { 44 + "uri": { 45 + "type": "string", 46 + "format": "at-uri" 47 + }, 48 + "cid": { 49 + "type": "string", 50 + "format": "cid" 51 + }, 52 + "value": { 53 + "type": "ref", 54 + "ref": "network.cosmik.collection#main" 55 + }, 56 + "did": { 57 + "type": "string", 58 + "format": "did" 59 + }, 60 + "collection": { 61 + "type": "string", 62 + "format": "nsid" 63 + }, 64 + "rkey": { 65 + "type": "string" 66 + }, 67 + "time_us": { 68 + "type": "integer" 69 + }, 70 + "cardsCount": { 71 + "type": "integer", 72 + "description": "Total cards count" 73 + }, 74 + "cards": { 75 + "type": "array", 76 + "items": { 77 + "type": "ref", 78 + "ref": "#hydrateCardsRecord" 79 + } 80 + }, 81 + "profiles": { 82 + "type": "array", 83 + "items": { 84 + "type": "ref", 85 + "ref": "#profileEntry" 86 + } 87 + } 88 + } 89 + } 90 + } 91 + }, 92 + "hydrateCardsRecord": { 93 + "type": "object", 94 + "required": [ 95 + "uri", 96 + "did", 97 + "collection", 98 + "rkey", 99 + "time_us" 100 + ], 101 + "properties": { 102 + "uri": { 103 + "type": "string", 104 + "format": "at-uri" 105 + }, 106 + "did": { 107 + "type": "string", 108 + "format": "did" 109 + }, 110 + "collection": { 111 + "type": "string", 112 + "format": "nsid" 113 + }, 114 + "rkey": { 115 + "type": "string" 116 + }, 117 + "cid": { 118 + "type": "string" 119 + }, 120 + "record": { 121 + "type": "ref", 122 + "ref": "network.cosmik.card#main" 123 + }, 124 + "time_us": { 125 + "type": "integer" 126 + } 127 + } 128 + }, 129 + "profileEntry": { 130 + "type": "object", 131 + "required": [ 132 + "did" 133 + ], 134 + "properties": { 135 + "did": { 136 + "type": "string", 137 + "format": "did" 138 + }, 139 + "handle": { 140 + "type": "string" 141 + }, 142 + "uri": { 143 + "type": "string", 144 + "format": "at-uri" 145 + }, 146 + "cid": { 147 + "type": "string", 148 + "format": "cid" 149 + }, 150 + "value": { 151 + "type": "ref", 152 + "ref": "#appBskyActorProfile" 153 + }, 154 + "collection": { 155 + "type": "string", 156 + "format": "nsid" 157 + }, 158 + "rkey": { 159 + "type": "string" 160 + } 161 + } 162 + }, 163 + "appBskyActorProfile": { 164 + "type": "object", 165 + "properties": { 166 + "avatar": { 167 + "type": "blob", 168 + "accept": [ 169 + "image/png", 170 + "image/jpeg" 171 + ], 172 + "maxSize": 1000000, 173 + "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'" 174 + }, 175 + "banner": { 176 + "type": "blob", 177 + "accept": [ 178 + "image/png", 179 + "image/jpeg" 180 + ], 181 + "maxSize": 1000000, 182 + "description": "Larger horizontal image to display behind profile view." 183 + }, 184 + "labels": { 185 + "refs": [ 186 + "com.atproto.label.defs#selfLabels" 187 + ], 188 + "type": "union", 189 + "description": "Self-label values, specific to the Bluesky application, on the overall account." 190 + }, 191 + "website": { 192 + "type": "string", 193 + "format": "uri" 194 + }, 195 + "pronouns": { 196 + "type": "string", 197 + "maxLength": 200, 198 + "description": "Free-form pronouns text.", 199 + "maxGraphemes": 20 200 + }, 201 + "createdAt": { 202 + "type": "string", 203 + "format": "datetime" 204 + }, 205 + "pinnedPost": { 206 + "ref": "com.atproto.repo.strongRef", 207 + "type": "ref" 208 + }, 209 + "description": { 210 + "type": "string", 211 + "maxLength": 2560, 212 + "description": "Free-form profile description text.", 213 + "maxGraphemes": 256 214 + }, 215 + "displayName": { 216 + "type": "string", 217 + "maxLength": 640, 218 + "maxGraphemes": 64 219 + }, 220 + "joinedViaStarterPack": { 221 + "ref": "com.atproto.repo.strongRef", 222 + "type": "ref" 223 + } 224 + } 225 + } 226 + } 227 + }
+285
lexicons/generated/org/latha/strata/collection/listRecords.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.collection.listRecords", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Query network.cosmik.collection records with filters", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "limit": { 12 + "type": "integer", 13 + "minimum": 1, 14 + "maximum": 200, 15 + "default": 50 16 + }, 17 + "cursor": { 18 + "type": "string" 19 + }, 20 + "actor": { 21 + "type": "string", 22 + "format": "at-identifier", 23 + "description": "Filter by DID or handle (triggers on-demand backfill)" 24 + }, 25 + "profiles": { 26 + "type": "boolean", 27 + "description": "Include profile + identity info keyed by DID" 28 + }, 29 + "search": { 30 + "type": "string", 31 + "description": "Full-text search across: name, description" 32 + }, 33 + "name": { 34 + "type": "string", 35 + "description": "Filter by name" 36 + }, 37 + "accessType": { 38 + "type": "string", 39 + "description": "Filter by accessType" 40 + }, 41 + "cardsCountMin": { 42 + "type": "integer", 43 + "description": "Minimum total cards count" 44 + }, 45 + "hydrateCards": { 46 + "type": "integer", 47 + "minimum": 1, 48 + "maximum": 50, 49 + "description": "Number of cards records to embed per record" 50 + }, 51 + "sort": { 52 + "type": "string", 53 + "knownValues": [ 54 + "name", 55 + "accessType", 56 + "cardsCount" 57 + ], 58 + "description": "Field to sort by (default: time_us)" 59 + }, 60 + "order": { 61 + "type": "string", 62 + "knownValues": [ 63 + "asc", 64 + "desc" 65 + ], 66 + "description": "Sort direction (default: desc for dates/numbers/counts, asc for strings)" 67 + } 68 + } 69 + }, 70 + "output": { 71 + "encoding": "application/json", 72 + "schema": { 73 + "type": "object", 74 + "required": [ 75 + "records" 76 + ], 77 + "properties": { 78 + "records": { 79 + "type": "array", 80 + "items": { 81 + "type": "ref", 82 + "ref": "#record" 83 + } 84 + }, 85 + "cursor": { 86 + "type": "string" 87 + }, 88 + "profiles": { 89 + "type": "array", 90 + "items": { 91 + "type": "ref", 92 + "ref": "#profileEntry" 93 + } 94 + } 95 + } 96 + } 97 + } 98 + }, 99 + "record": { 100 + "type": "object", 101 + "required": [ 102 + "uri", 103 + "cid", 104 + "value", 105 + "did", 106 + "collection", 107 + "rkey", 108 + "time_us" 109 + ], 110 + "properties": { 111 + "uri": { 112 + "type": "string", 113 + "format": "at-uri" 114 + }, 115 + "cid": { 116 + "type": "string", 117 + "format": "cid" 118 + }, 119 + "value": { 120 + "type": "ref", 121 + "ref": "network.cosmik.collection#main" 122 + }, 123 + "did": { 124 + "type": "string", 125 + "format": "did" 126 + }, 127 + "collection": { 128 + "type": "string", 129 + "format": "nsid" 130 + }, 131 + "rkey": { 132 + "type": "string" 133 + }, 134 + "time_us": { 135 + "type": "integer" 136 + }, 137 + "cardsCount": { 138 + "type": "integer", 139 + "description": "Total cards count" 140 + }, 141 + "cards": { 142 + "type": "array", 143 + "items": { 144 + "type": "ref", 145 + "ref": "#hydrateCardsRecord" 146 + } 147 + } 148 + } 149 + }, 150 + "hydrateCardsRecord": { 151 + "type": "object", 152 + "required": [ 153 + "uri", 154 + "did", 155 + "collection", 156 + "rkey", 157 + "time_us" 158 + ], 159 + "properties": { 160 + "uri": { 161 + "type": "string", 162 + "format": "at-uri" 163 + }, 164 + "did": { 165 + "type": "string", 166 + "format": "did" 167 + }, 168 + "collection": { 169 + "type": "string", 170 + "format": "nsid" 171 + }, 172 + "rkey": { 173 + "type": "string" 174 + }, 175 + "cid": { 176 + "type": "string" 177 + }, 178 + "record": { 179 + "type": "ref", 180 + "ref": "network.cosmik.card#main" 181 + }, 182 + "time_us": { 183 + "type": "integer" 184 + } 185 + } 186 + }, 187 + "profileEntry": { 188 + "type": "object", 189 + "required": [ 190 + "did" 191 + ], 192 + "properties": { 193 + "did": { 194 + "type": "string", 195 + "format": "did" 196 + }, 197 + "handle": { 198 + "type": "string" 199 + }, 200 + "uri": { 201 + "type": "string", 202 + "format": "at-uri" 203 + }, 204 + "cid": { 205 + "type": "string", 206 + "format": "cid" 207 + }, 208 + "value": { 209 + "type": "ref", 210 + "ref": "#appBskyActorProfile" 211 + }, 212 + "collection": { 213 + "type": "string", 214 + "format": "nsid" 215 + }, 216 + "rkey": { 217 + "type": "string" 218 + } 219 + } 220 + }, 221 + "appBskyActorProfile": { 222 + "type": "object", 223 + "properties": { 224 + "avatar": { 225 + "type": "blob", 226 + "accept": [ 227 + "image/png", 228 + "image/jpeg" 229 + ], 230 + "maxSize": 1000000, 231 + "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'" 232 + }, 233 + "banner": { 234 + "type": "blob", 235 + "accept": [ 236 + "image/png", 237 + "image/jpeg" 238 + ], 239 + "maxSize": 1000000, 240 + "description": "Larger horizontal image to display behind profile view." 241 + }, 242 + "labels": { 243 + "refs": [ 244 + "com.atproto.label.defs#selfLabels" 245 + ], 246 + "type": "union", 247 + "description": "Self-label values, specific to the Bluesky application, on the overall account." 248 + }, 249 + "website": { 250 + "type": "string", 251 + "format": "uri" 252 + }, 253 + "pronouns": { 254 + "type": "string", 255 + "maxLength": 200, 256 + "description": "Free-form pronouns text.", 257 + "maxGraphemes": 20 258 + }, 259 + "createdAt": { 260 + "type": "string", 261 + "format": "datetime" 262 + }, 263 + "pinnedPost": { 264 + "ref": "com.atproto.repo.strongRef", 265 + "type": "ref" 266 + }, 267 + "description": { 268 + "type": "string", 269 + "maxLength": 2560, 270 + "description": "Free-form profile description text.", 271 + "maxGraphemes": 256 272 + }, 273 + "displayName": { 274 + "type": "string", 275 + "maxLength": 640, 276 + "maxGraphemes": 64 277 + }, 278 + "joinedViaStarterPack": { 279 + "ref": "com.atproto.repo.strongRef", 280 + "type": "ref" 281 + } 282 + } 283 + } 284 + } 285 + }
+173
lexicons/generated/org/latha/strata/connection/getRecord.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.connection.getRecord", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a single network.cosmik.connection record by AT URI", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "uri" 12 + ], 13 + "properties": { 14 + "uri": { 15 + "type": "string", 16 + "format": "at-uri", 17 + "description": "AT URI of the record" 18 + }, 19 + "profiles": { 20 + "type": "boolean", 21 + "description": "Include profile + identity info keyed by DID" 22 + } 23 + } 24 + }, 25 + "output": { 26 + "encoding": "application/json", 27 + "schema": { 28 + "type": "object", 29 + "required": [ 30 + "uri", 31 + "value", 32 + "did", 33 + "collection", 34 + "rkey", 35 + "time_us" 36 + ], 37 + "properties": { 38 + "uri": { 39 + "type": "string", 40 + "format": "at-uri" 41 + }, 42 + "cid": { 43 + "type": "string", 44 + "format": "cid" 45 + }, 46 + "value": { 47 + "type": "ref", 48 + "ref": "network.cosmik.connection#main" 49 + }, 50 + "did": { 51 + "type": "string", 52 + "format": "did" 53 + }, 54 + "collection": { 55 + "type": "string", 56 + "format": "nsid" 57 + }, 58 + "rkey": { 59 + "type": "string" 60 + }, 61 + "time_us": { 62 + "type": "integer" 63 + }, 64 + "profiles": { 65 + "type": "array", 66 + "items": { 67 + "type": "ref", 68 + "ref": "#profileEntry" 69 + } 70 + } 71 + } 72 + } 73 + } 74 + }, 75 + "profileEntry": { 76 + "type": "object", 77 + "required": [ 78 + "did" 79 + ], 80 + "properties": { 81 + "did": { 82 + "type": "string", 83 + "format": "did" 84 + }, 85 + "handle": { 86 + "type": "string" 87 + }, 88 + "uri": { 89 + "type": "string", 90 + "format": "at-uri" 91 + }, 92 + "cid": { 93 + "type": "string", 94 + "format": "cid" 95 + }, 96 + "value": { 97 + "type": "ref", 98 + "ref": "#appBskyActorProfile" 99 + }, 100 + "collection": { 101 + "type": "string", 102 + "format": "nsid" 103 + }, 104 + "rkey": { 105 + "type": "string" 106 + } 107 + } 108 + }, 109 + "appBskyActorProfile": { 110 + "type": "object", 111 + "properties": { 112 + "avatar": { 113 + "type": "blob", 114 + "accept": [ 115 + "image/png", 116 + "image/jpeg" 117 + ], 118 + "maxSize": 1000000, 119 + "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'" 120 + }, 121 + "banner": { 122 + "type": "blob", 123 + "accept": [ 124 + "image/png", 125 + "image/jpeg" 126 + ], 127 + "maxSize": 1000000, 128 + "description": "Larger horizontal image to display behind profile view." 129 + }, 130 + "labels": { 131 + "refs": [ 132 + "com.atproto.label.defs#selfLabels" 133 + ], 134 + "type": "union", 135 + "description": "Self-label values, specific to the Bluesky application, on the overall account." 136 + }, 137 + "website": { 138 + "type": "string", 139 + "format": "uri" 140 + }, 141 + "pronouns": { 142 + "type": "string", 143 + "maxLength": 200, 144 + "description": "Free-form pronouns text.", 145 + "maxGraphemes": 20 146 + }, 147 + "createdAt": { 148 + "type": "string", 149 + "format": "datetime" 150 + }, 151 + "pinnedPost": { 152 + "ref": "com.atproto.repo.strongRef", 153 + "type": "ref" 154 + }, 155 + "description": { 156 + "type": "string", 157 + "maxLength": 2560, 158 + "description": "Free-form profile description text.", 159 + "maxGraphemes": 256 160 + }, 161 + "displayName": { 162 + "type": "string", 163 + "maxLength": 640, 164 + "maxGraphemes": 64 165 + }, 166 + "joinedViaStarterPack": { 167 + "ref": "com.atproto.repo.strongRef", 168 + "type": "ref" 169 + } 170 + } 171 + } 172 + } 173 + }
+231
lexicons/generated/org/latha/strata/connection/listRecords.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.connection.listRecords", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Query network.cosmik.connection records with filters", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "limit": { 12 + "type": "integer", 13 + "minimum": 1, 14 + "maximum": 200, 15 + "default": 50 16 + }, 17 + "cursor": { 18 + "type": "string" 19 + }, 20 + "actor": { 21 + "type": "string", 22 + "format": "at-identifier", 23 + "description": "Filter by DID or handle (triggers on-demand backfill)" 24 + }, 25 + "profiles": { 26 + "type": "boolean", 27 + "description": "Include profile + identity info keyed by DID" 28 + }, 29 + "search": { 30 + "type": "string", 31 + "description": "Full-text search across: note" 32 + }, 33 + "source": { 34 + "type": "string", 35 + "description": "Filter by source" 36 + }, 37 + "target": { 38 + "type": "string", 39 + "description": "Filter by target" 40 + }, 41 + "connectionType": { 42 + "type": "string", 43 + "description": "Filter by connectionType" 44 + }, 45 + "sort": { 46 + "type": "string", 47 + "knownValues": [ 48 + "source", 49 + "target", 50 + "connectionType" 51 + ], 52 + "description": "Field to sort by (default: time_us)" 53 + }, 54 + "order": { 55 + "type": "string", 56 + "knownValues": [ 57 + "asc", 58 + "desc" 59 + ], 60 + "description": "Sort direction (default: desc for dates/numbers/counts, asc for strings)" 61 + } 62 + } 63 + }, 64 + "output": { 65 + "encoding": "application/json", 66 + "schema": { 67 + "type": "object", 68 + "required": [ 69 + "records" 70 + ], 71 + "properties": { 72 + "records": { 73 + "type": "array", 74 + "items": { 75 + "type": "ref", 76 + "ref": "#record" 77 + } 78 + }, 79 + "cursor": { 80 + "type": "string" 81 + }, 82 + "profiles": { 83 + "type": "array", 84 + "items": { 85 + "type": "ref", 86 + "ref": "#profileEntry" 87 + } 88 + } 89 + } 90 + } 91 + } 92 + }, 93 + "record": { 94 + "type": "object", 95 + "required": [ 96 + "uri", 97 + "cid", 98 + "value", 99 + "did", 100 + "collection", 101 + "rkey", 102 + "time_us" 103 + ], 104 + "properties": { 105 + "uri": { 106 + "type": "string", 107 + "format": "at-uri" 108 + }, 109 + "cid": { 110 + "type": "string", 111 + "format": "cid" 112 + }, 113 + "value": { 114 + "type": "ref", 115 + "ref": "network.cosmik.connection#main" 116 + }, 117 + "did": { 118 + "type": "string", 119 + "format": "did" 120 + }, 121 + "collection": { 122 + "type": "string", 123 + "format": "nsid" 124 + }, 125 + "rkey": { 126 + "type": "string" 127 + }, 128 + "time_us": { 129 + "type": "integer" 130 + } 131 + } 132 + }, 133 + "profileEntry": { 134 + "type": "object", 135 + "required": [ 136 + "did" 137 + ], 138 + "properties": { 139 + "did": { 140 + "type": "string", 141 + "format": "did" 142 + }, 143 + "handle": { 144 + "type": "string" 145 + }, 146 + "uri": { 147 + "type": "string", 148 + "format": "at-uri" 149 + }, 150 + "cid": { 151 + "type": "string", 152 + "format": "cid" 153 + }, 154 + "value": { 155 + "type": "ref", 156 + "ref": "#appBskyActorProfile" 157 + }, 158 + "collection": { 159 + "type": "string", 160 + "format": "nsid" 161 + }, 162 + "rkey": { 163 + "type": "string" 164 + } 165 + } 166 + }, 167 + "appBskyActorProfile": { 168 + "type": "object", 169 + "properties": { 170 + "avatar": { 171 + "type": "blob", 172 + "accept": [ 173 + "image/png", 174 + "image/jpeg" 175 + ], 176 + "maxSize": 1000000, 177 + "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'" 178 + }, 179 + "banner": { 180 + "type": "blob", 181 + "accept": [ 182 + "image/png", 183 + "image/jpeg" 184 + ], 185 + "maxSize": 1000000, 186 + "description": "Larger horizontal image to display behind profile view." 187 + }, 188 + "labels": { 189 + "refs": [ 190 + "com.atproto.label.defs#selfLabels" 191 + ], 192 + "type": "union", 193 + "description": "Self-label values, specific to the Bluesky application, on the overall account." 194 + }, 195 + "website": { 196 + "type": "string", 197 + "format": "uri" 198 + }, 199 + "pronouns": { 200 + "type": "string", 201 + "maxLength": 200, 202 + "description": "Free-form pronouns text.", 203 + "maxGraphemes": 20 204 + }, 205 + "createdAt": { 206 + "type": "string", 207 + "format": "datetime" 208 + }, 209 + "pinnedPost": { 210 + "ref": "com.atproto.repo.strongRef", 211 + "type": "ref" 212 + }, 213 + "description": { 214 + "type": "string", 215 + "maxLength": 2560, 216 + "description": "Free-form profile description text.", 217 + "maxGraphemes": 256 218 + }, 219 + "displayName": { 220 + "type": "string", 221 + "maxLength": 640, 222 + "maxGraphemes": 64 223 + }, 224 + "joinedViaStarterPack": { 225 + "ref": "com.atproto.repo.strongRef", 226 + "type": "ref" 227 + } 228 + } 229 + } 230 + } 231 + }
+172
lexicons/generated/org/latha/strata/entity/getRecord.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.entity.getRecord", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a single org.latha.strata.entity record by AT URI", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "uri" 12 + ], 13 + "properties": { 14 + "uri": { 15 + "type": "string", 16 + "format": "at-uri", 17 + "description": "AT URI of the record" 18 + }, 19 + "profiles": { 20 + "type": "boolean", 21 + "description": "Include profile + identity info keyed by DID" 22 + } 23 + } 24 + }, 25 + "output": { 26 + "encoding": "application/json", 27 + "schema": { 28 + "type": "object", 29 + "required": [ 30 + "uri", 31 + "value", 32 + "did", 33 + "collection", 34 + "rkey", 35 + "time_us" 36 + ], 37 + "properties": { 38 + "uri": { 39 + "type": "string", 40 + "format": "at-uri" 41 + }, 42 + "cid": { 43 + "type": "string", 44 + "format": "cid" 45 + }, 46 + "value": { 47 + "type": "unknown" 48 + }, 49 + "did": { 50 + "type": "string", 51 + "format": "did" 52 + }, 53 + "collection": { 54 + "type": "string", 55 + "format": "nsid" 56 + }, 57 + "rkey": { 58 + "type": "string" 59 + }, 60 + "time_us": { 61 + "type": "integer" 62 + }, 63 + "profiles": { 64 + "type": "array", 65 + "items": { 66 + "type": "ref", 67 + "ref": "#profileEntry" 68 + } 69 + } 70 + } 71 + } 72 + } 73 + }, 74 + "profileEntry": { 75 + "type": "object", 76 + "required": [ 77 + "did" 78 + ], 79 + "properties": { 80 + "did": { 81 + "type": "string", 82 + "format": "did" 83 + }, 84 + "handle": { 85 + "type": "string" 86 + }, 87 + "uri": { 88 + "type": "string", 89 + "format": "at-uri" 90 + }, 91 + "cid": { 92 + "type": "string", 93 + "format": "cid" 94 + }, 95 + "value": { 96 + "type": "ref", 97 + "ref": "#appBskyActorProfile" 98 + }, 99 + "collection": { 100 + "type": "string", 101 + "format": "nsid" 102 + }, 103 + "rkey": { 104 + "type": "string" 105 + } 106 + } 107 + }, 108 + "appBskyActorProfile": { 109 + "type": "object", 110 + "properties": { 111 + "avatar": { 112 + "type": "blob", 113 + "accept": [ 114 + "image/png", 115 + "image/jpeg" 116 + ], 117 + "maxSize": 1000000, 118 + "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'" 119 + }, 120 + "banner": { 121 + "type": "blob", 122 + "accept": [ 123 + "image/png", 124 + "image/jpeg" 125 + ], 126 + "maxSize": 1000000, 127 + "description": "Larger horizontal image to display behind profile view." 128 + }, 129 + "labels": { 130 + "refs": [ 131 + "com.atproto.label.defs#selfLabels" 132 + ], 133 + "type": "union", 134 + "description": "Self-label values, specific to the Bluesky application, on the overall account." 135 + }, 136 + "website": { 137 + "type": "string", 138 + "format": "uri" 139 + }, 140 + "pronouns": { 141 + "type": "string", 142 + "maxLength": 200, 143 + "description": "Free-form pronouns text.", 144 + "maxGraphemes": 20 145 + }, 146 + "createdAt": { 147 + "type": "string", 148 + "format": "datetime" 149 + }, 150 + "pinnedPost": { 151 + "ref": "com.atproto.repo.strongRef", 152 + "type": "ref" 153 + }, 154 + "description": { 155 + "type": "string", 156 + "maxLength": 2560, 157 + "description": "Free-form profile description text.", 158 + "maxGraphemes": 256 159 + }, 160 + "displayName": { 161 + "type": "string", 162 + "maxLength": 640, 163 + "maxGraphemes": 64 164 + }, 165 + "joinedViaStarterPack": { 166 + "ref": "com.atproto.repo.strongRef", 167 + "type": "ref" 168 + } 169 + } 170 + } 171 + } 172 + }
+225
lexicons/generated/org/latha/strata/entity/listRecords.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.entity.listRecords", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Query org.latha.strata.entity records with filters", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "limit": { 12 + "type": "integer", 13 + "minimum": 1, 14 + "maximum": 200, 15 + "default": 50 16 + }, 17 + "cursor": { 18 + "type": "string" 19 + }, 20 + "actor": { 21 + "type": "string", 22 + "format": "at-identifier", 23 + "description": "Filter by DID or handle (triggers on-demand backfill)" 24 + }, 25 + "profiles": { 26 + "type": "boolean", 27 + "description": "Include profile + identity info keyed by DID" 28 + }, 29 + "search": { 30 + "type": "string", 31 + "description": "Full-text search across: name, description" 32 + }, 33 + "entityType": { 34 + "type": "string", 35 + "description": "Filter by entityType" 36 + }, 37 + "name": { 38 + "type": "string", 39 + "description": "Filter by name" 40 + }, 41 + "sort": { 42 + "type": "string", 43 + "knownValues": [ 44 + "entityType", 45 + "name" 46 + ], 47 + "description": "Field to sort by (default: time_us)" 48 + }, 49 + "order": { 50 + "type": "string", 51 + "knownValues": [ 52 + "asc", 53 + "desc" 54 + ], 55 + "description": "Sort direction (default: desc for dates/numbers/counts, asc for strings)" 56 + } 57 + } 58 + }, 59 + "output": { 60 + "encoding": "application/json", 61 + "schema": { 62 + "type": "object", 63 + "required": [ 64 + "records" 65 + ], 66 + "properties": { 67 + "records": { 68 + "type": "array", 69 + "items": { 70 + "type": "ref", 71 + "ref": "#record" 72 + } 73 + }, 74 + "cursor": { 75 + "type": "string" 76 + }, 77 + "profiles": { 78 + "type": "array", 79 + "items": { 80 + "type": "ref", 81 + "ref": "#profileEntry" 82 + } 83 + } 84 + } 85 + } 86 + } 87 + }, 88 + "record": { 89 + "type": "object", 90 + "required": [ 91 + "uri", 92 + "cid", 93 + "value", 94 + "did", 95 + "collection", 96 + "rkey", 97 + "time_us" 98 + ], 99 + "properties": { 100 + "uri": { 101 + "type": "string", 102 + "format": "at-uri" 103 + }, 104 + "cid": { 105 + "type": "string", 106 + "format": "cid" 107 + }, 108 + "value": { 109 + "type": "unknown" 110 + }, 111 + "did": { 112 + "type": "string", 113 + "format": "did" 114 + }, 115 + "collection": { 116 + "type": "string", 117 + "format": "nsid" 118 + }, 119 + "rkey": { 120 + "type": "string" 121 + }, 122 + "time_us": { 123 + "type": "integer" 124 + } 125 + } 126 + }, 127 + "profileEntry": { 128 + "type": "object", 129 + "required": [ 130 + "did" 131 + ], 132 + "properties": { 133 + "did": { 134 + "type": "string", 135 + "format": "did" 136 + }, 137 + "handle": { 138 + "type": "string" 139 + }, 140 + "uri": { 141 + "type": "string", 142 + "format": "at-uri" 143 + }, 144 + "cid": { 145 + "type": "string", 146 + "format": "cid" 147 + }, 148 + "value": { 149 + "type": "ref", 150 + "ref": "#appBskyActorProfile" 151 + }, 152 + "collection": { 153 + "type": "string", 154 + "format": "nsid" 155 + }, 156 + "rkey": { 157 + "type": "string" 158 + } 159 + } 160 + }, 161 + "appBskyActorProfile": { 162 + "type": "object", 163 + "properties": { 164 + "avatar": { 165 + "type": "blob", 166 + "accept": [ 167 + "image/png", 168 + "image/jpeg" 169 + ], 170 + "maxSize": 1000000, 171 + "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'" 172 + }, 173 + "banner": { 174 + "type": "blob", 175 + "accept": [ 176 + "image/png", 177 + "image/jpeg" 178 + ], 179 + "maxSize": 1000000, 180 + "description": "Larger horizontal image to display behind profile view." 181 + }, 182 + "labels": { 183 + "refs": [ 184 + "com.atproto.label.defs#selfLabels" 185 + ], 186 + "type": "union", 187 + "description": "Self-label values, specific to the Bluesky application, on the overall account." 188 + }, 189 + "website": { 190 + "type": "string", 191 + "format": "uri" 192 + }, 193 + "pronouns": { 194 + "type": "string", 195 + "maxLength": 200, 196 + "description": "Free-form pronouns text.", 197 + "maxGraphemes": 20 198 + }, 199 + "createdAt": { 200 + "type": "string", 201 + "format": "datetime" 202 + }, 203 + "pinnedPost": { 204 + "ref": "com.atproto.repo.strongRef", 205 + "type": "ref" 206 + }, 207 + "description": { 208 + "type": "string", 209 + "maxLength": 2560, 210 + "description": "Free-form profile description text.", 211 + "maxGraphemes": 256 212 + }, 213 + "displayName": { 214 + "type": "string", 215 + "maxLength": 640, 216 + "maxGraphemes": 64 217 + }, 218 + "joinedViaStarterPack": { 219 + "ref": "com.atproto.repo.strongRef", 220 + "type": "ref" 221 + } 222 + } 223 + } 224 + } 225 + }
+173
lexicons/generated/org/latha/strata/follow/getRecord.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.follow.getRecord", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a single network.cosmik.follow record by AT URI", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "uri" 12 + ], 13 + "properties": { 14 + "uri": { 15 + "type": "string", 16 + "format": "at-uri", 17 + "description": "AT URI of the record" 18 + }, 19 + "profiles": { 20 + "type": "boolean", 21 + "description": "Include profile + identity info keyed by DID" 22 + } 23 + } 24 + }, 25 + "output": { 26 + "encoding": "application/json", 27 + "schema": { 28 + "type": "object", 29 + "required": [ 30 + "uri", 31 + "value", 32 + "did", 33 + "collection", 34 + "rkey", 35 + "time_us" 36 + ], 37 + "properties": { 38 + "uri": { 39 + "type": "string", 40 + "format": "at-uri" 41 + }, 42 + "cid": { 43 + "type": "string", 44 + "format": "cid" 45 + }, 46 + "value": { 47 + "type": "ref", 48 + "ref": "network.cosmik.follow#main" 49 + }, 50 + "did": { 51 + "type": "string", 52 + "format": "did" 53 + }, 54 + "collection": { 55 + "type": "string", 56 + "format": "nsid" 57 + }, 58 + "rkey": { 59 + "type": "string" 60 + }, 61 + "time_us": { 62 + "type": "integer" 63 + }, 64 + "profiles": { 65 + "type": "array", 66 + "items": { 67 + "type": "ref", 68 + "ref": "#profileEntry" 69 + } 70 + } 71 + } 72 + } 73 + } 74 + }, 75 + "profileEntry": { 76 + "type": "object", 77 + "required": [ 78 + "did" 79 + ], 80 + "properties": { 81 + "did": { 82 + "type": "string", 83 + "format": "did" 84 + }, 85 + "handle": { 86 + "type": "string" 87 + }, 88 + "uri": { 89 + "type": "string", 90 + "format": "at-uri" 91 + }, 92 + "cid": { 93 + "type": "string", 94 + "format": "cid" 95 + }, 96 + "value": { 97 + "type": "ref", 98 + "ref": "#appBskyActorProfile" 99 + }, 100 + "collection": { 101 + "type": "string", 102 + "format": "nsid" 103 + }, 104 + "rkey": { 105 + "type": "string" 106 + } 107 + } 108 + }, 109 + "appBskyActorProfile": { 110 + "type": "object", 111 + "properties": { 112 + "avatar": { 113 + "type": "blob", 114 + "accept": [ 115 + "image/png", 116 + "image/jpeg" 117 + ], 118 + "maxSize": 1000000, 119 + "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'" 120 + }, 121 + "banner": { 122 + "type": "blob", 123 + "accept": [ 124 + "image/png", 125 + "image/jpeg" 126 + ], 127 + "maxSize": 1000000, 128 + "description": "Larger horizontal image to display behind profile view." 129 + }, 130 + "labels": { 131 + "refs": [ 132 + "com.atproto.label.defs#selfLabels" 133 + ], 134 + "type": "union", 135 + "description": "Self-label values, specific to the Bluesky application, on the overall account." 136 + }, 137 + "website": { 138 + "type": "string", 139 + "format": "uri" 140 + }, 141 + "pronouns": { 142 + "type": "string", 143 + "maxLength": 200, 144 + "description": "Free-form pronouns text.", 145 + "maxGraphemes": 20 146 + }, 147 + "createdAt": { 148 + "type": "string", 149 + "format": "datetime" 150 + }, 151 + "pinnedPost": { 152 + "ref": "com.atproto.repo.strongRef", 153 + "type": "ref" 154 + }, 155 + "description": { 156 + "type": "string", 157 + "maxLength": 2560, 158 + "description": "Free-form profile description text.", 159 + "maxGraphemes": 256 160 + }, 161 + "displayName": { 162 + "type": "string", 163 + "maxLength": 640, 164 + "maxGraphemes": 64 165 + }, 166 + "joinedViaStarterPack": { 167 + "ref": "com.atproto.repo.strongRef", 168 + "type": "ref" 169 + } 170 + } 171 + } 172 + } 173 + }
+217
lexicons/generated/org/latha/strata/follow/listRecords.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.follow.listRecords", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Query network.cosmik.follow records with filters", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "limit": { 12 + "type": "integer", 13 + "minimum": 1, 14 + "maximum": 200, 15 + "default": 50 16 + }, 17 + "cursor": { 18 + "type": "string" 19 + }, 20 + "actor": { 21 + "type": "string", 22 + "format": "at-identifier", 23 + "description": "Filter by DID or handle (triggers on-demand backfill)" 24 + }, 25 + "profiles": { 26 + "type": "boolean", 27 + "description": "Include profile + identity info keyed by DID" 28 + }, 29 + "subject": { 30 + "type": "string", 31 + "description": "Filter by subject" 32 + }, 33 + "sort": { 34 + "type": "string", 35 + "knownValues": [ 36 + "subject" 37 + ], 38 + "description": "Field to sort by (default: time_us)" 39 + }, 40 + "order": { 41 + "type": "string", 42 + "knownValues": [ 43 + "asc", 44 + "desc" 45 + ], 46 + "description": "Sort direction (default: desc for dates/numbers/counts, asc for strings)" 47 + } 48 + } 49 + }, 50 + "output": { 51 + "encoding": "application/json", 52 + "schema": { 53 + "type": "object", 54 + "required": [ 55 + "records" 56 + ], 57 + "properties": { 58 + "records": { 59 + "type": "array", 60 + "items": { 61 + "type": "ref", 62 + "ref": "#record" 63 + } 64 + }, 65 + "cursor": { 66 + "type": "string" 67 + }, 68 + "profiles": { 69 + "type": "array", 70 + "items": { 71 + "type": "ref", 72 + "ref": "#profileEntry" 73 + } 74 + } 75 + } 76 + } 77 + } 78 + }, 79 + "record": { 80 + "type": "object", 81 + "required": [ 82 + "uri", 83 + "cid", 84 + "value", 85 + "did", 86 + "collection", 87 + "rkey", 88 + "time_us" 89 + ], 90 + "properties": { 91 + "uri": { 92 + "type": "string", 93 + "format": "at-uri" 94 + }, 95 + "cid": { 96 + "type": "string", 97 + "format": "cid" 98 + }, 99 + "value": { 100 + "type": "ref", 101 + "ref": "network.cosmik.follow#main" 102 + }, 103 + "did": { 104 + "type": "string", 105 + "format": "did" 106 + }, 107 + "collection": { 108 + "type": "string", 109 + "format": "nsid" 110 + }, 111 + "rkey": { 112 + "type": "string" 113 + }, 114 + "time_us": { 115 + "type": "integer" 116 + } 117 + } 118 + }, 119 + "profileEntry": { 120 + "type": "object", 121 + "required": [ 122 + "did" 123 + ], 124 + "properties": { 125 + "did": { 126 + "type": "string", 127 + "format": "did" 128 + }, 129 + "handle": { 130 + "type": "string" 131 + }, 132 + "uri": { 133 + "type": "string", 134 + "format": "at-uri" 135 + }, 136 + "cid": { 137 + "type": "string", 138 + "format": "cid" 139 + }, 140 + "value": { 141 + "type": "ref", 142 + "ref": "#appBskyActorProfile" 143 + }, 144 + "collection": { 145 + "type": "string", 146 + "format": "nsid" 147 + }, 148 + "rkey": { 149 + "type": "string" 150 + } 151 + } 152 + }, 153 + "appBskyActorProfile": { 154 + "type": "object", 155 + "properties": { 156 + "avatar": { 157 + "type": "blob", 158 + "accept": [ 159 + "image/png", 160 + "image/jpeg" 161 + ], 162 + "maxSize": 1000000, 163 + "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'" 164 + }, 165 + "banner": { 166 + "type": "blob", 167 + "accept": [ 168 + "image/png", 169 + "image/jpeg" 170 + ], 171 + "maxSize": 1000000, 172 + "description": "Larger horizontal image to display behind profile view." 173 + }, 174 + "labels": { 175 + "refs": [ 176 + "com.atproto.label.defs#selfLabels" 177 + ], 178 + "type": "union", 179 + "description": "Self-label values, specific to the Bluesky application, on the overall account." 180 + }, 181 + "website": { 182 + "type": "string", 183 + "format": "uri" 184 + }, 185 + "pronouns": { 186 + "type": "string", 187 + "maxLength": 200, 188 + "description": "Free-form pronouns text.", 189 + "maxGraphemes": 20 190 + }, 191 + "createdAt": { 192 + "type": "string", 193 + "format": "datetime" 194 + }, 195 + "pinnedPost": { 196 + "ref": "com.atproto.repo.strongRef", 197 + "type": "ref" 198 + }, 199 + "description": { 200 + "type": "string", 201 + "maxLength": 2560, 202 + "description": "Free-form profile description text.", 203 + "maxGraphemes": 256 204 + }, 205 + "displayName": { 206 + "type": "string", 207 + "maxLength": 640, 208 + "maxGraphemes": 64 209 + }, 210 + "joinedViaStarterPack": { 211 + "ref": "com.atproto.repo.strongRef", 212 + "type": "ref" 213 + } 214 + } 215 + } 216 + } 217 + }
+27
lexicons/generated/org/latha/strata/getCursor.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.getCursor", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get the current cursor position", 8 + "output": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "properties": { 13 + "time_us": { 14 + "type": "integer" 15 + }, 16 + "date": { 17 + "type": "string" 18 + }, 19 + "seconds_ago": { 20 + "type": "integer" 21 + } 22 + } 23 + } 24 + } 25 + } 26 + } 27 + }
+51
lexicons/generated/org/latha/strata/getOverview.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.getOverview", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get an overview of all indexed collections", 8 + "output": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": [ 13 + "total_records", 14 + "collections" 15 + ], 16 + "properties": { 17 + "total_records": { 18 + "type": "integer" 19 + }, 20 + "collections": { 21 + "type": "array", 22 + "items": { 23 + "type": "ref", 24 + "ref": "#collectionStats" 25 + } 26 + } 27 + } 28 + } 29 + } 30 + }, 31 + "collectionStats": { 32 + "type": "object", 33 + "required": [ 34 + "collection", 35 + "records", 36 + "unique_users" 37 + ], 38 + "properties": { 39 + "collection": { 40 + "type": "string" 41 + }, 42 + "records": { 43 + "type": "integer" 44 + }, 45 + "unique_users": { 46 + "type": "integer" 47 + } 48 + } 49 + } 50 + } 51 + }
+138
lexicons/generated/org/latha/strata/getProfile.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.getProfile", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a user's profiles by DID or handle", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "actor" 12 + ], 13 + "properties": { 14 + "actor": { 15 + "type": "string", 16 + "format": "at-identifier", 17 + "description": "DID or handle of the user" 18 + } 19 + } 20 + }, 21 + "output": { 22 + "encoding": "application/json", 23 + "schema": { 24 + "type": "object", 25 + "required": [ 26 + "profiles" 27 + ], 28 + "properties": { 29 + "profiles": { 30 + "type": "array", 31 + "items": { 32 + "type": "ref", 33 + "ref": "#profileEntry" 34 + } 35 + } 36 + } 37 + } 38 + } 39 + }, 40 + "profileEntry": { 41 + "type": "object", 42 + "required": [ 43 + "did" 44 + ], 45 + "properties": { 46 + "did": { 47 + "type": "string", 48 + "format": "did" 49 + }, 50 + "handle": { 51 + "type": "string" 52 + }, 53 + "uri": { 54 + "type": "string", 55 + "format": "at-uri" 56 + }, 57 + "cid": { 58 + "type": "string", 59 + "format": "cid" 60 + }, 61 + "value": { 62 + "type": "ref", 63 + "ref": "#appBskyActorProfile" 64 + }, 65 + "collection": { 66 + "type": "string", 67 + "format": "nsid" 68 + }, 69 + "rkey": { 70 + "type": "string" 71 + } 72 + } 73 + }, 74 + "appBskyActorProfile": { 75 + "type": "object", 76 + "properties": { 77 + "avatar": { 78 + "type": "blob", 79 + "accept": [ 80 + "image/png", 81 + "image/jpeg" 82 + ], 83 + "maxSize": 1000000, 84 + "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'" 85 + }, 86 + "banner": { 87 + "type": "blob", 88 + "accept": [ 89 + "image/png", 90 + "image/jpeg" 91 + ], 92 + "maxSize": 1000000, 93 + "description": "Larger horizontal image to display behind profile view." 94 + }, 95 + "labels": { 96 + "refs": [ 97 + "com.atproto.label.defs#selfLabels" 98 + ], 99 + "type": "union", 100 + "description": "Self-label values, specific to the Bluesky application, on the overall account." 101 + }, 102 + "website": { 103 + "type": "string", 104 + "format": "uri" 105 + }, 106 + "pronouns": { 107 + "type": "string", 108 + "maxLength": 200, 109 + "description": "Free-form pronouns text.", 110 + "maxGraphemes": 20 111 + }, 112 + "createdAt": { 113 + "type": "string", 114 + "format": "datetime" 115 + }, 116 + "pinnedPost": { 117 + "ref": "com.atproto.repo.strongRef", 118 + "type": "ref" 119 + }, 120 + "description": { 121 + "type": "string", 122 + "maxLength": 2560, 123 + "description": "Free-form profile description text.", 124 + "maxGraphemes": 256 125 + }, 126 + "displayName": { 127 + "type": "string", 128 + "maxLength": 640, 129 + "maxGraphemes": 64 130 + }, 131 + "joinedViaStarterPack": { 132 + "ref": "com.atproto.repo.strongRef", 133 + "type": "ref" 134 + } 135 + } 136 + } 137 + } 138 + }
+59
lexicons/generated/org/latha/strata/notifyOfUpdate.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.notifyOfUpdate", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Notify of a record change for immediate indexing. Fetches the record from the user's PDS and indexes (or deletes) it.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "properties": { 13 + "uri": { 14 + "type": "string", 15 + "format": "at-uri", 16 + "description": "Single AT URI to fetch and index" 17 + }, 18 + "uris": { 19 + "type": "array", 20 + "items": { 21 + "type": "string", 22 + "format": "at-uri" 23 + }, 24 + "maxLength": 25, 25 + "description": "Batch of AT URIs to fetch and index (max 25)" 26 + } 27 + } 28 + } 29 + }, 30 + "output": { 31 + "encoding": "application/json", 32 + "schema": { 33 + "type": "object", 34 + "required": [ 35 + "indexed", 36 + "deleted" 37 + ], 38 + "properties": { 39 + "indexed": { 40 + "type": "integer", 41 + "description": "Number of records created or updated" 42 + }, 43 + "deleted": { 44 + "type": "integer", 45 + "description": "Number of records deleted (not found on PDS)" 46 + }, 47 + "errors": { 48 + "type": "array", 49 + "items": { 50 + "type": "string" 51 + }, 52 + "description": "Errors for individual URIs that could not be processed" 53 + } 54 + } 55 + } 56 + } 57 + } 58 + } 59 + }
+216
lexicons/generated/org/latha/strata/reasoning/getRecord.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.reasoning.getRecord", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a single org.latha.strata.reasoning record by AT URI", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "uri" 12 + ], 13 + "properties": { 14 + "uri": { 15 + "type": "string", 16 + "format": "at-uri", 17 + "description": "AT URI of the record" 18 + }, 19 + "profiles": { 20 + "type": "boolean", 21 + "description": "Include profile + identity info keyed by DID" 22 + }, 23 + "hydrateCitation": { 24 + "type": "boolean", 25 + "description": "Embed the referenced citation record" 26 + } 27 + } 28 + }, 29 + "output": { 30 + "encoding": "application/json", 31 + "schema": { 32 + "type": "object", 33 + "required": [ 34 + "uri", 35 + "value", 36 + "did", 37 + "collection", 38 + "rkey", 39 + "time_us" 40 + ], 41 + "properties": { 42 + "uri": { 43 + "type": "string", 44 + "format": "at-uri" 45 + }, 46 + "cid": { 47 + "type": "string", 48 + "format": "cid" 49 + }, 50 + "value": { 51 + "type": "unknown" 52 + }, 53 + "did": { 54 + "type": "string", 55 + "format": "did" 56 + }, 57 + "collection": { 58 + "type": "string", 59 + "format": "nsid" 60 + }, 61 + "rkey": { 62 + "type": "string" 63 + }, 64 + "time_us": { 65 + "type": "integer" 66 + }, 67 + "citation": { 68 + "type": "ref", 69 + "ref": "#refCitationRecord" 70 + }, 71 + "profiles": { 72 + "type": "array", 73 + "items": { 74 + "type": "ref", 75 + "ref": "#profileEntry" 76 + } 77 + } 78 + } 79 + } 80 + } 81 + }, 82 + "refCitationRecord": { 83 + "type": "object", 84 + "required": [ 85 + "uri", 86 + "did", 87 + "collection", 88 + "rkey", 89 + "time_us" 90 + ], 91 + "properties": { 92 + "uri": { 93 + "type": "string", 94 + "format": "at-uri" 95 + }, 96 + "did": { 97 + "type": "string", 98 + "format": "did" 99 + }, 100 + "collection": { 101 + "type": "string", 102 + "format": "nsid" 103 + }, 104 + "rkey": { 105 + "type": "string" 106 + }, 107 + "cid": { 108 + "type": "string" 109 + }, 110 + "record": { 111 + "type": "unknown" 112 + }, 113 + "time_us": { 114 + "type": "integer" 115 + } 116 + } 117 + }, 118 + "profileEntry": { 119 + "type": "object", 120 + "required": [ 121 + "did" 122 + ], 123 + "properties": { 124 + "did": { 125 + "type": "string", 126 + "format": "did" 127 + }, 128 + "handle": { 129 + "type": "string" 130 + }, 131 + "uri": { 132 + "type": "string", 133 + "format": "at-uri" 134 + }, 135 + "cid": { 136 + "type": "string", 137 + "format": "cid" 138 + }, 139 + "value": { 140 + "type": "ref", 141 + "ref": "#appBskyActorProfile" 142 + }, 143 + "collection": { 144 + "type": "string", 145 + "format": "nsid" 146 + }, 147 + "rkey": { 148 + "type": "string" 149 + } 150 + } 151 + }, 152 + "appBskyActorProfile": { 153 + "type": "object", 154 + "properties": { 155 + "avatar": { 156 + "type": "blob", 157 + "accept": [ 158 + "image/png", 159 + "image/jpeg" 160 + ], 161 + "maxSize": 1000000, 162 + "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'" 163 + }, 164 + "banner": { 165 + "type": "blob", 166 + "accept": [ 167 + "image/png", 168 + "image/jpeg" 169 + ], 170 + "maxSize": 1000000, 171 + "description": "Larger horizontal image to display behind profile view." 172 + }, 173 + "labels": { 174 + "refs": [ 175 + "com.atproto.label.defs#selfLabels" 176 + ], 177 + "type": "union", 178 + "description": "Self-label values, specific to the Bluesky application, on the overall account." 179 + }, 180 + "website": { 181 + "type": "string", 182 + "format": "uri" 183 + }, 184 + "pronouns": { 185 + "type": "string", 186 + "maxLength": 200, 187 + "description": "Free-form pronouns text.", 188 + "maxGraphemes": 20 189 + }, 190 + "createdAt": { 191 + "type": "string", 192 + "format": "datetime" 193 + }, 194 + "pinnedPost": { 195 + "ref": "com.atproto.repo.strongRef", 196 + "type": "ref" 197 + }, 198 + "description": { 199 + "type": "string", 200 + "maxLength": 2560, 201 + "description": "Free-form profile description text.", 202 + "maxGraphemes": 256 203 + }, 204 + "displayName": { 205 + "type": "string", 206 + "maxLength": 640, 207 + "maxGraphemes": 64 208 + }, 209 + "joinedViaStarterPack": { 210 + "ref": "com.atproto.repo.strongRef", 211 + "type": "ref" 212 + } 213 + } 214 + } 215 + } 216 + }
+269
lexicons/generated/org/latha/strata/reasoning/listRecords.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.reasoning.listRecords", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Query org.latha.strata.reasoning records with filters", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "limit": { 12 + "type": "integer", 13 + "minimum": 1, 14 + "maximum": 200, 15 + "default": 50 16 + }, 17 + "cursor": { 18 + "type": "string" 19 + }, 20 + "actor": { 21 + "type": "string", 22 + "format": "at-identifier", 23 + "description": "Filter by DID or handle (triggers on-demand backfill)" 24 + }, 25 + "profiles": { 26 + "type": "boolean", 27 + "description": "Include profile + identity info keyed by DID" 28 + }, 29 + "search": { 30 + "type": "string", 31 + "description": "Full-text search across: question, evidence" 32 + }, 33 + "method": { 34 + "type": "string", 35 + "description": "Filter by method" 36 + }, 37 + "confidence": { 38 + "type": "string", 39 + "description": "Filter by confidence" 40 + }, 41 + "hydrateCitation": { 42 + "type": "boolean", 43 + "description": "Embed the referenced citation record" 44 + }, 45 + "sort": { 46 + "type": "string", 47 + "knownValues": [ 48 + "method", 49 + "confidence" 50 + ], 51 + "description": "Field to sort by (default: time_us)" 52 + }, 53 + "order": { 54 + "type": "string", 55 + "knownValues": [ 56 + "asc", 57 + "desc" 58 + ], 59 + "description": "Sort direction (default: desc for dates/numbers/counts, asc for strings)" 60 + } 61 + } 62 + }, 63 + "output": { 64 + "encoding": "application/json", 65 + "schema": { 66 + "type": "object", 67 + "required": [ 68 + "records" 69 + ], 70 + "properties": { 71 + "records": { 72 + "type": "array", 73 + "items": { 74 + "type": "ref", 75 + "ref": "#record" 76 + } 77 + }, 78 + "cursor": { 79 + "type": "string" 80 + }, 81 + "profiles": { 82 + "type": "array", 83 + "items": { 84 + "type": "ref", 85 + "ref": "#profileEntry" 86 + } 87 + } 88 + } 89 + } 90 + } 91 + }, 92 + "record": { 93 + "type": "object", 94 + "required": [ 95 + "uri", 96 + "cid", 97 + "value", 98 + "did", 99 + "collection", 100 + "rkey", 101 + "time_us" 102 + ], 103 + "properties": { 104 + "uri": { 105 + "type": "string", 106 + "format": "at-uri" 107 + }, 108 + "cid": { 109 + "type": "string", 110 + "format": "cid" 111 + }, 112 + "value": { 113 + "type": "unknown" 114 + }, 115 + "did": { 116 + "type": "string", 117 + "format": "did" 118 + }, 119 + "collection": { 120 + "type": "string", 121 + "format": "nsid" 122 + }, 123 + "rkey": { 124 + "type": "string" 125 + }, 126 + "time_us": { 127 + "type": "integer" 128 + }, 129 + "citation": { 130 + "type": "ref", 131 + "ref": "#refCitationRecord" 132 + } 133 + } 134 + }, 135 + "refCitationRecord": { 136 + "type": "object", 137 + "required": [ 138 + "uri", 139 + "did", 140 + "collection", 141 + "rkey", 142 + "time_us" 143 + ], 144 + "properties": { 145 + "uri": { 146 + "type": "string", 147 + "format": "at-uri" 148 + }, 149 + "did": { 150 + "type": "string", 151 + "format": "did" 152 + }, 153 + "collection": { 154 + "type": "string", 155 + "format": "nsid" 156 + }, 157 + "rkey": { 158 + "type": "string" 159 + }, 160 + "cid": { 161 + "type": "string" 162 + }, 163 + "record": { 164 + "type": "unknown" 165 + }, 166 + "time_us": { 167 + "type": "integer" 168 + } 169 + } 170 + }, 171 + "profileEntry": { 172 + "type": "object", 173 + "required": [ 174 + "did" 175 + ], 176 + "properties": { 177 + "did": { 178 + "type": "string", 179 + "format": "did" 180 + }, 181 + "handle": { 182 + "type": "string" 183 + }, 184 + "uri": { 185 + "type": "string", 186 + "format": "at-uri" 187 + }, 188 + "cid": { 189 + "type": "string", 190 + "format": "cid" 191 + }, 192 + "value": { 193 + "type": "ref", 194 + "ref": "#appBskyActorProfile" 195 + }, 196 + "collection": { 197 + "type": "string", 198 + "format": "nsid" 199 + }, 200 + "rkey": { 201 + "type": "string" 202 + } 203 + } 204 + }, 205 + "appBskyActorProfile": { 206 + "type": "object", 207 + "properties": { 208 + "avatar": { 209 + "type": "blob", 210 + "accept": [ 211 + "image/png", 212 + "image/jpeg" 213 + ], 214 + "maxSize": 1000000, 215 + "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'" 216 + }, 217 + "banner": { 218 + "type": "blob", 219 + "accept": [ 220 + "image/png", 221 + "image/jpeg" 222 + ], 223 + "maxSize": 1000000, 224 + "description": "Larger horizontal image to display behind profile view." 225 + }, 226 + "labels": { 227 + "refs": [ 228 + "com.atproto.label.defs#selfLabels" 229 + ], 230 + "type": "union", 231 + "description": "Self-label values, specific to the Bluesky application, on the overall account." 232 + }, 233 + "website": { 234 + "type": "string", 235 + "format": "uri" 236 + }, 237 + "pronouns": { 238 + "type": "string", 239 + "maxLength": 200, 240 + "description": "Free-form pronouns text.", 241 + "maxGraphemes": 20 242 + }, 243 + "createdAt": { 244 + "type": "string", 245 + "format": "datetime" 246 + }, 247 + "pinnedPost": { 248 + "ref": "com.atproto.repo.strongRef", 249 + "type": "ref" 250 + }, 251 + "description": { 252 + "type": "string", 253 + "maxLength": 2560, 254 + "description": "Free-form profile description text.", 255 + "maxGraphemes": 256 256 + }, 257 + "displayName": { 258 + "type": "string", 259 + "maxLength": 640, 260 + "maxGraphemes": 64 261 + }, 262 + "joinedViaStarterPack": { 263 + "ref": "com.atproto.repo.strongRef", 264 + "type": "ref" 265 + } 266 + } 267 + } 268 + } 269 + }
+91
lexicons/network/cosmik/card.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "network.cosmik.card", 4 + "description": "A saved link or note in a Semble collection.", 5 + "defs": { 6 + "main": { 7 + "type": "record", 8 + "description": "A card representing a saved URL or a standalone note within a Semble collection.", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": ["type", "content", "createdAt"], 13 + "properties": { 14 + "type": { 15 + "type": "string", 16 + "enum": ["URL", "NOTE"], 17 + "description": "Whether this card is a saved URL or a standalone note." 18 + }, 19 + "content": { 20 + "type": "union", 21 + "refs": ["network.cosmik.card#urlContent", "network.cosmik.card#noteContent"], 22 + "description": "The card content — either a URL with metadata or a text note." 23 + }, 24 + "parentCard": { 25 + "type": "union", 26 + "refs": ["com.atproto.repo.strongRef"], 27 + "description": "Parent card this is a reply/annotation to." 28 + }, 29 + "createdAt": { 30 + "type": "string", 31 + "format": "datetime", 32 + "description": "When the card was created." 33 + } 34 + } 35 + } 36 + }, 37 + "urlContent": { 38 + "type": "object", 39 + "description": "Content for a URL-type card.", 40 + "required": ["url"], 41 + "properties": { 42 + "url": { 43 + "type": "string", 44 + "format": "uri", 45 + "description": "The saved URL." 46 + }, 47 + "metadata": { 48 + "type": "network.cosmik.card#urlMetadata", 49 + "description": "Extracted metadata for the URL." 50 + } 51 + } 52 + }, 53 + "noteContent": { 54 + "type": "object", 55 + "description": "Content for a note-type card.", 56 + "required": ["text"], 57 + "properties": { 58 + "text": { 59 + "type": "string", 60 + "maxGraphemes": 2000, 61 + "description": "The note text." 62 + } 63 + } 64 + }, 65 + "urlMetadata": { 66 + "type": "object", 67 + "description": "Open Graph-style metadata extracted from a URL.", 68 + "properties": { 69 + "type": { 70 + "type": "string", 71 + "description": "OG type (e.g. 'link', 'article')." 72 + }, 73 + "title": { 74 + "type": "string", 75 + "maxGraphemes": 500, 76 + "description": "Page title." 77 + }, 78 + "description": { 79 + "type": "string", 80 + "maxGraphemes": 2000, 81 + "description": "Page description." 82 + }, 83 + "imageUrl": { 84 + "type": "string", 85 + "format": "uri", 86 + "description": "OG image URL." 87 + } 88 + } 89 + } 90 + } 91 + }
+52
lexicons/network/cosmik/collection.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "network.cosmik.collection", 4 + "description": "A collection of saved links and notes in Semble.", 5 + "defs": { 6 + "main": { 7 + "type": "record", 8 + "description": "A named collection of cards in Semble. Collections can be open or closed and support collaborators.", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": ["name", "accessType", "createdAt"], 13 + "properties": { 14 + "name": { 15 + "type": "string", 16 + "maxGraphemes": 200, 17 + "description": "Name of the collection." 18 + }, 19 + "description": { 20 + "type": "string", 21 + "maxGraphemes": 2000, 22 + "description": "What this collection is about." 23 + }, 24 + "accessType": { 25 + "type": "string", 26 + "enum": ["OPEN", "CLOSED"], 27 + "description": "Whether the collection is open (public) or closed (private)." 28 + }, 29 + "collaborators": { 30 + "type": "array", 31 + "maxLength": 50, 32 + "items": { 33 + "type": "string", 34 + "format": "did" 35 + }, 36 + "description": "DIDs of collaborators who can add cards to this collection." 37 + }, 38 + "createdAt": { 39 + "type": "string", 40 + "format": "datetime", 41 + "description": "When the collection was created." 42 + }, 43 + "updatedAt": { 44 + "type": "string", 45 + "format": "datetime", 46 + "description": "When the collection was last updated." 47 + } 48 + } 49 + } 50 + } 51 + } 52 + }
+87
lexicons/network/cosmik/connection.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "network.cosmik.connection", 4 + "description": "A directed connection between two resources (URLs or AT URIs). The fundamental primitive of the Stigmergic knowledge graph.", 5 + "defs": { 6 + "main": { 7 + "type": "record", 8 + "description": "A connection linking a source to a target, with optional type and note. Connections are the morphisms of the knowledge graph -- objects (cards, collections, URLs) emerge from their connections rather than being created first.", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": ["source", "target", "createdAt"], 13 + "properties": { 14 + "source": { 15 + "type": "string", 16 + "description": "Source resource -- a URL or AT URI." 17 + }, 18 + "target": { 19 + "type": "string", 20 + "description": "Target resource -- a URL or AT URI." 21 + }, 22 + "connectionType": { 23 + "type": "string", 24 + "knownValues": [ 25 + "network.cosmik.connection#contains", 26 + "network.cosmik.connection#cites", 27 + "network.cosmik.connection#relates", 28 + "network.cosmik.connection#inspired", 29 + "network.cosmik.connection#contradicts", 30 + "network.cosmik.connection#extends", 31 + "network.cosmik.connection#forks", 32 + "network.cosmik.connection#annotates" 33 + ], 34 + "description": "Type of connection. Open set -- new types can be added without schema changes." 35 + }, 36 + "note": { 37 + "type": "string", 38 + "maxGraphemes": 1000, 39 + "description": "Optional note about the connection." 40 + }, 41 + "createdAt": { 42 + "type": "string", 43 + "format": "datetime", 44 + "description": "When this connection was created." 45 + }, 46 + "updatedAt": { 47 + "type": "string", 48 + "format": "datetime", 49 + "description": "When this connection was last updated." 50 + } 51 + } 52 + } 53 + }, 54 + "contains": { 55 + "type": "token", 56 + "description": "Collection contains card. Source is the collection AT URI, target is the card AT URI or URL." 57 + }, 58 + "cites": { 59 + "type": "token", 60 + "description": "Card cites a URL or reference. Source is the card AT URI, target is the cited URL." 61 + }, 62 + "relates": { 63 + "type": "token", 64 + "description": "General relation between two resources." 65 + }, 66 + "inspired": { 67 + "type": "token", 68 + "description": "Creative lineage -- source was inspired by target." 69 + }, 70 + "contradicts": { 71 + "type": "token", 72 + "description": "Source contradicts target -- opposing evidence or argument." 73 + }, 74 + "extends": { 75 + "type": "token", 76 + "description": "Source builds on target -- extension or elaboration." 77 + }, 78 + "forks": { 79 + "type": "token", 80 + "description": "Source diverges from target -- a different direction from the same origin." 81 + }, 82 + "annotates": { 83 + "type": "token", 84 + "description": "Source annotates target -- marginalia, commentary, or highlight." 85 + } 86 + } 87 + }
+27
lexicons/network/cosmik/follow.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "network.cosmik.follow", 4 + "description": "A follow relationship -- either a user follow or a collection follow.", 5 + "defs": { 6 + "main": { 7 + "type": "record", 8 + "description": "A record representing a follow of a user or collection.", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": ["subject", "createdAt"], 13 + "properties": { 14 + "subject": { 15 + "type": "string", 16 + "description": "DID of the user being followed, or AT URI of the collection being followed." 17 + }, 18 + "createdAt": { 19 + "type": "string", 20 + "format": "datetime", 21 + "description": "When this follow was created." 22 + } 23 + } 24 + } 25 + } 26 + } 27 + }
+75
lexicons/org/latha/strata/citation.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.citation", 4 + "description": "A research citation with structured metadata and takeaway, tracked in the Strata memory architecture.", 5 + "defs": { 6 + "main": { 7 + "type": "record", 8 + "description": "A research reference recorded in Strata. Captures the source, a structured takeaway, and confidence level. Can be linked to reasoning records for full provenance.", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": ["url", "title", "takeaway", "confidence", "createdAt"], 13 + "properties": { 14 + "url": { 15 + "type": "string", 16 + "format": "uri", 17 + "description": "Source URL of the cited work." 18 + }, 19 + "title": { 20 + "type": "string", 21 + "maxGraphemes": 300, 22 + "description": "Title of the cited work." 23 + }, 24 + "takeaway": { 25 + "type": "string", 26 + "maxGraphemes": 2000, 27 + "description": "Key insight, summary, or main finding from the cited work." 28 + }, 29 + "authors": { 30 + "type": "array", 31 + "maxLength": 20, 32 + "items": { 33 + "type": "string", 34 + "maxGraphemes": 200 35 + }, 36 + "description": "Author names." 37 + }, 38 + "publishedAt": { 39 + "type": "string", 40 + "format": "datetime", 41 + "description": "Publication date of the cited work." 42 + }, 43 + "confidence": { 44 + "type": "string", 45 + "enum": [ 46 + "org.latha.strata.defs#high", 47 + "org.latha.strata.defs#medium", 48 + "org.latha.strata.defs#low" 49 + ], 50 + "description": "Confidence level in the citation's relevance and accuracy." 51 + }, 52 + "domain": { 53 + "type": "string", 54 + "maxGraphemes": 100, 55 + "description": "Domain or discipline of the cited work (e.g. 'machine-learning', 'philosophy')." 56 + }, 57 + "tags": { 58 + "type": "array", 59 + "maxLength": 20, 60 + "items": { 61 + "type": "string", 62 + "maxGraphemes": 100 63 + }, 64 + "description": "Freeform topic tags." 65 + }, 66 + "createdAt": { 67 + "type": "string", 68 + "format": "datetime", 69 + "description": "When this citation was recorded in Strata." 70 + } 71 + } 72 + } 73 + } 74 + } 75 + }
+111
lexicons/org/latha/strata/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.defs", 4 + "description": "Shared type definitions for the org.latha.strata namespace — a three-layer memory architecture (Vault, Carry, MemFS).", 5 + "defs": { 6 + "claimRef": { 7 + "type": "object", 8 + "description": "Reference to a claim stored in a Strata layer, with its location and identifier.", 9 + "required": ["uri"], 10 + "properties": { 11 + "uri": { 12 + "type": "string", 13 + "format": "at-uri", 14 + "description": "AT-URI of the referenced claim record." 15 + }, 16 + "layer": { 17 + "type": "string", 18 + "knownValues": [ 19 + "org.latha.strata.defs#vault", 20 + "org.latha.strata.defs#carry", 21 + "org.latha.strata.defs#memfs" 22 + ], 23 + "description": "Which Strata layer holds the canonical copy." 24 + } 25 + } 26 + }, 27 + "sourceRef": { 28 + "type": "object", 29 + "description": "Provenance of a claim — where it came from and how it was produced.", 30 + "required": ["method"], 31 + "properties": { 32 + "method": { 33 + "type": "string", 34 + "knownValues": [ 35 + "org.latha.strata.defs#web-search", 36 + "org.latha.strata.defs#human-input", 37 + "org.latha.strata.defs#inference", 38 + "org.latha.strata.defs#carry-lookup" 39 + ], 40 + "description": "How the claim was produced." 41 + }, 42 + "url": { 43 + "type": "string", 44 + "format": "uri", 45 + "description": "Source URL if the claim came from the web." 46 + }, 47 + "agentDid": { 48 + "type": "string", 49 + "format": "did", 50 + "description": "DID of the agent that produced the claim." 51 + } 52 + } 53 + }, 54 + "vault": { 55 + "type": "token", 56 + "description": "Strata layer: the surface — Obsidian vault, prose, human-readable notes." 57 + }, 58 + "carry": { 59 + "type": "token", 60 + "description": "Strata layer: the mid — structured claims, shared across agents, CRDT-backed." 61 + }, 62 + "memfs": { 63 + "type": "token", 64 + "description": "Strata layer: the deep — private agent state, system prompt, git-backed." 65 + }, 66 + "high": { 67 + "type": "token", 68 + "description": "Confidence level: high — well-established, from trusted source or direct observation." 69 + }, 70 + "medium": { 71 + "type": "token", 72 + "description": "Confidence level: medium — plausible, from reasonable source or inference." 73 + }, 74 + "low": { 75 + "type": "token", 76 + "description": "Confidence level: low — uncertain, speculative, or from unverified source." 77 + }, 78 + "person": { 79 + "type": "token", 80 + "description": "Entity type: a person." 81 + }, 82 + "org": { 83 + "type": "token", 84 + "description": "Entity type: an organization." 85 + }, 86 + "concept": { 87 + "type": "token", 88 + "description": "Entity type: an abstract concept, idea, or topic." 89 + }, 90 + "tool": { 91 + "type": "token", 92 + "description": "Entity type: a software tool, service, or platform." 93 + }, 94 + "web-search": { 95 + "type": "token", 96 + "description": "Claim method: produced via web search." 97 + }, 98 + "human-input": { 99 + "type": "token", 100 + "description": "Claim method: directly provided by a human." 101 + }, 102 + "inference": { 103 + "type": "token", 104 + "description": "Claim method: inferred by an agent from other evidence." 105 + }, 106 + "carry-lookup": { 107 + "type": "token", 108 + "description": "Claim method: looked up from existing carry data." 109 + } 110 + } 111 + }
+76
lexicons/org/latha/strata/entity.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.entity", 4 + "description": "A tracked entity — person, organization, concept, or tool — managed across Strata memory layers.", 5 + "defs": { 6 + "main": { 7 + "type": "record", 8 + "description": "An entity tracked across the Strata three-layer memory architecture. Links the AT Protocol record to carry (structured claims) and vault (prose notes).", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": ["name", "entityType", "createdAt"], 13 + "properties": { 14 + "name": { 15 + "type": "string", 16 + "maxGraphemes": 200, 17 + "description": "Display name of the entity." 18 + }, 19 + "entityType": { 20 + "type": "string", 21 + "enum": [ 22 + "org.latha.strata.defs#person", 23 + "org.latha.strata.defs#org", 24 + "org.latha.strata.defs#concept", 25 + "org.latha.strata.defs#tool" 26 + ], 27 + "description": "Category of the entity." 28 + }, 29 + "description": { 30 + "type": "string", 31 + "maxGraphemes": 1000, 32 + "description": "Short description of the entity." 33 + }, 34 + "aliases": { 35 + "type": "array", 36 + "maxLength": 10, 37 + "items": { 38 + "type": "string", 39 + "maxGraphemes": 200 40 + }, 41 + "description": "Alternative names or handles for the entity." 42 + }, 43 + "vaultPath": { 44 + "type": "string", 45 + "maxGraphemes": 500, 46 + "description": "Relative path to the corresponding note in the Obsidian vault (e.g. 'people/Alice Smith.md')." 47 + }, 48 + "carryDid": { 49 + "type": "string", 50 + "format": "did", 51 + "description": "DID of the corresponding carry entity, linking this record to the structured claims layer." 52 + }, 53 + "homepage": { 54 + "type": "string", 55 + "format": "uri", 56 + "description": "Primary URL for the entity (personal site, org page, etc.)." 57 + }, 58 + "tags": { 59 + "type": "array", 60 + "maxLength": 20, 61 + "items": { 62 + "type": "string", 63 + "maxGraphemes": 100 64 + }, 65 + "description": "Freeform tags describing the entity." 66 + }, 67 + "createdAt": { 68 + "type": "string", 69 + "format": "datetime", 70 + "description": "When this entity was first tracked in Strata." 71 + } 72 + } 73 + } 74 + } 75 + } 76 + }
+62
lexicons/org/latha/strata/reasoning.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata.reasoning", 4 + "description": "Provenance for a Strata claim — why we believe something, what method produced it, and what it justifies.", 5 + "defs": { 6 + "main": { 7 + "type": "record", 8 + "description": "A reasoning record that provides provenance for a claim in Strata. Links a question or claim to the method that produced it, the evidence supporting it, and the claim it justifies. Forms the backbone of the Strata provenance graph.", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": ["question", "method", "justifies", "confidence", "createdAt"], 13 + "properties": { 14 + "question": { 15 + "type": "string", 16 + "maxGraphemes": 500, 17 + "description": "The question or claim being justified." 18 + }, 19 + "method": { 20 + "type": "string", 21 + "knownValues": [ 22 + "org.latha.strata.defs#web-search", 23 + "org.latha.strata.defs#human-input", 24 + "org.latha.strata.defs#inference", 25 + "org.latha.strata.defs#carry-lookup" 26 + ], 27 + "description": "How the claim was produced. Open set — future methods can be added without schema changes." 28 + }, 29 + "justifies": { 30 + "type": "string", 31 + "format": "at-uri", 32 + "description": "AT-URI of the claim this reasoning supports (e.g. 'at://did:plc:.../org.latha.strata.citation/3tx...')." 33 + }, 34 + "confidence": { 35 + "type": "string", 36 + "enum": [ 37 + "org.latha.strata.defs#high", 38 + "org.latha.strata.defs#medium", 39 + "org.latha.strata.defs#low" 40 + ], 41 + "description": "Confidence level in the reasoning." 42 + }, 43 + "evidence": { 44 + "type": "string", 45 + "maxGraphemes": 3000, 46 + "description": "Supporting evidence, reasoning chain, or explanation of why this method supports the claim." 47 + }, 48 + "sourceUrl": { 49 + "type": "string", 50 + "format": "uri", 51 + "description": "URL of the source if the reasoning came from a web search." 52 + }, 53 + "createdAt": { 54 + "type": "string", 55 + "format": "datetime", 56 + "description": "When this reasoning was recorded in Strata." 57 + } 58 + } 59 + } 60 + } 61 + } 62 + }
+193
lexicons/org/latha/strata/strata.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "org.latha.strata", 4 + "description": "A structured synthesis of an external source, cross-referenced with local knowledge (carry + vault). The stigmergic signal — a pheromone trail others can discover and build on.", 5 + "defs": { 6 + "main": { 7 + "type": "record", 8 + "description": "A Strata synthesis record. Produced when a user runs Strata analysis on a Semble card (or any AT Protocol record). Cross-references the source with the user's vault and carry data, producing themes, connections, tensions, and a prose synthesis.", 9 + "key": "tid", 10 + "record": { 11 + "type": "object", 12 + "required": ["source", "analysis", "createdAt"], 13 + "properties": { 14 + "source": { 15 + "type": "ref", 16 + "ref": "#sourceRef", 17 + "description": "The source record that triggered this analysis." 18 + }, 19 + "analysis": { 20 + "type": "ref", 21 + "ref": "#structuredAnalysis", 22 + "description": "The structured analysis output." 23 + }, 24 + "carryRefs": { 25 + "type": "array", 26 + "maxLength": 20, 27 + "items": { 28 + "type": "ref", 29 + "ref": "#carryCrossRef" 30 + }, 31 + "description": "Carry entities cross-referenced in this analysis. Carry stays local-first — only summaries are included unless explicitly published as companion records." 32 + }, 33 + "createdAt": { 34 + "type": "string", 35 + "format": "datetime", 36 + "description": "When this synthesis was created." 37 + }, 38 + "updatedAt": { 39 + "type": "string", 40 + "format": "datetime", 41 + "description": "When this synthesis was last updated." 42 + } 43 + } 44 + } 45 + }, 46 + "sourceRef": { 47 + "type": "object", 48 + "description": "Reference to the source record that triggered the analysis.", 49 + "required": ["uri"], 50 + "properties": { 51 + "uri": { 52 + "type": "string", 53 + "format": "at-uri", 54 + "description": "AT URI of the source record (Semble card, Bluesky post, etc.)" 55 + }, 56 + "cid": { 57 + "type": "string", 58 + "description": "CID of the source record at time of analysis." 59 + }, 60 + "collection": { 61 + "type": "string", 62 + "description": "NSID of the source collection (e.g. network.cosmik.card)." 63 + } 64 + } 65 + }, 66 + "structuredAnalysis": { 67 + "type": "object", 68 + "description": "The structured output of a Strata analysis run.", 69 + "required": ["themes"], 70 + "properties": { 71 + "themes": { 72 + "type": "array", 73 + "maxLength": 20, 74 + "items": { 75 + "type": "string", 76 + "maxGraphemes": 100 77 + }, 78 + "description": "Key themes identified in the source." 79 + }, 80 + "connections": { 81 + "type": "array", 82 + "maxLength": 20, 83 + "items": { 84 + "type": "ref", 85 + "ref": "#connection" 86 + }, 87 + "description": "Connections to existing knowledge in vault and carry." 88 + }, 89 + "tensions": { 90 + "type": "array", 91 + "maxLength": 10, 92 + "items": { 93 + "type": "string", 94 + "maxGraphemes": 500 95 + }, 96 + "description": "Tensions or contradictions with existing claims." 97 + }, 98 + "openQuestions": { 99 + "type": "array", 100 + "maxLength": 10, 101 + "items": { 102 + "type": "string", 103 + "maxGraphemes": 500 104 + }, 105 + "description": "Questions raised by the analysis." 106 + }, 107 + "synthesis": { 108 + "type": "string", 109 + "maxGraphemes": 2000, 110 + "maxLength": 20000, 111 + "description": "Prose synthesis connecting the source to existing knowledge." 112 + } 113 + } 114 + }, 115 + "connection": { 116 + "type": "object", 117 + "description": "A connection between the source and an existing knowledge item.", 118 + "required": ["description", "targetUri"], 119 + "properties": { 120 + "description": { 121 + "type": "string", 122 + "maxGraphemes": 500, 123 + "description": "Human-readable description of the connection." 124 + }, 125 + "targetUri": { 126 + "type": "string", 127 + "format": "at-uri", 128 + "description": "AT URI of the connected record." 129 + }, 130 + "relation": { 131 + "type": "string", 132 + "knownValues": [ 133 + "org.latha.strata#supports", 134 + "org.latha.strata#contradicts", 135 + "org.latha.strata#extends", 136 + "org.latha.strata#contextualizes", 137 + "org.latha.strata#exemplifies" 138 + ], 139 + "description": "Type of connection." 140 + } 141 + } 142 + }, 143 + "carryCrossRef": { 144 + "type": "object", 145 + "description": "Cross-reference to a carry entity, translated to AT Protocol addressable format.", 146 + "required": ["entityType", "atUri"], 147 + "properties": { 148 + "entityType": { 149 + "type": "string", 150 + "knownValues": [ 151 + "org.latha.strata.defs#claimRef", 152 + "org.latha.strata.defs#sourceRef" 153 + ], 154 + "description": "Type of carry entity." 155 + }, 156 + "carryId": { 157 + "type": "string", 158 + "description": "Original carry entity ID for local correlation." 159 + }, 160 + "atUri": { 161 + "type": "string", 162 + "format": "at-uri", 163 + "description": "AT Protocol URI for this carry entity (if published as companion record)." 164 + }, 165 + "summary": { 166 + "type": "string", 167 + "maxGraphemes": 500, 168 + "description": "Summary of the carry entity." 169 + } 170 + } 171 + }, 172 + "supports": { 173 + "type": "token", 174 + "description": "Connection relation: the source supports an existing claim." 175 + }, 176 + "contradicts": { 177 + "type": "token", 178 + "description": "Connection relation: the source contradicts an existing claim." 179 + }, 180 + "extends": { 181 + "type": "token", 182 + "description": "Connection relation: the source extends an existing claim." 183 + }, 184 + "contextualizes": { 185 + "type": "token", 186 + "description": "Connection relation: the source provides context for an existing claim." 187 + }, 188 + "exemplifies": { 189 + "type": "token", 190 + "description": "Connection relation: the source is an example of an existing claim." 191 + } 192 + } 193 + }
+5
lexicons/pulled/README.md
··· 1 + # lexicon sources 2 + 3 + this directory contains lexicon documents pulled from the following sources: 4 + 5 + - atproto (nsids: app.bsky.actor.profile, network.cosmik.card, network.cosmik.collection, network.cosmik.connection, network.cosmik.defs, network.cosmik.follow, org.latha.strata.citation, org.latha.strata.entity, org.latha.strata.reasoning)
+67
lexicons/pulled/app/bsky/actor/profile.json
··· 1 + { 2 + "id": "app.bsky.actor.profile", 3 + "defs": { 4 + "main": { 5 + "key": "literal:self", 6 + "type": "record", 7 + "record": { 8 + "type": "object", 9 + "properties": { 10 + "avatar": { 11 + "type": "blob", 12 + "accept": ["image/png", "image/jpeg"], 13 + "maxSize": 1000000, 14 + "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'" 15 + }, 16 + "banner": { 17 + "type": "blob", 18 + "accept": ["image/png", "image/jpeg"], 19 + "maxSize": 1000000, 20 + "description": "Larger horizontal image to display behind profile view." 21 + }, 22 + "labels": { 23 + "refs": ["com.atproto.label.defs#selfLabels"], 24 + "type": "union", 25 + "description": "Self-label values, specific to the Bluesky application, on the overall account." 26 + }, 27 + "website": { 28 + "type": "string", 29 + "format": "uri" 30 + }, 31 + "pronouns": { 32 + "type": "string", 33 + "maxLength": 200, 34 + "description": "Free-form pronouns text.", 35 + "maxGraphemes": 20 36 + }, 37 + "createdAt": { 38 + "type": "string", 39 + "format": "datetime" 40 + }, 41 + "pinnedPost": { 42 + "ref": "com.atproto.repo.strongRef", 43 + "type": "ref" 44 + }, 45 + "description": { 46 + "type": "string", 47 + "maxLength": 2560, 48 + "description": "Free-form profile description text.", 49 + "maxGraphemes": 256 50 + }, 51 + "displayName": { 52 + "type": "string", 53 + "maxLength": 640, 54 + "maxGraphemes": 64 55 + }, 56 + "joinedViaStarterPack": { 57 + "ref": "com.atproto.repo.strongRef", 58 + "type": "ref" 59 + } 60 + } 61 + }, 62 + "description": "A declaration of a Bluesky account profile." 63 + } 64 + }, 65 + "$type": "com.atproto.lexicon.schema", 66 + "lexicon": 1 67 + }
+132
lexicons/pulled/network/cosmik/card.json
··· 1 + { 2 + "id": "network.cosmik.card", 3 + "defs": { 4 + "main": { 5 + "key": "tid", 6 + "type": "record", 7 + "record": { 8 + "type": "object", 9 + "required": ["type", "content"], 10 + "properties": { 11 + "url": { 12 + "type": "string", 13 + "format": "uri", 14 + "description": "Optional URL associated with the card. Required for URL cards, optional for NOTE cards." 15 + }, 16 + "type": { 17 + "type": "string", 18 + "description": "The type of card", 19 + "knownValues": ["URL", "NOTE"] 20 + }, 21 + "content": { 22 + "refs": ["#urlContent", "#noteContent"], 23 + "type": "union", 24 + "description": "The specific content of the card, determined by the card type." 25 + }, 26 + "createdAt": { 27 + "type": "string", 28 + "format": "datetime", 29 + "description": "Timestamp when this card was created (usually set by PDS)." 30 + }, 31 + "parentCard": { 32 + "ref": "com.atproto.repo.strongRef", 33 + "type": "ref", 34 + "description": "Optional strong reference to a parent card (for NOTE cards)." 35 + }, 36 + "provenance": { 37 + "ref": "network.cosmik.defs#provenance", 38 + "type": "ref", 39 + "description": "Optional provenance information for this card." 40 + }, 41 + "originalCard": { 42 + "ref": "com.atproto.repo.strongRef", 43 + "type": "ref", 44 + "description": "Optional strong reference to the original card (for NOTE cards)." 45 + } 46 + } 47 + }, 48 + "description": "A record representing a card with content." 49 + }, 50 + "urlContent": { 51 + "type": "object", 52 + "required": ["url"], 53 + "properties": { 54 + "url": { 55 + "type": "string", 56 + "format": "uri", 57 + "description": "The URL being saved" 58 + }, 59 + "metadata": { 60 + "ref": "#urlMetadata", 61 + "type": "ref", 62 + "description": "Optional metadata about the URL" 63 + } 64 + }, 65 + "description": "Content structure for a URL card." 66 + }, 67 + "noteContent": { 68 + "type": "object", 69 + "required": ["text"], 70 + "properties": { 71 + "text": { 72 + "type": "string", 73 + "maxLength": 10000, 74 + "description": "The note text content" 75 + } 76 + }, 77 + "description": "Content structure for a note card." 78 + }, 79 + "urlMetadata": { 80 + "type": "object", 81 + "properties": { 82 + "doi": { 83 + "type": "string", 84 + "description": "Digital Object Identifier (DOI) for academic content" 85 + }, 86 + "isbn": { 87 + "type": "string", 88 + "description": "International Standard Book Number (ISBN) for books" 89 + }, 90 + "type": { 91 + "type": "string", 92 + "description": "Type of content (e.g., 'video', 'article')" 93 + }, 94 + "title": { 95 + "type": "string", 96 + "description": "Title of the page" 97 + }, 98 + "author": { 99 + "type": "string", 100 + "description": "Author of the content" 101 + }, 102 + "imageUrl": { 103 + "type": "string", 104 + "format": "uri", 105 + "description": "URL of a representative image" 106 + }, 107 + "siteName": { 108 + "type": "string", 109 + "description": "Name of the site" 110 + }, 111 + "description": { 112 + "type": "string", 113 + "description": "Description of the page" 114 + }, 115 + "retrievedAt": { 116 + "type": "string", 117 + "format": "datetime", 118 + "description": "When the metadata was retrieved" 119 + }, 120 + "publishedDate": { 121 + "type": "string", 122 + "format": "datetime", 123 + "description": "When the content was published" 124 + } 125 + }, 126 + "description": "Metadata about a URL." 127 + } 128 + }, 129 + "$type": "com.atproto.lexicon.schema", 130 + "lexicon": 1, 131 + "description": "A single record type for all cards." 132 + }
+52
lexicons/pulled/network/cosmik/collection.json
··· 1 + { 2 + "id": "network.cosmik.collection", 3 + "defs": { 4 + "main": { 5 + "key": "tid", 6 + "type": "record", 7 + "record": { 8 + "type": "object", 9 + "required": ["name", "accessType"], 10 + "properties": { 11 + "name": { 12 + "type": "string", 13 + "maxLength": 100, 14 + "description": "Name of the collection" 15 + }, 16 + "createdAt": { 17 + "type": "string", 18 + "format": "datetime", 19 + "description": "Timestamp when this collection was created (usually set by PDS)." 20 + }, 21 + "updatedAt": { 22 + "type": "string", 23 + "format": "datetime", 24 + "description": "Timestamp when this collection was last updated." 25 + }, 26 + "accessType": { 27 + "type": "string", 28 + "description": "Access control for the collection", 29 + "knownValues": ["OPEN", "CLOSED"] 30 + }, 31 + "description": { 32 + "type": "string", 33 + "maxLength": 500, 34 + "description": "Description of the collection" 35 + }, 36 + "collaborators": { 37 + "type": "array", 38 + "items": { 39 + "type": "string", 40 + "description": "DID of a collaborator" 41 + }, 42 + "description": "List of collaborator DIDs who can add cards to closed collections" 43 + } 44 + } 45 + }, 46 + "description": "A record representing a collection of cards." 47 + } 48 + }, 49 + "$type": "com.atproto.lexicon.schema", 50 + "lexicon": 1, 51 + "description": "A single record type for collections of cards." 52 + }
+46
lexicons/pulled/network/cosmik/connection.json
··· 1 + { 2 + "id": "network.cosmik.connection", 3 + "defs": { 4 + "main": { 5 + "key": "tid", 6 + "type": "record", 7 + "record": { 8 + "type": "object", 9 + "required": ["source", "target"], 10 + "properties": { 11 + "note": { 12 + "type": "string", 13 + "maxLength": 1000, 14 + "description": "Optional note about the connection" 15 + }, 16 + "source": { 17 + "type": "string", 18 + "description": "Source entity (URL string or AT URI)" 19 + }, 20 + "target": { 21 + "type": "string", 22 + "description": "Target entity (URL string or AT URI)" 23 + }, 24 + "createdAt": { 25 + "type": "string", 26 + "format": "datetime", 27 + "description": "Timestamp when this connection was created." 28 + }, 29 + "updatedAt": { 30 + "type": "string", 31 + "format": "datetime", 32 + "description": "Timestamp when this connection was last updated." 33 + }, 34 + "connectionType": { 35 + "type": "string", 36 + "description": "Optional type of connection" 37 + } 38 + } 39 + }, 40 + "description": "A connection linking a source to a target, with optional type and note." 41 + } 42 + }, 43 + "$type": "com.atproto.lexicon.schema", 44 + "lexicon": 1, 45 + "description": "A record representing a connection between two entities (URLs or cards)." 46 + }
+19
lexicons/pulled/network/cosmik/defs.json
··· 1 + { 2 + "id": "network.cosmik.defs", 3 + "defs": { 4 + "provenance": { 5 + "type": "object", 6 + "properties": { 7 + "via": { 8 + "ref": "com.atproto.repo.strongRef", 9 + "type": "ref", 10 + "description": "Strong reference to the card that led to this record." 11 + } 12 + }, 13 + "description": "Represents the provenance or source of a record." 14 + } 15 + }, 16 + "$type": "com.atproto.lexicon.schema", 17 + "lexicon": 1, 18 + "description": "Common definitions for annotation types and references" 19 + }
+28
lexicons/pulled/network/cosmik/follow.json
··· 1 + { 2 + "id": "network.cosmik.follow", 3 + "defs": { 4 + "main": { 5 + "key": "tid", 6 + "type": "record", 7 + "record": { 8 + "type": "object", 9 + "required": ["subject", "createdAt"], 10 + "properties": { 11 + "subject": { 12 + "type": "string", 13 + "description": "DID of the user being followed, or AT URI of the collection being followed" 14 + }, 15 + "createdAt": { 16 + "type": "string", 17 + "format": "datetime", 18 + "description": "Timestamp when this follow was created." 19 + } 20 + } 21 + }, 22 + "description": "A record representing a follow of a user or collection." 23 + } 24 + }, 25 + "$type": "com.atproto.lexicon.schema", 26 + "lexicon": 1, 27 + "description": "A record representing a follow relationship." 28 + }
+34
package.json
··· 1 + { 2 + "name": "stigmergic", 3 + "version": "0.1.0", 4 + "private": true, 5 + "type": "module", 6 + "scripts": { 7 + "build:frontend": "bash build-frontend.sh", 8 + "dev": "pnpm build:frontend && wrangler dev", 9 + "deploy": "pnpm build:frontend && wrangler deploy", 10 + "typecheck": "tsc --noEmit" 11 + }, 12 + "dependencies": { 13 + "@atmo-dev/contrail": "^0.6.0", 14 + "@cloudflare/containers": "^0.1.0", 15 + "hono": "^4.7.0" 16 + }, 17 + "devDependencies": { 18 + "@atcute/atproto": "^4.0.0", 19 + "@atcute/lex-cli": "^2.8.1", 20 + "@atcute/lexicons": "^2.0.0", 21 + "@atmo-dev/contrail-lexicons": "^0.4.2", 22 + "@atproto/oauth-client-browser": "^0.3.42", 23 + "@cloudflare/workers-types": "^4.20250124.0", 24 + "esbuild": "^0.28.0", 25 + "typescript": "^5.7.3", 26 + "wrangler": "^4.63.0" 27 + }, 28 + "pnpm": { 29 + "onlyBuiltDependencies": [ 30 + "esbuild", 31 + "workerd" 32 + ] 33 + } 34 + }
+1830
pnpm-lock.yaml
··· 1 + lockfileVersion: '9.0' 2 + 3 + settings: 4 + autoInstallPeers: true 5 + excludeLinksFromLockfile: false 6 + 7 + importers: 8 + 9 + .: 10 + dependencies: 11 + '@atmo-dev/contrail': 12 + specifier: ^0.6.0 13 + version: 0.6.0(wrangler@4.90.1(@cloudflare/workers-types@4.20260511.1)) 14 + hono: 15 + specifier: ^4.7.0 16 + version: 4.12.18 17 + devDependencies: 18 + '@atcute/atproto': 19 + specifier: ^4.0.0 20 + version: 4.0.0(@atcute/lexicons@2.0.0) 21 + '@atcute/lex-cli': 22 + specifier: ^2.8.1 23 + version: 2.8.2(@atcute/cbor@2.3.3(@atcute/cid@2.4.1))(@atcute/cid@2.4.1) 24 + '@atcute/lexicons': 25 + specifier: ^2.0.0 26 + version: 2.0.0 27 + '@atmo-dev/contrail-lexicons': 28 + specifier: ^0.4.2 29 + version: 0.4.6(@atcute/cbor@2.3.3(@atcute/cid@2.4.1))(@atcute/cid@2.4.1)(wrangler@4.90.1(@cloudflare/workers-types@4.20260511.1)) 30 + '@atproto/oauth-client-browser': 31 + specifier: ^0.3.42 32 + version: 0.3.42 33 + '@cloudflare/workers-types': 34 + specifier: ^4.20250124.0 35 + version: 4.20260511.1 36 + esbuild: 37 + specifier: ^0.28.0 38 + version: 0.28.0 39 + typescript: 40 + specifier: ^5.7.3 41 + version: 5.9.3 42 + wrangler: 43 + specifier: ^4.63.0 44 + version: 4.90.1(@cloudflare/workers-types@4.20260511.1) 45 + 46 + packages: 47 + 48 + '@atcute/atproto@3.1.12': 49 + resolution: {integrity: sha512-SaHY0vV5+VfS2ViOcbYtxPmmh82vbxoK5ccHTGn5+ciHNY2arEVcBUFbIQKtsQP4PPZ+lNAVooH+Wh62flvCzg==} 50 + peerDependencies: 51 + '@atcute/lexicons': ^1.0.0 52 + 53 + '@atcute/atproto@4.0.0': 54 + resolution: {integrity: sha512-Rd21kW0tl/QEXhyPkJXRpUV8HYs7sMOmmXRu2z1sKMZbm1tqvHz1L3CQeTFcC/Xf/5cg7S6ITGIKRP0++zu0aw==} 55 + peerDependencies: 56 + '@atcute/lexicons': ^2.0.0 57 + 58 + '@atcute/car@5.1.2': 59 + resolution: {integrity: sha512-OCMwkNQtzkSwuWzyBFLF6w7YGYu7qJXkcDaYp618FyVnbqVsDr9fsfGEZ+p5FjYuvruZOXUH/PlZ2hRjavSEYg==} 60 + peerDependencies: 61 + '@atcute/cbor': ^2.0.0 62 + '@atcute/cid': ^2.0.0 63 + 64 + '@atcute/cbor@2.3.3': 65 + resolution: {integrity: sha512-zZ4nHOK837zTMWJtta35YD7pcukrTzDc8jkpIGlSgoDYzu3l4BX3WVgpPJtRn3K6h2v97uyiWfiVjSpM7JSFzQ==} 66 + peerDependencies: 67 + '@atcute/cid': ^2.0.0 68 + 69 + '@atcute/cid@2.4.1': 70 + resolution: {integrity: sha512-bwhna69RCv7yetXudtj+2qrMPYvhhIQqvJz6YUpUS98v7OdF3X2dnye9Nig2NDrklZcuyOsu7sQo7GOykJXRLQ==} 71 + 72 + '@atcute/client@4.2.2': 73 + resolution: {integrity: sha512-z16BaGgdO6WIkDCxqeI+zhnh2KmW9jsjd312PJ6YYsoDBpPPqL+WkBmxQ7eO9C6CMFxXsZpYcM81RzZEETA4PQ==} 74 + peerDependencies: 75 + '@atcute/lexicons': ^1.0.0 76 + 77 + '@atcute/crypto@2.4.1': 78 + resolution: {integrity: sha512-tJ3Pi/XYcAsABKtqSlSOTKfO5YiQ4XdqlTuPS8HiRZSezOPcXBFFzAFWpSIJPURbVPFQL3LLrrK0Ea24wl5qeQ==} 79 + 80 + '@atcute/identity-resolver@1.2.3': 81 + resolution: {integrity: sha512-q891zLUMtgoD60y5Pv2YmTg4wIf4ipFuIhZlIuQTTB7qM9sGxmBbe2quzTRCTl3pnsLEmTz7l+3Dszgoutsp5w==} 82 + peerDependencies: 83 + '@atcute/identity': ^1.0.0 84 + '@atcute/lexicons': ^1.0.0 85 + 86 + '@atcute/identity@1.1.5': 87 + resolution: {integrity: sha512-5i9nl1UVnBDPCumUwrLNl4BZpGvQ/XABEXbjhiw3PQwRUfpQA8FqByDGxXy2gWpFDrNvQ9yVuOoNsjzxJgjjVA==} 88 + peerDependencies: 89 + '@atcute/lexicons': ^1.0.0 90 + 91 + '@atcute/jetstream@1.1.3': 92 + resolution: {integrity: sha512-IlivviByHDKEC+qsfBL2DSHx9MkJxH0vsoYKc0ouZ8HKwXzR/GSwyjZ8TKb2KyVzbVfh1UPifLW9E3lCoGqaOw==} 93 + peerDependencies: 94 + '@atcute/lexicons': ^1.0.0 95 + 96 + '@atcute/lex-cli@2.8.2': 97 + resolution: {integrity: sha512-CqF1AGHtYeB2Hj9yDt1BUsoUx4HCXHlo7Oj4OLavFaA/9JU4Yc4fs/KYlDtIQMxNi9k3pPLAbU0/0c8z3m8J7g==} 98 + hasBin: true 99 + 100 + '@atcute/lexicon-doc@2.2.1': 101 + resolution: {integrity: sha512-Stdf4wX2Abn4VqPrlVmmGummxb/csPiZf5KbbVpHzrL6O18VW1FeI1zkUn0aNjP/vtZSS2Sqq3WsijuzQa+yCQ==} 102 + peerDependencies: 103 + '@atcute/lexicons': ^1.0.0 104 + 105 + '@atcute/lexicon-resolver@0.1.7': 106 + resolution: {integrity: sha512-b9a02EZXmlBCXTCmnteoQ9R7ohF9ZV1kEKuLdjIwhOV2d9GWnkgu1si/snB9q1HsN/H8E7bjrNFchL3cgy6xcA==} 107 + peerDependencies: 108 + '@atcute/identity': ^1.1.0 109 + '@atcute/identity-resolver': ^1.1.3 110 + '@atcute/lexicon-doc': ^2.0.0 111 + '@atcute/lexicons': ^1.0.0 112 + 113 + '@atcute/lexicons@1.3.1': 114 + resolution: {integrity: sha512-2JVxDmHt+QwsUoPyVYWIN7ZLRLfLx4GeJxKFjA9ofStuby9hCMv7Q4GAPIXuJD8wPv8vrnhr1yRNQhiJX+bthw==} 115 + 116 + '@atcute/lexicons@2.0.0': 117 + resolution: {integrity: sha512-fIlwP+TPEAGoF5aU5s+f8N5sOjOu8Mww/sQL1B57Dp2hj3G/EWG9XwOHPokzycBCgXx+UxIIrzZCGy8whsVDZw==} 118 + 119 + '@atcute/mst@1.0.1': 120 + resolution: {integrity: sha512-F3PfHt/6RedpSCwPFVOK8YQ+9lohAqeqUfqWrXLEZUmSVjXPlhSY6re+fmAnNuYX1g124QprIea9G2K3IfymyQ==} 121 + peerDependencies: 122 + '@atcute/cbor': ^2.0.0 123 + '@atcute/cid': ^2.0.0 124 + 125 + '@atcute/multibase@1.2.0': 126 + resolution: {integrity: sha512-ZK2GRra+qIYq9nNuQB52m2ul0hOmCQEtPobGfTSUxm7pF0OGEkWGkWHugFhNEDVzHzTwPxHp6VGotdZFue4lYQ==} 127 + 128 + '@atcute/repo@0.1.5': 129 + resolution: {integrity: sha512-VFQhAJmgD2oX7Zz6zNRKZeWwYPJu5JsluNt2UiOCXdnbhAPC9z9SdhLzPceWeZB1a/IuFTMgIgDE5SGUZmgJCg==} 130 + peerDependencies: 131 + '@atcute/cbor': ^2.0.0 132 + '@atcute/cid': ^2.0.0 133 + '@atcute/lexicons': ^1.0.0 134 + 135 + '@atcute/uint8array@1.1.2': 136 + resolution: {integrity: sha512-n+lutnbN9mKzSjSVdfsYfzJ40u2971H+iLSL46D6d7zcrA4delxusf/ftGFvj5oGW03OioaFgQOy3Lqa3JmTeA==} 137 + 138 + '@atcute/util-fetch@1.0.5': 139 + resolution: {integrity: sha512-qjHj01BGxjSjIFdPiAjSARnodJIIyKxnCMMEcXMESo9TAyND6XZQqrie5fia+LlYWVXdpsTds8uFQwc9jdKTig==} 140 + 141 + '@atcute/util-text@1.3.1': 142 + resolution: {integrity: sha512-MRgJXkx67znuBXuoAYCJkBZyd3OApL7zZlNf5kXhuoCXcdiu1nblRDycYTADSkym4epBSQWxh26kmI9sewaq6A==} 143 + 144 + '@atcute/varint@2.0.0': 145 + resolution: {integrity: sha512-CEY/oVK/nVpL4e5y3sdenLETDL6/Xu5xsE/0TupK+f0Yv8jcD60t2gD8SHROWSvUwYLdkjczLCSA7YrtnjCzWw==} 146 + 147 + '@atcute/xrpc-server@0.1.12': 148 + resolution: {integrity: sha512-70KIerQlljp5+s6t0u6YNN9klEboQUZa2hhoi/hmXIO1cIKEORettTMctnyjfcCJaSfAuj42dxPu51GTZBlm8w==} 149 + 150 + '@atmo-dev/contrail-lexicons@0.4.6': 151 + resolution: {integrity: sha512-WcrUIocLtYFZYBuyp7uwXamRkxVCRI2WT+kacXnnkwdb2vJYw4z/CmZmwOR2b0WHUXTohhYQRGfi7uDXKhdaxQ==} 152 + hasBin: true 153 + 154 + '@atmo-dev/contrail@0.6.0': 155 + resolution: {integrity: sha512-R5xlhQFT+nUkxCNKS41TwnVID2GZl2heh6Zz3Mw7+Zn0zrDLKkcbc4znNLw7q0VZk04Wx9xNxZQGlmfwUooJ1Q==} 156 + hasBin: true 157 + peerDependencies: 158 + pg: ^8.0.0 159 + wrangler: ^4.0.0 160 + peerDependenciesMeta: 161 + pg: 162 + optional: true 163 + wrangler: 164 + optional: true 165 + 166 + '@atproto-labs/did-resolver@0.2.6': 167 + resolution: {integrity: sha512-2K1bC04nI2fmgNcvof+yA28IhGlpWn2JKYlPa7To9JTKI45FINCGkQSGiL2nyXlyzDJJ34fZ1aq6/IRFIOIiqg==} 168 + 169 + '@atproto-labs/fetch@0.2.3': 170 + resolution: {integrity: sha512-NZtbJOCbxKUFRFKMpamT38PUQMY0hX0p7TG5AEYOPhZKZEP7dHZ1K2s1aB8MdVH0qxmqX7nQleNrrvLf09Zfdw==} 171 + 172 + '@atproto-labs/handle-resolver@0.3.6': 173 + resolution: {integrity: sha512-qnSTXvOBNj1EHhp2qTWSX8MS5q3AwYU5LKlt5fBvSbCjgmTr2j0URHCv+ydrwO55KvsojIkTMgeMOh4YuY4fCA==} 174 + 175 + '@atproto-labs/identity-resolver@0.3.6': 176 + resolution: {integrity: sha512-qoWqBDRobln0NR8L8dQjSp79E0chGkBhibEgxQa2f9WD+JbJdjQ0YvwwO5yeQn05pJoJmAwmI2wyJ45zjU7aWg==} 177 + 178 + '@atproto-labs/pipe@0.1.1': 179 + resolution: {integrity: sha512-hdNw2oUs2B6BN1lp+32pF7cp8EMKuIN5Qok2Vvv/aOpG/3tNSJ9YkvfI0k6Zd188LeDDYRUpYpxcoFIcGH/FNg==} 180 + 181 + '@atproto-labs/simple-store-memory@0.1.4': 182 + resolution: {integrity: sha512-3mKY4dP8I7yKPFj9VKpYyCRzGJOi5CEpOLPlRhoJyLmgs3J4RzDrjn323Oakjz2Aj2JzRU/AIvWRAZVhpYNJHw==} 183 + 184 + '@atproto-labs/simple-store@0.3.0': 185 + resolution: {integrity: sha512-nOb6ONKBRJHRlukW1sVawUkBqReLlLx6hT35VS3imaNPwiXDxLnTK7lxw3Lrl9k5yugSBDQAkZAq3MPTEFSUBQ==} 186 + 187 + '@atproto/common-web@0.4.21': 188 + resolution: {integrity: sha512-Odq+wdk3YNasGCjjlpl3bCIPvqYHige5DLfMkIffNv/2PI/iIj5ZvAvMvJlJ59OhReKSxtpI0invx5UQPc3+fw==} 189 + 190 + '@atproto/did@0.3.0': 191 + resolution: {integrity: sha512-raUPzUGegtW/6OxwCmM8bhZvuIMzxG5t9oWsth6Tp91Kb5fTnHV2h/KKNF1C82doeA4BdXCErTyg7ISwLbQkzA==} 192 + 193 + '@atproto/jwk-jose@0.1.11': 194 + resolution: {integrity: sha512-i4Fnr2sTBYmMmHXl7NJh8GrCH+tDQEVWrcDMDnV5DjJfkgT17wIqvojIw9SNbSL4Uf0OtfEv6AgG0A+mgh8b5Q==} 195 + 196 + '@atproto/jwk-webcrypto@0.2.0': 197 + resolution: {integrity: sha512-UmgRrrEAkWvxwhlwe30UmDOdTEFidlIzBC7C3cCbeJMcBN1x8B3KH+crXrsTqfWQBG58mXgt8wgSK3Kxs2LhFg==} 198 + 199 + '@atproto/jwk@0.6.0': 200 + resolution: {integrity: sha512-bDoJPvt7TrQVi/rBfBrSSpGykhtIriKxeYCYQTiPRKFfyRhbgpElF0wPXADjIswnbzZdOwbY63az4E/CFVT3Tw==} 201 + 202 + '@atproto/lex-data@0.0.15': 203 + resolution: {integrity: sha512-ZsbGiaM5S3CnGrcTMbDGON3bLZzCi/Mx9UvcMREKSRujnF68eHgMiXxJqvykP7+QpOX6tYCK93axZkuJVhtSEw==} 204 + 205 + '@atproto/lex-json@0.0.16': 206 + resolution: {integrity: sha512-IgLgQ0krshVlrIYZ+heTBDbCnM3LmAgWvsaYn5MxvKA3LcBot3PG3ptdO8VOweVZ+WgCLuo39cz9EbUmIbqdtg==} 207 + 208 + '@atproto/lexicon@0.6.2': 209 + resolution: {integrity: sha512-p3Ly6hinVZW0ETuAXZMeUGwuMm3g8HvQMQ41yyEE6AL0hAkfeKFaZKos6BdBrr6CjkpbrDZqE8M+5+QOceysMw==} 210 + 211 + '@atproto/oauth-client-browser@0.3.42': 212 + resolution: {integrity: sha512-YRNMnZNid+ipBndpKbqZ+1uzb51Ci7Pit56iF2+hBljZkE6MAW/gkGwywJigVPlhkVKCO80PaXt8CHuON5kS8w==} 213 + 214 + '@atproto/oauth-client@0.6.1': 215 + resolution: {integrity: sha512-QTLbEFyv7EJuwJf4A8IZnsylK5wwrzrSsxy0INcZf9zktPVQvgckWhSvbfK8alp60M+rwWfQQAlodcCF4WB78A==} 216 + 217 + '@atproto/oauth-types@0.6.3': 218 + resolution: {integrity: sha512-jdKuoPknJuh/WjI+mYk7agSbx9mNVMbS6Dr3k1z2YMY2oRiCQjxYBuo4MLKATbxj05nMQaZRWlHRUazoAu5Cng==} 219 + 220 + '@atproto/syntax@0.5.4': 221 + resolution: {integrity: sha512-9XJOpMAgsGFxMEIp8nJ8AIWv+krrY1xQMj+wULbbXhQztQV+9aZ0TbG9Jtn3Op2or8Kr6OqyWR4ga9Z189kKDw==} 222 + 223 + '@atproto/xrpc@0.7.7': 224 + resolution: {integrity: sha512-K1ZyO/BU8JNtXX5dmPp7b5UrkLMMqpsIa/Lrj5D3Su+j1Xwq1m6QJ2XJ1AgjEjkI1v4Muzm7klianLE6XGxtmA==} 225 + 226 + '@badrap/valita@0.4.6': 227 + resolution: {integrity: sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==} 228 + engines: {node: '>= 18'} 229 + 230 + '@cloudflare/kv-asset-handler@0.5.0': 231 + resolution: {integrity: sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==} 232 + engines: {node: '>=22.0.0'} 233 + 234 + '@cloudflare/unenv-preset@2.16.1': 235 + resolution: {integrity: sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw==} 236 + peerDependencies: 237 + unenv: 2.0.0-rc.24 238 + workerd: '>1.20260305.0 <2.0.0-0' 239 + peerDependenciesMeta: 240 + workerd: 241 + optional: true 242 + 243 + '@cloudflare/workerd-darwin-64@1.20260508.1': 244 + resolution: {integrity: sha512-IT3r6VgiSwIesL4AJbxjgxvIxwWZqM7BKkhYAzOKHl4GF2M0TxeOahUIXd+CYXVZgHX8ceEg+MXbEehPelJyNg==} 245 + engines: {node: '>=16'} 246 + cpu: [x64] 247 + os: [darwin] 248 + 249 + '@cloudflare/workerd-darwin-arm64@1.20260508.1': 250 + resolution: {integrity: sha512-JTVsisOJPcNKw0qovPjqyBWYahfdhUh7/9NICiG5wxaEQ45PYKdoqNq0hOAAIqvqoxsKZBvTgcPTJREPqk7avA==} 251 + engines: {node: '>=16'} 252 + cpu: [arm64] 253 + os: [darwin] 254 + 255 + '@cloudflare/workerd-linux-64@1.20260508.1': 256 + resolution: {integrity: sha512-zO38pCc27YlsZiPYcaZnosy0/t7abXrRU3VEO1oKfUvnaCpHgphDG+VsrmHL+kntda6hrtNwg2jLeMAqqIjnjw==} 257 + engines: {node: '>=16'} 258 + cpu: [x64] 259 + os: [linux] 260 + 261 + '@cloudflare/workerd-linux-arm64@1.20260508.1': 262 + resolution: {integrity: sha512-XhJa780Ia6MNIrtxn/ruZHS79b9pu5EKPfRNReaUqxy8erPT2fs93axMfFoS9kIkcaRRj/1TOUKcTeAMoywY7w==} 263 + engines: {node: '>=16'} 264 + cpu: [arm64] 265 + os: [linux] 266 + 267 + '@cloudflare/workerd-windows-64@1.20260508.1': 268 + resolution: {integrity: sha512-QdDOK3B/Ul1s3QmIwDrFyx9230to6LsNmWcVR8w+TYjNZuRPzqQBgusp78LO7MlqCoEl9dvIcN00jkJnLtBSfw==} 269 + engines: {node: '>=16'} 270 + cpu: [x64] 271 + os: [win32] 272 + 273 + '@cloudflare/workers-types@4.20260511.1': 274 + resolution: {integrity: sha512-FA+si7cOq9i/gtCHhIc0XJL0l1F/ApF+m00752Aj7WZFJrj3ZulT2T8/+rT3BabMT0QEnqFEGIqCgrmqhgEfMg==} 275 + 276 + '@cspotcode/source-map-support@0.8.1': 277 + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 278 + engines: {node: '>=12'} 279 + 280 + '@emnapi/runtime@1.10.0': 281 + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} 282 + 283 + '@esbuild/aix-ppc64@0.27.3': 284 + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} 285 + engines: {node: '>=18'} 286 + cpu: [ppc64] 287 + os: [aix] 288 + 289 + '@esbuild/aix-ppc64@0.28.0': 290 + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} 291 + engines: {node: '>=18'} 292 + cpu: [ppc64] 293 + os: [aix] 294 + 295 + '@esbuild/android-arm64@0.27.3': 296 + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} 297 + engines: {node: '>=18'} 298 + cpu: [arm64] 299 + os: [android] 300 + 301 + '@esbuild/android-arm64@0.28.0': 302 + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} 303 + engines: {node: '>=18'} 304 + cpu: [arm64] 305 + os: [android] 306 + 307 + '@esbuild/android-arm@0.27.3': 308 + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} 309 + engines: {node: '>=18'} 310 + cpu: [arm] 311 + os: [android] 312 + 313 + '@esbuild/android-arm@0.28.0': 314 + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} 315 + engines: {node: '>=18'} 316 + cpu: [arm] 317 + os: [android] 318 + 319 + '@esbuild/android-x64@0.27.3': 320 + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} 321 + engines: {node: '>=18'} 322 + cpu: [x64] 323 + os: [android] 324 + 325 + '@esbuild/android-x64@0.28.0': 326 + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} 327 + engines: {node: '>=18'} 328 + cpu: [x64] 329 + os: [android] 330 + 331 + '@esbuild/darwin-arm64@0.27.3': 332 + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} 333 + engines: {node: '>=18'} 334 + cpu: [arm64] 335 + os: [darwin] 336 + 337 + '@esbuild/darwin-arm64@0.28.0': 338 + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} 339 + engines: {node: '>=18'} 340 + cpu: [arm64] 341 + os: [darwin] 342 + 343 + '@esbuild/darwin-x64@0.27.3': 344 + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} 345 + engines: {node: '>=18'} 346 + cpu: [x64] 347 + os: [darwin] 348 + 349 + '@esbuild/darwin-x64@0.28.0': 350 + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} 351 + engines: {node: '>=18'} 352 + cpu: [x64] 353 + os: [darwin] 354 + 355 + '@esbuild/freebsd-arm64@0.27.3': 356 + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} 357 + engines: {node: '>=18'} 358 + cpu: [arm64] 359 + os: [freebsd] 360 + 361 + '@esbuild/freebsd-arm64@0.28.0': 362 + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} 363 + engines: {node: '>=18'} 364 + cpu: [arm64] 365 + os: [freebsd] 366 + 367 + '@esbuild/freebsd-x64@0.27.3': 368 + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} 369 + engines: {node: '>=18'} 370 + cpu: [x64] 371 + os: [freebsd] 372 + 373 + '@esbuild/freebsd-x64@0.28.0': 374 + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} 375 + engines: {node: '>=18'} 376 + cpu: [x64] 377 + os: [freebsd] 378 + 379 + '@esbuild/linux-arm64@0.27.3': 380 + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} 381 + engines: {node: '>=18'} 382 + cpu: [arm64] 383 + os: [linux] 384 + 385 + '@esbuild/linux-arm64@0.28.0': 386 + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} 387 + engines: {node: '>=18'} 388 + cpu: [arm64] 389 + os: [linux] 390 + 391 + '@esbuild/linux-arm@0.27.3': 392 + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} 393 + engines: {node: '>=18'} 394 + cpu: [arm] 395 + os: [linux] 396 + 397 + '@esbuild/linux-arm@0.28.0': 398 + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} 399 + engines: {node: '>=18'} 400 + cpu: [arm] 401 + os: [linux] 402 + 403 + '@esbuild/linux-ia32@0.27.3': 404 + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} 405 + engines: {node: '>=18'} 406 + cpu: [ia32] 407 + os: [linux] 408 + 409 + '@esbuild/linux-ia32@0.28.0': 410 + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} 411 + engines: {node: '>=18'} 412 + cpu: [ia32] 413 + os: [linux] 414 + 415 + '@esbuild/linux-loong64@0.27.3': 416 + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} 417 + engines: {node: '>=18'} 418 + cpu: [loong64] 419 + os: [linux] 420 + 421 + '@esbuild/linux-loong64@0.28.0': 422 + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} 423 + engines: {node: '>=18'} 424 + cpu: [loong64] 425 + os: [linux] 426 + 427 + '@esbuild/linux-mips64el@0.27.3': 428 + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} 429 + engines: {node: '>=18'} 430 + cpu: [mips64el] 431 + os: [linux] 432 + 433 + '@esbuild/linux-mips64el@0.28.0': 434 + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} 435 + engines: {node: '>=18'} 436 + cpu: [mips64el] 437 + os: [linux] 438 + 439 + '@esbuild/linux-ppc64@0.27.3': 440 + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} 441 + engines: {node: '>=18'} 442 + cpu: [ppc64] 443 + os: [linux] 444 + 445 + '@esbuild/linux-ppc64@0.28.0': 446 + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} 447 + engines: {node: '>=18'} 448 + cpu: [ppc64] 449 + os: [linux] 450 + 451 + '@esbuild/linux-riscv64@0.27.3': 452 + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} 453 + engines: {node: '>=18'} 454 + cpu: [riscv64] 455 + os: [linux] 456 + 457 + '@esbuild/linux-riscv64@0.28.0': 458 + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} 459 + engines: {node: '>=18'} 460 + cpu: [riscv64] 461 + os: [linux] 462 + 463 + '@esbuild/linux-s390x@0.27.3': 464 + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} 465 + engines: {node: '>=18'} 466 + cpu: [s390x] 467 + os: [linux] 468 + 469 + '@esbuild/linux-s390x@0.28.0': 470 + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} 471 + engines: {node: '>=18'} 472 + cpu: [s390x] 473 + os: [linux] 474 + 475 + '@esbuild/linux-x64@0.27.3': 476 + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} 477 + engines: {node: '>=18'} 478 + cpu: [x64] 479 + os: [linux] 480 + 481 + '@esbuild/linux-x64@0.28.0': 482 + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} 483 + engines: {node: '>=18'} 484 + cpu: [x64] 485 + os: [linux] 486 + 487 + '@esbuild/netbsd-arm64@0.27.3': 488 + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} 489 + engines: {node: '>=18'} 490 + cpu: [arm64] 491 + os: [netbsd] 492 + 493 + '@esbuild/netbsd-arm64@0.28.0': 494 + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} 495 + engines: {node: '>=18'} 496 + cpu: [arm64] 497 + os: [netbsd] 498 + 499 + '@esbuild/netbsd-x64@0.27.3': 500 + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} 501 + engines: {node: '>=18'} 502 + cpu: [x64] 503 + os: [netbsd] 504 + 505 + '@esbuild/netbsd-x64@0.28.0': 506 + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} 507 + engines: {node: '>=18'} 508 + cpu: [x64] 509 + os: [netbsd] 510 + 511 + '@esbuild/openbsd-arm64@0.27.3': 512 + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} 513 + engines: {node: '>=18'} 514 + cpu: [arm64] 515 + os: [openbsd] 516 + 517 + '@esbuild/openbsd-arm64@0.28.0': 518 + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} 519 + engines: {node: '>=18'} 520 + cpu: [arm64] 521 + os: [openbsd] 522 + 523 + '@esbuild/openbsd-x64@0.27.3': 524 + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} 525 + engines: {node: '>=18'} 526 + cpu: [x64] 527 + os: [openbsd] 528 + 529 + '@esbuild/openbsd-x64@0.28.0': 530 + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} 531 + engines: {node: '>=18'} 532 + cpu: [x64] 533 + os: [openbsd] 534 + 535 + '@esbuild/openharmony-arm64@0.27.3': 536 + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} 537 + engines: {node: '>=18'} 538 + cpu: [arm64] 539 + os: [openharmony] 540 + 541 + '@esbuild/openharmony-arm64@0.28.0': 542 + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} 543 + engines: {node: '>=18'} 544 + cpu: [arm64] 545 + os: [openharmony] 546 + 547 + '@esbuild/sunos-x64@0.27.3': 548 + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} 549 + engines: {node: '>=18'} 550 + cpu: [x64] 551 + os: [sunos] 552 + 553 + '@esbuild/sunos-x64@0.28.0': 554 + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} 555 + engines: {node: '>=18'} 556 + cpu: [x64] 557 + os: [sunos] 558 + 559 + '@esbuild/win32-arm64@0.27.3': 560 + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} 561 + engines: {node: '>=18'} 562 + cpu: [arm64] 563 + os: [win32] 564 + 565 + '@esbuild/win32-arm64@0.28.0': 566 + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} 567 + engines: {node: '>=18'} 568 + cpu: [arm64] 569 + os: [win32] 570 + 571 + '@esbuild/win32-ia32@0.27.3': 572 + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} 573 + engines: {node: '>=18'} 574 + cpu: [ia32] 575 + os: [win32] 576 + 577 + '@esbuild/win32-ia32@0.28.0': 578 + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} 579 + engines: {node: '>=18'} 580 + cpu: [ia32] 581 + os: [win32] 582 + 583 + '@esbuild/win32-x64@0.27.3': 584 + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} 585 + engines: {node: '>=18'} 586 + cpu: [x64] 587 + os: [win32] 588 + 589 + '@esbuild/win32-x64@0.28.0': 590 + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} 591 + engines: {node: '>=18'} 592 + cpu: [x64] 593 + os: [win32] 594 + 595 + '@img/colour@1.1.0': 596 + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} 597 + engines: {node: '>=18'} 598 + 599 + '@img/sharp-darwin-arm64@0.34.5': 600 + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} 601 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 602 + cpu: [arm64] 603 + os: [darwin] 604 + 605 + '@img/sharp-darwin-x64@0.34.5': 606 + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} 607 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 608 + cpu: [x64] 609 + os: [darwin] 610 + 611 + '@img/sharp-libvips-darwin-arm64@1.2.4': 612 + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} 613 + cpu: [arm64] 614 + os: [darwin] 615 + 616 + '@img/sharp-libvips-darwin-x64@1.2.4': 617 + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} 618 + cpu: [x64] 619 + os: [darwin] 620 + 621 + '@img/sharp-libvips-linux-arm64@1.2.4': 622 + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} 623 + cpu: [arm64] 624 + os: [linux] 625 + libc: [glibc] 626 + 627 + '@img/sharp-libvips-linux-arm@1.2.4': 628 + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} 629 + cpu: [arm] 630 + os: [linux] 631 + libc: [glibc] 632 + 633 + '@img/sharp-libvips-linux-ppc64@1.2.4': 634 + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} 635 + cpu: [ppc64] 636 + os: [linux] 637 + libc: [glibc] 638 + 639 + '@img/sharp-libvips-linux-riscv64@1.2.4': 640 + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} 641 + cpu: [riscv64] 642 + os: [linux] 643 + libc: [glibc] 644 + 645 + '@img/sharp-libvips-linux-s390x@1.2.4': 646 + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} 647 + cpu: [s390x] 648 + os: [linux] 649 + libc: [glibc] 650 + 651 + '@img/sharp-libvips-linux-x64@1.2.4': 652 + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} 653 + cpu: [x64] 654 + os: [linux] 655 + libc: [glibc] 656 + 657 + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': 658 + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} 659 + cpu: [arm64] 660 + os: [linux] 661 + libc: [musl] 662 + 663 + '@img/sharp-libvips-linuxmusl-x64@1.2.4': 664 + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} 665 + cpu: [x64] 666 + os: [linux] 667 + libc: [musl] 668 + 669 + '@img/sharp-linux-arm64@0.34.5': 670 + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} 671 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 672 + cpu: [arm64] 673 + os: [linux] 674 + libc: [glibc] 675 + 676 + '@img/sharp-linux-arm@0.34.5': 677 + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} 678 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 679 + cpu: [arm] 680 + os: [linux] 681 + libc: [glibc] 682 + 683 + '@img/sharp-linux-ppc64@0.34.5': 684 + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} 685 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 686 + cpu: [ppc64] 687 + os: [linux] 688 + libc: [glibc] 689 + 690 + '@img/sharp-linux-riscv64@0.34.5': 691 + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} 692 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 693 + cpu: [riscv64] 694 + os: [linux] 695 + libc: [glibc] 696 + 697 + '@img/sharp-linux-s390x@0.34.5': 698 + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} 699 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 700 + cpu: [s390x] 701 + os: [linux] 702 + libc: [glibc] 703 + 704 + '@img/sharp-linux-x64@0.34.5': 705 + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} 706 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 707 + cpu: [x64] 708 + os: [linux] 709 + libc: [glibc] 710 + 711 + '@img/sharp-linuxmusl-arm64@0.34.5': 712 + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} 713 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 714 + cpu: [arm64] 715 + os: [linux] 716 + libc: [musl] 717 + 718 + '@img/sharp-linuxmusl-x64@0.34.5': 719 + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} 720 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 721 + cpu: [x64] 722 + os: [linux] 723 + libc: [musl] 724 + 725 + '@img/sharp-wasm32@0.34.5': 726 + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} 727 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 728 + cpu: [wasm32] 729 + 730 + '@img/sharp-win32-arm64@0.34.5': 731 + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} 732 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 733 + cpu: [arm64] 734 + os: [win32] 735 + 736 + '@img/sharp-win32-ia32@0.34.5': 737 + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} 738 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 739 + cpu: [ia32] 740 + os: [win32] 741 + 742 + '@img/sharp-win32-x64@0.34.5': 743 + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} 744 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 745 + cpu: [x64] 746 + os: [win32] 747 + 748 + '@jridgewell/resolve-uri@3.1.2': 749 + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 750 + engines: {node: '>=6.0.0'} 751 + 752 + '@jridgewell/sourcemap-codec@1.5.5': 753 + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 754 + 755 + '@jridgewell/trace-mapping@0.3.9': 756 + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 757 + 758 + '@mary-ext/event-iterator@1.0.0': 759 + resolution: {integrity: sha512-l6gCPsWJ8aRCe/s7/oCmero70kDHgIK5m4uJvYgwEYTqVxoBOIXbKr5tnkLqUHEg6mNduB4IWvms3h70Hp9ADQ==} 760 + 761 + '@mary-ext/simple-event-emitter@1.0.1': 762 + resolution: {integrity: sha512-9+VvZisxZ/gSg+JJH7hmXaA8Qj42Qjz3O58RSB+INYc8iLA0icATZxHB9vKbj59ojDGZjO3hCKzMXocx3L0H8w==} 763 + 764 + '@noble/secp256k1@3.1.0': 765 + resolution: {integrity: sha512-+F7iS7tUMaNGXcc9X3PjmjvuQnXEuSjCRNzVVA2xAcKXgCaP0dHYz4SFyt4FKNHef7sOP//xihowcySSS7PK9g==} 766 + 767 + '@optique/core@1.0.2': 768 + resolution: {integrity: sha512-znsqMmjAdeOgSJzdJlpZpgAscojwQmeQYXzYnuEKllz5VCj6WyEkdzU4QuvJQtWQY3ve2taXwudEBRur0VHBOQ==} 769 + engines: {bun: '>=1.2.0', deno: '>=2.3.0', node: '>=20.0.0'} 770 + 771 + '@optique/run@1.0.2': 772 + resolution: {integrity: sha512-0Wc+zC8SLGV8zXQX+pk+o0c6wE/ddx/36CHZ0toTh5lApsjruUuGhqbxvljerAAG5un1xQbOLxzksBVC6UPgSg==} 773 + engines: {bun: '>=1.2.0', deno: '>=2.3.0', node: '>=20.0.0'} 774 + 775 + '@poppinss/colors@4.1.6': 776 + resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} 777 + 778 + '@poppinss/dumper@0.6.5': 779 + resolution: {integrity: sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==} 780 + 781 + '@poppinss/exception@1.2.3': 782 + resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} 783 + 784 + '@sindresorhus/is@7.2.0': 785 + resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} 786 + engines: {node: '>=18'} 787 + 788 + '@speed-highlight/core@1.2.15': 789 + resolution: {integrity: sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw==} 790 + 791 + '@standard-schema/spec@1.1.0': 792 + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} 793 + 794 + blake3-wasm@2.1.5: 795 + resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} 796 + 797 + cac@7.0.0: 798 + resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} 799 + engines: {node: '>=20.19.0'} 800 + 801 + cookie@1.1.1: 802 + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} 803 + engines: {node: '>=18'} 804 + 805 + core-js@3.49.0: 806 + resolution: {integrity: sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==} 807 + 808 + detect-libc@2.1.2: 809 + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} 810 + engines: {node: '>=8'} 811 + 812 + error-stack-parser-es@1.0.5: 813 + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} 814 + 815 + esbuild@0.27.3: 816 + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} 817 + engines: {node: '>=18'} 818 + hasBin: true 819 + 820 + esbuild@0.28.0: 821 + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} 822 + engines: {node: '>=18'} 823 + hasBin: true 824 + 825 + esm-env@1.2.2: 826 + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} 827 + 828 + event-target-polyfill@0.0.4: 829 + resolution: {integrity: sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ==} 830 + 831 + fsevents@2.3.3: 832 + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 833 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 834 + os: [darwin] 835 + 836 + hono@4.12.18: 837 + resolution: {integrity: sha512-RWzP96k/yv0PQfyXnWjs6zot20TqfpfsNXhOnev8d1InAxubW93L11/oNUc3tQqn2G0bSdAOBpX+2uDFHV7kdQ==} 838 + engines: {node: '>=16.9.0'} 839 + 840 + iso-datestring-validator@2.2.2: 841 + resolution: {integrity: sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==} 842 + 843 + jiti@2.7.0: 844 + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} 845 + hasBin: true 846 + 847 + jose@5.10.0: 848 + resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} 849 + 850 + kleur@4.1.5: 851 + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 852 + engines: {node: '>=6'} 853 + 854 + lru-cache@10.4.3: 855 + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 856 + 857 + miniflare@4.20260508.0: 858 + resolution: {integrity: sha512-h3aG+PA8jEH76V4ZtBAbs3g7kjMfHJUF8hPvxeeajLTKwir+G+dqfBODg5yF9MT29LqrZKCRQRqzfHPWX4kCIg==} 859 + engines: {node: '>=22.0.0'} 860 + hasBin: true 861 + 862 + multiformats@9.9.0: 863 + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} 864 + 865 + nanoid@5.1.11: 866 + resolution: {integrity: sha512-v+KEsUv2ps74PaSKv0gHTxTCgMXOIfBEbaqa6w6ISIGC7ZsvHN4N9oJ8d4cmf0n5oTzQz2SLmThbQWhjd/8eKg==} 867 + engines: {node: ^18 || >=20} 868 + hasBin: true 869 + 870 + partysocket@1.1.19: 871 + resolution: {integrity: sha512-hPwsXSdUc8PKNCinET6TD3JQOxzQ2JaP0bUZQXBVl6UM8UuLn1odgf1LcJXHy4UHSQwWL/RU3AnyhEsGM+W+sg==} 872 + peerDependencies: 873 + react: '>=17' 874 + peerDependenciesMeta: 875 + react: 876 + optional: true 877 + 878 + path-to-regexp@6.3.0: 879 + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} 880 + 881 + pathe@2.0.3: 882 + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 883 + 884 + picocolors@1.1.1: 885 + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 886 + 887 + prettier@3.8.3: 888 + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} 889 + engines: {node: '>=14'} 890 + hasBin: true 891 + 892 + semver@7.8.0: 893 + resolution: {integrity: sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==} 894 + engines: {node: '>=10'} 895 + hasBin: true 896 + 897 + sharp@0.34.5: 898 + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} 899 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 900 + 901 + supports-color@10.2.2: 902 + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} 903 + engines: {node: '>=18'} 904 + 905 + tslib@2.8.1: 906 + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 907 + 908 + type-fest@4.41.0: 909 + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} 910 + engines: {node: '>=16'} 911 + 912 + typescript@5.9.3: 913 + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 914 + engines: {node: '>=14.17'} 915 + hasBin: true 916 + 917 + uint8arrays@3.0.0: 918 + resolution: {integrity: sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==} 919 + 920 + undici@7.24.8: 921 + resolution: {integrity: sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ==} 922 + engines: {node: '>=20.18.1'} 923 + 924 + unenv@2.0.0-rc.24: 925 + resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} 926 + 927 + unicode-segmenter@0.14.5: 928 + resolution: {integrity: sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==} 929 + 930 + workerd@1.20260508.1: 931 + resolution: {integrity: sha512-VlnjyH3AjVddpSK7J54nsCVgf8i2733pl8GjKttfNi7vN/hEjjAk20d2b1nDToOLKvRQpTewRnVkqaaeGHCaAw==} 932 + engines: {node: '>=16'} 933 + hasBin: true 934 + 935 + wrangler@4.90.1: 936 + resolution: {integrity: sha512-u2KrieKSMfRM0toTst/CfDtcRraeoVjmcExcMWgILM/ytq3qcDhuOAULoZSyPHzma43lfLJy1BC544drFyqe1A==} 937 + engines: {node: '>=22.0.0'} 938 + hasBin: true 939 + peerDependencies: 940 + '@cloudflare/workers-types': ^4.20260508.1 941 + peerDependenciesMeta: 942 + '@cloudflare/workers-types': 943 + optional: true 944 + 945 + ws@8.18.0: 946 + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} 947 + engines: {node: '>=10.0.0'} 948 + peerDependencies: 949 + bufferutil: ^4.0.1 950 + utf-8-validate: '>=5.0.2' 951 + peerDependenciesMeta: 952 + bufferutil: 953 + optional: true 954 + utf-8-validate: 955 + optional: true 956 + 957 + yocto-queue@1.2.2: 958 + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} 959 + engines: {node: '>=12.20'} 960 + 961 + youch-core@0.3.3: 962 + resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} 963 + 964 + youch@4.1.0-beta.10: 965 + resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} 966 + 967 + zod@3.25.76: 968 + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} 969 + 970 + snapshots: 971 + 972 + '@atcute/atproto@3.1.12(@atcute/lexicons@1.3.1)': 973 + dependencies: 974 + '@atcute/lexicons': 1.3.1 975 + 976 + '@atcute/atproto@4.0.0(@atcute/lexicons@2.0.0)': 977 + dependencies: 978 + '@atcute/lexicons': 2.0.0 979 + 980 + '@atcute/car@5.1.2(@atcute/cbor@2.3.3(@atcute/cid@2.4.1))(@atcute/cid@2.4.1)': 981 + dependencies: 982 + '@atcute/cbor': 2.3.3(@atcute/cid@2.4.1) 983 + '@atcute/cid': 2.4.1 984 + '@atcute/uint8array': 1.1.2 985 + '@atcute/varint': 2.0.0 986 + 987 + '@atcute/cbor@2.3.3(@atcute/cid@2.4.1)': 988 + dependencies: 989 + '@atcute/cid': 2.4.1 990 + '@atcute/multibase': 1.2.0 991 + '@atcute/uint8array': 1.1.2 992 + 993 + '@atcute/cid@2.4.1': 994 + dependencies: 995 + '@atcute/multibase': 1.2.0 996 + '@atcute/uint8array': 1.1.2 997 + 998 + '@atcute/client@4.2.2(@atcute/lexicons@1.3.1)': 999 + dependencies: 1000 + '@atcute/identity': 1.1.5(@atcute/lexicons@1.3.1) 1001 + '@atcute/lexicons': 1.3.1 1002 + 1003 + '@atcute/crypto@2.4.1': 1004 + dependencies: 1005 + '@atcute/multibase': 1.2.0 1006 + '@atcute/uint8array': 1.1.2 1007 + '@noble/secp256k1': 3.1.0 1008 + 1009 + '@atcute/identity-resolver@1.2.3(@atcute/identity@1.1.5(@atcute/lexicons@2.0.0))(@atcute/lexicons@1.3.1)': 1010 + dependencies: 1011 + '@atcute/identity': 1.1.5(@atcute/lexicons@2.0.0) 1012 + '@atcute/lexicons': 1.3.1 1013 + '@atcute/util-fetch': 1.0.5 1014 + '@badrap/valita': 0.4.6 1015 + 1016 + '@atcute/identity@1.1.5(@atcute/lexicons@1.3.1)': 1017 + dependencies: 1018 + '@atcute/lexicons': 1.3.1 1019 + '@badrap/valita': 0.4.6 1020 + 1021 + '@atcute/identity@1.1.5(@atcute/lexicons@2.0.0)': 1022 + dependencies: 1023 + '@atcute/lexicons': 2.0.0 1024 + '@badrap/valita': 0.4.6 1025 + 1026 + '@atcute/jetstream@1.1.3(@atcute/lexicons@1.3.1)': 1027 + dependencies: 1028 + '@atcute/lexicons': 1.3.1 1029 + '@badrap/valita': 0.4.6 1030 + '@mary-ext/event-iterator': 1.0.0 1031 + '@mary-ext/simple-event-emitter': 1.0.1 1032 + partysocket: 1.1.19 1033 + type-fest: 4.41.0 1034 + transitivePeerDependencies: 1035 + - react 1036 + 1037 + '@atcute/lex-cli@2.8.2(@atcute/cbor@2.3.3(@atcute/cid@2.4.1))(@atcute/cid@2.4.1)': 1038 + dependencies: 1039 + '@atcute/identity': 1.1.5(@atcute/lexicons@1.3.1) 1040 + '@atcute/identity-resolver': 1.2.3(@atcute/identity@1.1.5(@atcute/lexicons@2.0.0))(@atcute/lexicons@1.3.1) 1041 + '@atcute/lexicon-doc': 2.2.1(@atcute/lexicons@1.3.1) 1042 + '@atcute/lexicon-resolver': 0.1.7(@atcute/cbor@2.3.3(@atcute/cid@2.4.1))(@atcute/cid@2.4.1)(@atcute/identity-resolver@1.2.3(@atcute/identity@1.1.5(@atcute/lexicons@2.0.0))(@atcute/lexicons@2.0.0))(@atcute/identity@1.1.5(@atcute/lexicons@2.0.0))(@atcute/lexicon-doc@2.2.1(@atcute/lexicons@2.0.0))(@atcute/lexicons@1.3.1) 1043 + '@atcute/lexicons': 1.3.1 1044 + '@badrap/valita': 0.4.6 1045 + '@optique/core': 1.0.2 1046 + '@optique/run': 1.0.2 1047 + picocolors: 1.1.1 1048 + prettier: 3.8.3 1049 + transitivePeerDependencies: 1050 + - '@atcute/cbor' 1051 + - '@atcute/cid' 1052 + 1053 + '@atcute/lexicon-doc@2.2.1(@atcute/lexicons@1.3.1)': 1054 + dependencies: 1055 + '@atcute/identity': 1.1.5(@atcute/lexicons@1.3.1) 1056 + '@atcute/lexicons': 1.3.1 1057 + '@atcute/uint8array': 1.1.2 1058 + '@atcute/util-text': 1.3.1 1059 + '@badrap/valita': 0.4.6 1060 + 1061 + '@atcute/lexicon-resolver@0.1.7(@atcute/cbor@2.3.3(@atcute/cid@2.4.1))(@atcute/cid@2.4.1)(@atcute/identity-resolver@1.2.3(@atcute/identity@1.1.5(@atcute/lexicons@2.0.0))(@atcute/lexicons@2.0.0))(@atcute/identity@1.1.5(@atcute/lexicons@2.0.0))(@atcute/lexicon-doc@2.2.1(@atcute/lexicons@2.0.0))(@atcute/lexicons@1.3.1)': 1062 + dependencies: 1063 + '@atcute/crypto': 2.4.1 1064 + '@atcute/identity': 1.1.5(@atcute/lexicons@2.0.0) 1065 + '@atcute/identity-resolver': 1.2.3(@atcute/identity@1.1.5(@atcute/lexicons@2.0.0))(@atcute/lexicons@1.3.1) 1066 + '@atcute/lexicon-doc': 2.2.1(@atcute/lexicons@1.3.1) 1067 + '@atcute/lexicons': 1.3.1 1068 + '@atcute/repo': 0.1.5(@atcute/cbor@2.3.3(@atcute/cid@2.4.1))(@atcute/cid@2.4.1)(@atcute/lexicons@1.3.1) 1069 + '@atcute/util-fetch': 1.0.5 1070 + '@badrap/valita': 0.4.6 1071 + transitivePeerDependencies: 1072 + - '@atcute/cbor' 1073 + - '@atcute/cid' 1074 + 1075 + '@atcute/lexicons@1.3.1': 1076 + dependencies: 1077 + '@atcute/uint8array': 1.1.2 1078 + '@atcute/util-text': 1.3.1 1079 + '@standard-schema/spec': 1.1.0 1080 + esm-env: 1.2.2 1081 + 1082 + '@atcute/lexicons@2.0.0': 1083 + dependencies: 1084 + '@atcute/uint8array': 1.1.2 1085 + '@atcute/util-text': 1.3.1 1086 + '@standard-schema/spec': 1.1.0 1087 + esm-env: 1.2.2 1088 + 1089 + '@atcute/mst@1.0.1(@atcute/cbor@2.3.3(@atcute/cid@2.4.1))(@atcute/cid@2.4.1)': 1090 + dependencies: 1091 + '@atcute/cbor': 2.3.3(@atcute/cid@2.4.1) 1092 + '@atcute/cid': 2.4.1 1093 + '@atcute/uint8array': 1.1.2 1094 + 1095 + '@atcute/multibase@1.2.0': 1096 + dependencies: 1097 + '@atcute/uint8array': 1.1.2 1098 + 1099 + '@atcute/repo@0.1.5(@atcute/cbor@2.3.3(@atcute/cid@2.4.1))(@atcute/cid@2.4.1)(@atcute/lexicons@1.3.1)': 1100 + dependencies: 1101 + '@atcute/car': 5.1.2(@atcute/cbor@2.3.3(@atcute/cid@2.4.1))(@atcute/cid@2.4.1) 1102 + '@atcute/cbor': 2.3.3(@atcute/cid@2.4.1) 1103 + '@atcute/cid': 2.4.1 1104 + '@atcute/crypto': 2.4.1 1105 + '@atcute/lexicons': 1.3.1 1106 + '@atcute/mst': 1.0.1(@atcute/cbor@2.3.3(@atcute/cid@2.4.1))(@atcute/cid@2.4.1) 1107 + '@atcute/uint8array': 1.1.2 1108 + 1109 + '@atcute/uint8array@1.1.2': {} 1110 + 1111 + '@atcute/util-fetch@1.0.5': 1112 + dependencies: 1113 + '@badrap/valita': 0.4.6 1114 + 1115 + '@atcute/util-text@1.3.1': 1116 + dependencies: 1117 + unicode-segmenter: 0.14.5 1118 + 1119 + '@atcute/varint@2.0.0': {} 1120 + 1121 + '@atcute/xrpc-server@0.1.12(@atcute/cid@2.4.1)': 1122 + dependencies: 1123 + '@atcute/cbor': 2.3.3(@atcute/cid@2.4.1) 1124 + '@atcute/crypto': 2.4.1 1125 + '@atcute/identity': 1.1.5(@atcute/lexicons@1.3.1) 1126 + '@atcute/identity-resolver': 1.2.3(@atcute/identity@1.1.5(@atcute/lexicons@2.0.0))(@atcute/lexicons@1.3.1) 1127 + '@atcute/lexicons': 1.3.1 1128 + '@atcute/multibase': 1.2.0 1129 + '@atcute/uint8array': 1.1.2 1130 + '@badrap/valita': 0.4.6 1131 + nanoid: 5.1.11 1132 + transitivePeerDependencies: 1133 + - '@atcute/cid' 1134 + 1135 + '@atmo-dev/contrail-lexicons@0.4.6(@atcute/cbor@2.3.3(@atcute/cid@2.4.1))(@atcute/cid@2.4.1)(wrangler@4.90.1(@cloudflare/workers-types@4.20260511.1))': 1136 + dependencies: 1137 + '@atcute/lex-cli': 2.8.2(@atcute/cbor@2.3.3(@atcute/cid@2.4.1))(@atcute/cid@2.4.1) 1138 + '@atmo-dev/contrail': 0.6.0(wrangler@4.90.1(@cloudflare/workers-types@4.20260511.1)) 1139 + transitivePeerDependencies: 1140 + - '@atcute/cbor' 1141 + - '@atcute/cid' 1142 + - pg 1143 + - react 1144 + - wrangler 1145 + 1146 + '@atmo-dev/contrail@0.6.0(wrangler@4.90.1(@cloudflare/workers-types@4.20260511.1))': 1147 + dependencies: 1148 + '@atcute/atproto': 3.1.12(@atcute/lexicons@1.3.1) 1149 + '@atcute/cbor': 2.3.3(@atcute/cid@2.4.1) 1150 + '@atcute/cid': 2.4.1 1151 + '@atcute/client': 4.2.2(@atcute/lexicons@1.3.1) 1152 + '@atcute/identity': 1.1.5(@atcute/lexicons@1.3.1) 1153 + '@atcute/identity-resolver': 1.2.3(@atcute/identity@1.1.5(@atcute/lexicons@2.0.0))(@atcute/lexicons@1.3.1) 1154 + '@atcute/jetstream': 1.1.3(@atcute/lexicons@1.3.1) 1155 + '@atcute/lexicons': 1.3.1 1156 + '@atcute/xrpc-server': 0.1.12(@atcute/cid@2.4.1) 1157 + cac: 7.0.0 1158 + hono: 4.12.18 1159 + jiti: 2.7.0 1160 + optionalDependencies: 1161 + wrangler: 4.90.1(@cloudflare/workers-types@4.20260511.1) 1162 + transitivePeerDependencies: 1163 + - react 1164 + 1165 + '@atproto-labs/did-resolver@0.2.6': 1166 + dependencies: 1167 + '@atproto-labs/fetch': 0.2.3 1168 + '@atproto-labs/pipe': 0.1.1 1169 + '@atproto-labs/simple-store': 0.3.0 1170 + '@atproto-labs/simple-store-memory': 0.1.4 1171 + '@atproto/did': 0.3.0 1172 + zod: 3.25.76 1173 + 1174 + '@atproto-labs/fetch@0.2.3': 1175 + dependencies: 1176 + '@atproto-labs/pipe': 0.1.1 1177 + 1178 + '@atproto-labs/handle-resolver@0.3.6': 1179 + dependencies: 1180 + '@atproto-labs/simple-store': 0.3.0 1181 + '@atproto-labs/simple-store-memory': 0.1.4 1182 + '@atproto/did': 0.3.0 1183 + zod: 3.25.76 1184 + 1185 + '@atproto-labs/identity-resolver@0.3.6': 1186 + dependencies: 1187 + '@atproto-labs/did-resolver': 0.2.6 1188 + '@atproto-labs/handle-resolver': 0.3.6 1189 + 1190 + '@atproto-labs/pipe@0.1.1': {} 1191 + 1192 + '@atproto-labs/simple-store-memory@0.1.4': 1193 + dependencies: 1194 + '@atproto-labs/simple-store': 0.3.0 1195 + lru-cache: 10.4.3 1196 + 1197 + '@atproto-labs/simple-store@0.3.0': {} 1198 + 1199 + '@atproto/common-web@0.4.21': 1200 + dependencies: 1201 + '@atproto/lex-data': 0.0.15 1202 + '@atproto/lex-json': 0.0.16 1203 + '@atproto/syntax': 0.5.4 1204 + zod: 3.25.76 1205 + 1206 + '@atproto/did@0.3.0': 1207 + dependencies: 1208 + zod: 3.25.76 1209 + 1210 + '@atproto/jwk-jose@0.1.11': 1211 + dependencies: 1212 + '@atproto/jwk': 0.6.0 1213 + jose: 5.10.0 1214 + 1215 + '@atproto/jwk-webcrypto@0.2.0': 1216 + dependencies: 1217 + '@atproto/jwk': 0.6.0 1218 + '@atproto/jwk-jose': 0.1.11 1219 + zod: 3.25.76 1220 + 1221 + '@atproto/jwk@0.6.0': 1222 + dependencies: 1223 + multiformats: 9.9.0 1224 + zod: 3.25.76 1225 + 1226 + '@atproto/lex-data@0.0.15': 1227 + dependencies: 1228 + multiformats: 9.9.0 1229 + tslib: 2.8.1 1230 + uint8arrays: 3.0.0 1231 + unicode-segmenter: 0.14.5 1232 + 1233 + '@atproto/lex-json@0.0.16': 1234 + dependencies: 1235 + '@atproto/lex-data': 0.0.15 1236 + tslib: 2.8.1 1237 + 1238 + '@atproto/lexicon@0.6.2': 1239 + dependencies: 1240 + '@atproto/common-web': 0.4.21 1241 + '@atproto/syntax': 0.5.4 1242 + iso-datestring-validator: 2.2.2 1243 + multiformats: 9.9.0 1244 + zod: 3.25.76 1245 + 1246 + '@atproto/oauth-client-browser@0.3.42': 1247 + dependencies: 1248 + '@atproto-labs/did-resolver': 0.2.6 1249 + '@atproto-labs/handle-resolver': 0.3.6 1250 + '@atproto-labs/simple-store': 0.3.0 1251 + '@atproto/did': 0.3.0 1252 + '@atproto/jwk': 0.6.0 1253 + '@atproto/jwk-webcrypto': 0.2.0 1254 + '@atproto/oauth-client': 0.6.1 1255 + '@atproto/oauth-types': 0.6.3 1256 + core-js: 3.49.0 1257 + 1258 + '@atproto/oauth-client@0.6.1': 1259 + dependencies: 1260 + '@atproto-labs/did-resolver': 0.2.6 1261 + '@atproto-labs/fetch': 0.2.3 1262 + '@atproto-labs/handle-resolver': 0.3.6 1263 + '@atproto-labs/identity-resolver': 0.3.6 1264 + '@atproto-labs/simple-store': 0.3.0 1265 + '@atproto-labs/simple-store-memory': 0.1.4 1266 + '@atproto/did': 0.3.0 1267 + '@atproto/jwk': 0.6.0 1268 + '@atproto/oauth-types': 0.6.3 1269 + '@atproto/xrpc': 0.7.7 1270 + core-js: 3.49.0 1271 + multiformats: 9.9.0 1272 + zod: 3.25.76 1273 + 1274 + '@atproto/oauth-types@0.6.3': 1275 + dependencies: 1276 + '@atproto/did': 0.3.0 1277 + '@atproto/jwk': 0.6.0 1278 + zod: 3.25.76 1279 + 1280 + '@atproto/syntax@0.5.4': 1281 + dependencies: 1282 + tslib: 2.8.1 1283 + 1284 + '@atproto/xrpc@0.7.7': 1285 + dependencies: 1286 + '@atproto/lexicon': 0.6.2 1287 + zod: 3.25.76 1288 + 1289 + '@badrap/valita@0.4.6': {} 1290 + 1291 + '@cloudflare/kv-asset-handler@0.5.0': {} 1292 + 1293 + '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260508.1)': 1294 + dependencies: 1295 + unenv: 2.0.0-rc.24 1296 + optionalDependencies: 1297 + workerd: 1.20260508.1 1298 + 1299 + '@cloudflare/workerd-darwin-64@1.20260508.1': 1300 + optional: true 1301 + 1302 + '@cloudflare/workerd-darwin-arm64@1.20260508.1': 1303 + optional: true 1304 + 1305 + '@cloudflare/workerd-linux-64@1.20260508.1': 1306 + optional: true 1307 + 1308 + '@cloudflare/workerd-linux-arm64@1.20260508.1': 1309 + optional: true 1310 + 1311 + '@cloudflare/workerd-windows-64@1.20260508.1': 1312 + optional: true 1313 + 1314 + '@cloudflare/workers-types@4.20260511.1': {} 1315 + 1316 + '@cspotcode/source-map-support@0.8.1': 1317 + dependencies: 1318 + '@jridgewell/trace-mapping': 0.3.9 1319 + 1320 + '@emnapi/runtime@1.10.0': 1321 + dependencies: 1322 + tslib: 2.8.1 1323 + optional: true 1324 + 1325 + '@esbuild/aix-ppc64@0.27.3': 1326 + optional: true 1327 + 1328 + '@esbuild/aix-ppc64@0.28.0': 1329 + optional: true 1330 + 1331 + '@esbuild/android-arm64@0.27.3': 1332 + optional: true 1333 + 1334 + '@esbuild/android-arm64@0.28.0': 1335 + optional: true 1336 + 1337 + '@esbuild/android-arm@0.27.3': 1338 + optional: true 1339 + 1340 + '@esbuild/android-arm@0.28.0': 1341 + optional: true 1342 + 1343 + '@esbuild/android-x64@0.27.3': 1344 + optional: true 1345 + 1346 + '@esbuild/android-x64@0.28.0': 1347 + optional: true 1348 + 1349 + '@esbuild/darwin-arm64@0.27.3': 1350 + optional: true 1351 + 1352 + '@esbuild/darwin-arm64@0.28.0': 1353 + optional: true 1354 + 1355 + '@esbuild/darwin-x64@0.27.3': 1356 + optional: true 1357 + 1358 + '@esbuild/darwin-x64@0.28.0': 1359 + optional: true 1360 + 1361 + '@esbuild/freebsd-arm64@0.27.3': 1362 + optional: true 1363 + 1364 + '@esbuild/freebsd-arm64@0.28.0': 1365 + optional: true 1366 + 1367 + '@esbuild/freebsd-x64@0.27.3': 1368 + optional: true 1369 + 1370 + '@esbuild/freebsd-x64@0.28.0': 1371 + optional: true 1372 + 1373 + '@esbuild/linux-arm64@0.27.3': 1374 + optional: true 1375 + 1376 + '@esbuild/linux-arm64@0.28.0': 1377 + optional: true 1378 + 1379 + '@esbuild/linux-arm@0.27.3': 1380 + optional: true 1381 + 1382 + '@esbuild/linux-arm@0.28.0': 1383 + optional: true 1384 + 1385 + '@esbuild/linux-ia32@0.27.3': 1386 + optional: true 1387 + 1388 + '@esbuild/linux-ia32@0.28.0': 1389 + optional: true 1390 + 1391 + '@esbuild/linux-loong64@0.27.3': 1392 + optional: true 1393 + 1394 + '@esbuild/linux-loong64@0.28.0': 1395 + optional: true 1396 + 1397 + '@esbuild/linux-mips64el@0.27.3': 1398 + optional: true 1399 + 1400 + '@esbuild/linux-mips64el@0.28.0': 1401 + optional: true 1402 + 1403 + '@esbuild/linux-ppc64@0.27.3': 1404 + optional: true 1405 + 1406 + '@esbuild/linux-ppc64@0.28.0': 1407 + optional: true 1408 + 1409 + '@esbuild/linux-riscv64@0.27.3': 1410 + optional: true 1411 + 1412 + '@esbuild/linux-riscv64@0.28.0': 1413 + optional: true 1414 + 1415 + '@esbuild/linux-s390x@0.27.3': 1416 + optional: true 1417 + 1418 + '@esbuild/linux-s390x@0.28.0': 1419 + optional: true 1420 + 1421 + '@esbuild/linux-x64@0.27.3': 1422 + optional: true 1423 + 1424 + '@esbuild/linux-x64@0.28.0': 1425 + optional: true 1426 + 1427 + '@esbuild/netbsd-arm64@0.27.3': 1428 + optional: true 1429 + 1430 + '@esbuild/netbsd-arm64@0.28.0': 1431 + optional: true 1432 + 1433 + '@esbuild/netbsd-x64@0.27.3': 1434 + optional: true 1435 + 1436 + '@esbuild/netbsd-x64@0.28.0': 1437 + optional: true 1438 + 1439 + '@esbuild/openbsd-arm64@0.27.3': 1440 + optional: true 1441 + 1442 + '@esbuild/openbsd-arm64@0.28.0': 1443 + optional: true 1444 + 1445 + '@esbuild/openbsd-x64@0.27.3': 1446 + optional: true 1447 + 1448 + '@esbuild/openbsd-x64@0.28.0': 1449 + optional: true 1450 + 1451 + '@esbuild/openharmony-arm64@0.27.3': 1452 + optional: true 1453 + 1454 + '@esbuild/openharmony-arm64@0.28.0': 1455 + optional: true 1456 + 1457 + '@esbuild/sunos-x64@0.27.3': 1458 + optional: true 1459 + 1460 + '@esbuild/sunos-x64@0.28.0': 1461 + optional: true 1462 + 1463 + '@esbuild/win32-arm64@0.27.3': 1464 + optional: true 1465 + 1466 + '@esbuild/win32-arm64@0.28.0': 1467 + optional: true 1468 + 1469 + '@esbuild/win32-ia32@0.27.3': 1470 + optional: true 1471 + 1472 + '@esbuild/win32-ia32@0.28.0': 1473 + optional: true 1474 + 1475 + '@esbuild/win32-x64@0.27.3': 1476 + optional: true 1477 + 1478 + '@esbuild/win32-x64@0.28.0': 1479 + optional: true 1480 + 1481 + '@img/colour@1.1.0': {} 1482 + 1483 + '@img/sharp-darwin-arm64@0.34.5': 1484 + optionalDependencies: 1485 + '@img/sharp-libvips-darwin-arm64': 1.2.4 1486 + optional: true 1487 + 1488 + '@img/sharp-darwin-x64@0.34.5': 1489 + optionalDependencies: 1490 + '@img/sharp-libvips-darwin-x64': 1.2.4 1491 + optional: true 1492 + 1493 + '@img/sharp-libvips-darwin-arm64@1.2.4': 1494 + optional: true 1495 + 1496 + '@img/sharp-libvips-darwin-x64@1.2.4': 1497 + optional: true 1498 + 1499 + '@img/sharp-libvips-linux-arm64@1.2.4': 1500 + optional: true 1501 + 1502 + '@img/sharp-libvips-linux-arm@1.2.4': 1503 + optional: true 1504 + 1505 + '@img/sharp-libvips-linux-ppc64@1.2.4': 1506 + optional: true 1507 + 1508 + '@img/sharp-libvips-linux-riscv64@1.2.4': 1509 + optional: true 1510 + 1511 + '@img/sharp-libvips-linux-s390x@1.2.4': 1512 + optional: true 1513 + 1514 + '@img/sharp-libvips-linux-x64@1.2.4': 1515 + optional: true 1516 + 1517 + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': 1518 + optional: true 1519 + 1520 + '@img/sharp-libvips-linuxmusl-x64@1.2.4': 1521 + optional: true 1522 + 1523 + '@img/sharp-linux-arm64@0.34.5': 1524 + optionalDependencies: 1525 + '@img/sharp-libvips-linux-arm64': 1.2.4 1526 + optional: true 1527 + 1528 + '@img/sharp-linux-arm@0.34.5': 1529 + optionalDependencies: 1530 + '@img/sharp-libvips-linux-arm': 1.2.4 1531 + optional: true 1532 + 1533 + '@img/sharp-linux-ppc64@0.34.5': 1534 + optionalDependencies: 1535 + '@img/sharp-libvips-linux-ppc64': 1.2.4 1536 + optional: true 1537 + 1538 + '@img/sharp-linux-riscv64@0.34.5': 1539 + optionalDependencies: 1540 + '@img/sharp-libvips-linux-riscv64': 1.2.4 1541 + optional: true 1542 + 1543 + '@img/sharp-linux-s390x@0.34.5': 1544 + optionalDependencies: 1545 + '@img/sharp-libvips-linux-s390x': 1.2.4 1546 + optional: true 1547 + 1548 + '@img/sharp-linux-x64@0.34.5': 1549 + optionalDependencies: 1550 + '@img/sharp-libvips-linux-x64': 1.2.4 1551 + optional: true 1552 + 1553 + '@img/sharp-linuxmusl-arm64@0.34.5': 1554 + optionalDependencies: 1555 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 1556 + optional: true 1557 + 1558 + '@img/sharp-linuxmusl-x64@0.34.5': 1559 + optionalDependencies: 1560 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 1561 + optional: true 1562 + 1563 + '@img/sharp-wasm32@0.34.5': 1564 + dependencies: 1565 + '@emnapi/runtime': 1.10.0 1566 + optional: true 1567 + 1568 + '@img/sharp-win32-arm64@0.34.5': 1569 + optional: true 1570 + 1571 + '@img/sharp-win32-ia32@0.34.5': 1572 + optional: true 1573 + 1574 + '@img/sharp-win32-x64@0.34.5': 1575 + optional: true 1576 + 1577 + '@jridgewell/resolve-uri@3.1.2': {} 1578 + 1579 + '@jridgewell/sourcemap-codec@1.5.5': {} 1580 + 1581 + '@jridgewell/trace-mapping@0.3.9': 1582 + dependencies: 1583 + '@jridgewell/resolve-uri': 3.1.2 1584 + '@jridgewell/sourcemap-codec': 1.5.5 1585 + 1586 + '@mary-ext/event-iterator@1.0.0': 1587 + dependencies: 1588 + yocto-queue: 1.2.2 1589 + 1590 + '@mary-ext/simple-event-emitter@1.0.1': {} 1591 + 1592 + '@noble/secp256k1@3.1.0': {} 1593 + 1594 + '@optique/core@1.0.2': {} 1595 + 1596 + '@optique/run@1.0.2': 1597 + dependencies: 1598 + '@optique/core': 1.0.2 1599 + 1600 + '@poppinss/colors@4.1.6': 1601 + dependencies: 1602 + kleur: 4.1.5 1603 + 1604 + '@poppinss/dumper@0.6.5': 1605 + dependencies: 1606 + '@poppinss/colors': 4.1.6 1607 + '@sindresorhus/is': 7.2.0 1608 + supports-color: 10.2.2 1609 + 1610 + '@poppinss/exception@1.2.3': {} 1611 + 1612 + '@sindresorhus/is@7.2.0': {} 1613 + 1614 + '@speed-highlight/core@1.2.15': {} 1615 + 1616 + '@standard-schema/spec@1.1.0': {} 1617 + 1618 + blake3-wasm@2.1.5: {} 1619 + 1620 + cac@7.0.0: {} 1621 + 1622 + cookie@1.1.1: {} 1623 + 1624 + core-js@3.49.0: {} 1625 + 1626 + detect-libc@2.1.2: {} 1627 + 1628 + error-stack-parser-es@1.0.5: {} 1629 + 1630 + esbuild@0.27.3: 1631 + optionalDependencies: 1632 + '@esbuild/aix-ppc64': 0.27.3 1633 + '@esbuild/android-arm': 0.27.3 1634 + '@esbuild/android-arm64': 0.27.3 1635 + '@esbuild/android-x64': 0.27.3 1636 + '@esbuild/darwin-arm64': 0.27.3 1637 + '@esbuild/darwin-x64': 0.27.3 1638 + '@esbuild/freebsd-arm64': 0.27.3 1639 + '@esbuild/freebsd-x64': 0.27.3 1640 + '@esbuild/linux-arm': 0.27.3 1641 + '@esbuild/linux-arm64': 0.27.3 1642 + '@esbuild/linux-ia32': 0.27.3 1643 + '@esbuild/linux-loong64': 0.27.3 1644 + '@esbuild/linux-mips64el': 0.27.3 1645 + '@esbuild/linux-ppc64': 0.27.3 1646 + '@esbuild/linux-riscv64': 0.27.3 1647 + '@esbuild/linux-s390x': 0.27.3 1648 + '@esbuild/linux-x64': 0.27.3 1649 + '@esbuild/netbsd-arm64': 0.27.3 1650 + '@esbuild/netbsd-x64': 0.27.3 1651 + '@esbuild/openbsd-arm64': 0.27.3 1652 + '@esbuild/openbsd-x64': 0.27.3 1653 + '@esbuild/openharmony-arm64': 0.27.3 1654 + '@esbuild/sunos-x64': 0.27.3 1655 + '@esbuild/win32-arm64': 0.27.3 1656 + '@esbuild/win32-ia32': 0.27.3 1657 + '@esbuild/win32-x64': 0.27.3 1658 + 1659 + esbuild@0.28.0: 1660 + optionalDependencies: 1661 + '@esbuild/aix-ppc64': 0.28.0 1662 + '@esbuild/android-arm': 0.28.0 1663 + '@esbuild/android-arm64': 0.28.0 1664 + '@esbuild/android-x64': 0.28.0 1665 + '@esbuild/darwin-arm64': 0.28.0 1666 + '@esbuild/darwin-x64': 0.28.0 1667 + '@esbuild/freebsd-arm64': 0.28.0 1668 + '@esbuild/freebsd-x64': 0.28.0 1669 + '@esbuild/linux-arm': 0.28.0 1670 + '@esbuild/linux-arm64': 0.28.0 1671 + '@esbuild/linux-ia32': 0.28.0 1672 + '@esbuild/linux-loong64': 0.28.0 1673 + '@esbuild/linux-mips64el': 0.28.0 1674 + '@esbuild/linux-ppc64': 0.28.0 1675 + '@esbuild/linux-riscv64': 0.28.0 1676 + '@esbuild/linux-s390x': 0.28.0 1677 + '@esbuild/linux-x64': 0.28.0 1678 + '@esbuild/netbsd-arm64': 0.28.0 1679 + '@esbuild/netbsd-x64': 0.28.0 1680 + '@esbuild/openbsd-arm64': 0.28.0 1681 + '@esbuild/openbsd-x64': 0.28.0 1682 + '@esbuild/openharmony-arm64': 0.28.0 1683 + '@esbuild/sunos-x64': 0.28.0 1684 + '@esbuild/win32-arm64': 0.28.0 1685 + '@esbuild/win32-ia32': 0.28.0 1686 + '@esbuild/win32-x64': 0.28.0 1687 + 1688 + esm-env@1.2.2: {} 1689 + 1690 + event-target-polyfill@0.0.4: {} 1691 + 1692 + fsevents@2.3.3: 1693 + optional: true 1694 + 1695 + hono@4.12.18: {} 1696 + 1697 + iso-datestring-validator@2.2.2: {} 1698 + 1699 + jiti@2.7.0: {} 1700 + 1701 + jose@5.10.0: {} 1702 + 1703 + kleur@4.1.5: {} 1704 + 1705 + lru-cache@10.4.3: {} 1706 + 1707 + miniflare@4.20260508.0: 1708 + dependencies: 1709 + '@cspotcode/source-map-support': 0.8.1 1710 + sharp: 0.34.5 1711 + undici: 7.24.8 1712 + workerd: 1.20260508.1 1713 + ws: 8.18.0 1714 + youch: 4.1.0-beta.10 1715 + transitivePeerDependencies: 1716 + - bufferutil 1717 + - utf-8-validate 1718 + 1719 + multiformats@9.9.0: {} 1720 + 1721 + nanoid@5.1.11: {} 1722 + 1723 + partysocket@1.1.19: 1724 + dependencies: 1725 + event-target-polyfill: 0.0.4 1726 + 1727 + path-to-regexp@6.3.0: {} 1728 + 1729 + pathe@2.0.3: {} 1730 + 1731 + picocolors@1.1.1: {} 1732 + 1733 + prettier@3.8.3: {} 1734 + 1735 + semver@7.8.0: {} 1736 + 1737 + sharp@0.34.5: 1738 + dependencies: 1739 + '@img/colour': 1.1.0 1740 + detect-libc: 2.1.2 1741 + semver: 7.8.0 1742 + optionalDependencies: 1743 + '@img/sharp-darwin-arm64': 0.34.5 1744 + '@img/sharp-darwin-x64': 0.34.5 1745 + '@img/sharp-libvips-darwin-arm64': 1.2.4 1746 + '@img/sharp-libvips-darwin-x64': 1.2.4 1747 + '@img/sharp-libvips-linux-arm': 1.2.4 1748 + '@img/sharp-libvips-linux-arm64': 1.2.4 1749 + '@img/sharp-libvips-linux-ppc64': 1.2.4 1750 + '@img/sharp-libvips-linux-riscv64': 1.2.4 1751 + '@img/sharp-libvips-linux-s390x': 1.2.4 1752 + '@img/sharp-libvips-linux-x64': 1.2.4 1753 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 1754 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 1755 + '@img/sharp-linux-arm': 0.34.5 1756 + '@img/sharp-linux-arm64': 0.34.5 1757 + '@img/sharp-linux-ppc64': 0.34.5 1758 + '@img/sharp-linux-riscv64': 0.34.5 1759 + '@img/sharp-linux-s390x': 0.34.5 1760 + '@img/sharp-linux-x64': 0.34.5 1761 + '@img/sharp-linuxmusl-arm64': 0.34.5 1762 + '@img/sharp-linuxmusl-x64': 0.34.5 1763 + '@img/sharp-wasm32': 0.34.5 1764 + '@img/sharp-win32-arm64': 0.34.5 1765 + '@img/sharp-win32-ia32': 0.34.5 1766 + '@img/sharp-win32-x64': 0.34.5 1767 + 1768 + supports-color@10.2.2: {} 1769 + 1770 + tslib@2.8.1: {} 1771 + 1772 + type-fest@4.41.0: {} 1773 + 1774 + typescript@5.9.3: {} 1775 + 1776 + uint8arrays@3.0.0: 1777 + dependencies: 1778 + multiformats: 9.9.0 1779 + 1780 + undici@7.24.8: {} 1781 + 1782 + unenv@2.0.0-rc.24: 1783 + dependencies: 1784 + pathe: 2.0.3 1785 + 1786 + unicode-segmenter@0.14.5: {} 1787 + 1788 + workerd@1.20260508.1: 1789 + optionalDependencies: 1790 + '@cloudflare/workerd-darwin-64': 1.20260508.1 1791 + '@cloudflare/workerd-darwin-arm64': 1.20260508.1 1792 + '@cloudflare/workerd-linux-64': 1.20260508.1 1793 + '@cloudflare/workerd-linux-arm64': 1.20260508.1 1794 + '@cloudflare/workerd-windows-64': 1.20260508.1 1795 + 1796 + wrangler@4.90.1(@cloudflare/workers-types@4.20260511.1): 1797 + dependencies: 1798 + '@cloudflare/kv-asset-handler': 0.5.0 1799 + '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260508.1) 1800 + blake3-wasm: 2.1.5 1801 + esbuild: 0.27.3 1802 + miniflare: 4.20260508.0 1803 + path-to-regexp: 6.3.0 1804 + unenv: 2.0.0-rc.24 1805 + workerd: 1.20260508.1 1806 + optionalDependencies: 1807 + '@cloudflare/workers-types': 4.20260511.1 1808 + fsevents: 2.3.3 1809 + transitivePeerDependencies: 1810 + - bufferutil 1811 + - utf-8-validate 1812 + 1813 + ws@8.18.0: {} 1814 + 1815 + yocto-queue@1.2.2: {} 1816 + 1817 + youch-core@0.3.3: 1818 + dependencies: 1819 + '@poppinss/exception': 1.2.3 1820 + error-stack-parser-es: 1.0.5 1821 + 1822 + youch@4.1.0-beta.10: 1823 + dependencies: 1824 + '@poppinss/colors': 4.1.6 1825 + '@poppinss/dumper': 0.6.5 1826 + '@speed-highlight/core': 1.2.15 1827 + cookie: 1.1.1 1828 + youch-core: 0.3.3 1829 + 1830 + zod@3.25.76: {}
+124
scripts/sync-to-r2.mjs
··· 1 + #!/usr/bin/env node 2 + // ─── Sync vault + carry to R2 ─────────────────────────────────────── 3 + // Walks the local vault and carry directories, uploads each file to R2 4 + // under {did}/{relativePath}. 5 + // 6 + // Usage: 7 + // node scripts/sync-to-r2.mjs --did did:plc:xxx --vault /home/nandi/vault --carry /home/nandi/.local/share/carry-vault 8 + // 9 + // Requires R2 credentials as env vars: 10 + // R2_ACCOUNT_ID, R2_ACCESS_KEY, R2_SECRET_KEY 11 + 12 + import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3"; 13 + import { readdir, readFile, stat } from "fs/promises"; 14 + import { join, relative } from "path"; 15 + 16 + const args = process.argv.slice(2); 17 + function getArg(name: string): string | undefined { 18 + const idx = args.indexOf(`--${name}`); 19 + return idx >= 0 ? args[idx + 1] : undefined; 20 + } 21 + 22 + const DID = getArg("did") || process.env.STRATA_DID; 23 + const VAULT_DIR = getArg("vault") || process.env.VAULT_DIR || "/home/nandi/vault"; 24 + const CARRY_DIR = getArg("carry") || process.env.CARRY_DIR || "/home/nandi/.local/share/carry-vault"; 25 + const R2_ACCOUNT_ID = process.env.R2_ACCOUNT_ID; 26 + const R2_ACCESS_KEY = process.env.R2_ACCESS_KEY; 27 + const R2_SECRET_KEY = process.env.R2_SECRET_KEY; 28 + 29 + if (!DID) { 30 + console.error("Usage: node sync-to-r2.mjs --did did:plc:xxx [--vault path] [--carry path]"); 31 + console.error(" or set STRATA_DID, VAULT_DIR, CARRY_DIR env vars"); 32 + process.exit(1); 33 + } 34 + 35 + if (!R2_ACCOUNT_ID || !R2_ACCESS_KEY || !R2_SECRET_KEY) { 36 + console.error("Set R2_ACCOUNT_ID, R2_ACCESS_KEY, R2_SECRET_KEY env vars"); 37 + process.exit(1); 38 + } 39 + 40 + const s3 = new S3Client({ 41 + region: "auto", 42 + endpoint: `https://${R2_ACCOUNT_ID}.r2.cloudflarestorage.com`, 43 + credentials: { 44 + accessKeyId: R2_ACCESS_KEY, 45 + secretAccessKey: R2_SECRET_KEY, 46 + }, 47 + }); 48 + 49 + const VAULT_BUCKET = "stigmergic-vault"; 50 + const CARRY_BUCKET = "stigmergic-carry"; 51 + 52 + async function walkDir(dir: string): Promise<string[]> { 53 + const files: string[] = []; 54 + try { 55 + const entries = await readdir(dir, { withFileTypes: true }); 56 + for (const entry of entries) { 57 + const fullPath = join(dir, entry.name); 58 + if (entry.isDirectory()) { 59 + files.push(...await walkDir(fullPath)); 60 + } else { 61 + files.push(fullPath); 62 + } 63 + } 64 + } catch { 65 + // Directory doesn't exist, skip 66 + } 67 + return files; 68 + } 69 + 70 + async function syncDir( 71 + baseDir: string, 72 + bucket: string, 73 + prefix: string, 74 + extensions: Set<string>, 75 + ): Promise<number> { 76 + const files = await walkDir(baseDir); 77 + let uploaded = 0; 78 + 79 + for (const filePath of files) { 80 + const relPath = relative(baseDir, filePath); 81 + const ext = relPath.split(".").pop() || ""; 82 + 83 + if (!extensions.has(ext)) continue; 84 + 85 + const key = `${prefix}/${relPath}`; 86 + const body = await readFile(filePath); 87 + 88 + try { 89 + await s3.send( 90 + new PutObjectCommand({ 91 + Bucket: bucket, 92 + Key: key, 93 + Body: body, 94 + ContentType: ext === "md" ? "text/markdown" : "application/json", 95 + }), 96 + ); 97 + uploaded++; 98 + console.log(` ✓ ${key}`); 99 + } catch (e: any) { 100 + console.error(` ✗ ${key}: ${e.message}`); 101 + } 102 + } 103 + 104 + return uploaded; 105 + } 106 + 107 + async function main() { 108 + console.log(`Syncing data for ${DID}`); 109 + console.log(); 110 + 111 + console.log("Syncing vault..."); 112 + const vaultCount = await syncDir(VAULT_DIR, VAULT_BUCKET, DID, new Set(["md", "canvas"])); 113 + console.log(` ${vaultCount} vault files uploaded`); 114 + 115 + console.log(); 116 + console.log("Syncing carry..."); 117 + const carryCount = await syncDir(CARRY_DIR, CARRY_BUCKET, DID, new Set(["json"])); 118 + console.log(` ${carryCount} carry files uploaded`); 119 + 120 + console.log(); 121 + console.log("Done."); 122 + } 123 + 124 + main().catch(console.error);
+213
src/contrail.config.ts
··· 1 + import type { ContrailConfig, PipelineQueryHandler } from "@atmo-dev/contrail"; 2 + 3 + // ── Pipeline queries: the Yoneda probes ───────────────────────────────── 4 + // 5 + // The Yoneda lemma: an object is determined by its relationships. 6 + // Hom(C(a, -), F) ≅ F(a) 7 + // 8 + // Two fundamental queries: 9 + // getIncoming -- all morphisms TO a resource (covariant probe: C(-, a)) 10 + // getOutgoing -- all morphisms FROM a resource (contravariant probe: C(a, -)) 11 + // 12 + // A resource "emerges" from the sum of its connections. 13 + 14 + const getIncoming: PipelineQueryHandler = async (db, params, config) => { 15 + const uri = params.get("uri"); 16 + if (!uri) throw new Error("uri is required"); 17 + 18 + const limit = Math.min(parseInt(params.get("limit") || "50"), 100); 19 + const cursor = params.get("cursor"); 20 + const types = params.get("types"); // comma-separated connection types 21 + 22 + const conditions = ["json_extract(record, '$.target') = ?"]; 23 + const sqlParams: (string | number)[] = [uri]; 24 + 25 + if (types) { 26 + const typeList = types.split(",").map((t) => t.trim()); 27 + const placeholders = typeList.map(() => "?").join(","); 28 + conditions.push(`json_extract(record, '$.connectionType') IN (${placeholders})`); 29 + sqlParams.push(...typeList); 30 + } 31 + 32 + if (cursor) { 33 + conditions.push("time_us < ?"); 34 + sqlParams.push(parseInt(cursor)); 35 + } 36 + 37 + const where = conditions.join(" AND "); 38 + 39 + return { 40 + joins: undefined, 41 + conditions: [where], 42 + params: sqlParams, 43 + }; 44 + }; 45 + 46 + const getOutgoing: PipelineQueryHandler = async (db, params, config) => { 47 + const uri = params.get("uri"); 48 + if (!uri) throw new Error("uri is required"); 49 + 50 + const limit = Math.min(parseInt(params.get("limit") || "50"), 100); 51 + const cursor = params.get("cursor"); 52 + const types = params.get("types"); 53 + 54 + const conditions = ["json_extract(record, '$.source') = ?"]; 55 + const sqlParams: (string | number)[] = [uri]; 56 + 57 + if (types) { 58 + const typeList = types.split(",").map((t) => t.trim()); 59 + const placeholders = typeList.map(() => "?").join(","); 60 + conditions.push(`json_extract(record, '$.connectionType') IN (${placeholders})`); 61 + sqlParams.push(...typeList); 62 + } 63 + 64 + if (cursor) { 65 + conditions.push("time_us < ?"); 66 + sqlParams.push(parseInt(cursor)); 67 + } 68 + 69 + const where = conditions.join(" AND "); 70 + 71 + return { 72 + joins: undefined, 73 + conditions: [where], 74 + params: sqlParams, 75 + }; 76 + }; 77 + 78 + export const config: ContrailConfig = { 79 + namespace: "org.latha.strata", 80 + collections: { 81 + // ── Semble records (indexed from the network) ────────────────── 82 + 83 + card: { 84 + collection: "network.cosmik.card", 85 + queryable: { 86 + type: {}, 87 + "content.url": {}, 88 + }, 89 + searchable: ["content.url", "content.text", "content.metadata.title", "content.metadata.description"], 90 + references: { 91 + parentCard: { 92 + collection: "card", 93 + field: "parentCard.uri", 94 + }, 95 + }, 96 + }, 97 + 98 + collection: { 99 + collection: "network.cosmik.collection", 100 + queryable: { 101 + name: {}, 102 + accessType: {}, 103 + }, 104 + searchable: ["name", "description"], 105 + relations: { 106 + cards: { 107 + collection: "card", 108 + count: true, 109 + }, 110 + }, 111 + }, 112 + 113 + // ── Connection: the fundamental primitive (Yoneda) ────────────── 114 + // 115 + // Connections are morphisms in the knowledge graph. 116 + // Objects (cards, collections, URLs) emerge from their connections. 117 + // This is the Yoneda embedding: every object is determined by 118 + // the set of morphisms pointing at it and originating from it. 119 + 120 + connection: { 121 + collection: "network.cosmik.connection", 122 + queryable: { 123 + source: {}, 124 + target: {}, 125 + connectionType: {}, 126 + }, 127 + searchable: ["note"], 128 + pipelineQueries: { 129 + getIncoming, 130 + getOutgoing, 131 + }, 132 + }, 133 + 134 + // ── Follow: social graph for feed construction ───────────────── 135 + 136 + follow: { 137 + collection: "network.cosmik.follow", 138 + queryable: { 139 + subject: {}, 140 + }, 141 + discover: false, // only index follows from known users 142 + }, 143 + 144 + // ── Strata analysis records (generated by this appview) ──────── 145 + 146 + citation: { 147 + collection: "org.latha.strata.citation", 148 + queryable: { 149 + url: {}, 150 + confidence: {}, 151 + domain: {}, 152 + }, 153 + searchable: ["title", "takeaway"], 154 + relations: { 155 + reasoning: { 156 + collection: "reasoning", 157 + groupBy: "method", 158 + count: true, 159 + }, 160 + }, 161 + }, 162 + 163 + entity: { 164 + collection: "org.latha.strata.entity", 165 + queryable: { 166 + entityType: {}, 167 + name: {}, 168 + }, 169 + searchable: ["name", "description"], 170 + }, 171 + 172 + reasoning: { 173 + collection: "org.latha.strata.reasoning", 174 + queryable: { 175 + method: {}, 176 + confidence: {}, 177 + }, 178 + searchable: ["question", "evidence"], 179 + references: { 180 + citation: { 181 + collection: "citation", 182 + field: "justifies", 183 + }, 184 + }, 185 + }, 186 + 187 + // ── Strata synthesis: the stigmergic signal ──────────────────── 188 + // 189 + // When a user runs Strata analysis on a Semble card, the output 190 + // is an org.latha.strata record on their PDS. It's a pheromone 191 + // trail — others discover it, build on it, the network effect 192 + // compounds. Carry stays local-first; only summaries go into 193 + // the record unless explicitly published as companion records. 194 + 195 + strata: { 196 + collection: "org.latha.strata", 197 + queryable: { 198 + "source.uri": {}, 199 + "source.collection": {}, 200 + updatedAt: { type: "range" }, 201 + }, 202 + searchable: ["analysis.synthesis", "analysis.themes"], 203 + references: { 204 + sourceCard: { 205 + collection: "card", 206 + field: "source.uri", 207 + }, 208 + }, 209 + }, 210 + }, 211 + profiles: ["app.bsky.actor.profile"], 212 + notify: true, 213 + };
+841
src/frontend/app.ts
··· 1 + /** 2 + * Stigmergic frontend -- face-centric SPA. 3 + * 4 + * A face is the Yoneda embedding of a resource: all morphisms in and out, 5 + * rendered as a single card. The face IS the object, defined by its 6 + * relationships. If A->B, B->C, D->B, then B is a face with 7 + * incoming from A,D and outgoing to C. 8 + */ 9 + 10 + // ── Types ────────────────────────────────────────────────────────────────── 11 + 12 + interface Connection { 13 + uri: string; 14 + did: string; 15 + source: string; 16 + target: string; 17 + connectionType: string; 18 + note: string; 19 + handle?: string | null; 20 + createdAt?: string; 21 + } 22 + 23 + interface CardMetadata { 24 + title: string; 25 + description: string; 26 + siteName?: string; 27 + author?: string; 28 + type?: string; 29 + url: string; 30 + } 31 + 32 + interface Face { 33 + uri: string; 34 + meta: CardMetadata | null; 35 + incoming: Connection[]; 36 + outgoing: Connection[]; 37 + degree: number; 38 + } 39 + 40 + interface Collection { 41 + uri: string; 42 + did: string; 43 + rkey: string; 44 + name: string; 45 + description: string; 46 + handle?: string | null; 47 + } 48 + 49 + interface GraphData { 50 + connections: Connection[]; 51 + resources: { uri: string; title: string; type: string }[]; 52 + depth: number; 53 + uri: string; 54 + } 55 + 56 + // ── State ────────────────────────────────────────────────────────────────── 57 + 58 + let session: { did: string; handle: string } | null = null; 59 + let currentPage: "explore" | "resource" | "graph" | "connect" = "explore"; 60 + const cardCache = new Map<string, CardMetadata>(); 61 + 62 + // ── XRPC helpers ─────────────────────────────────────────────────────────── 63 + 64 + async function xrpcGet<T>(method: string, params: Record<string, string>): Promise<T> { 65 + const qs = new URLSearchParams(params).toString(); 66 + const res = await fetch(`/xrpc/${method}?${qs}`); 67 + if (!res.ok) { 68 + const err = await res.text(); 69 + throw new Error(`XRPC ${method} failed: ${res.status} ${err}`); 70 + } 71 + return res.json(); 72 + } 73 + 74 + // ── Card metadata resolution ──────────────────────────────────────────────── 75 + 76 + async function resolveCardMeta(url: string): Promise<CardMetadata | null> { 77 + if (cardCache.has(url)) return cardCache.get(url)!; 78 + 79 + try { 80 + const data = await xrpcGet<any>( 81 + "org.latha.strata.card.listRecords", 82 + { "content.url": url, limit: "1" } 83 + ); 84 + const rec = data.records?.[0]; 85 + if (rec?.value?.content?.metadata) { 86 + const m = rec.value.content.metadata; 87 + const meta: CardMetadata = { 88 + title: m.title || url, 89 + description: m.description || "", 90 + siteName: m.siteName, 91 + author: m.author, 92 + type: m.type, 93 + url, 94 + }; 95 + cardCache.set(url, meta); 96 + return meta; 97 + } 98 + } catch {} 99 + 100 + try { 101 + const data = await xrpcGet<any>( 102 + "org.latha.strata.citation.listRecords", 103 + { url, limit: "1" } 104 + ); 105 + const rec = data.records?.[0]; 106 + if (rec?.value) { 107 + const meta: CardMetadata = { 108 + title: rec.value.title || url, 109 + description: rec.value.takeaway || "", 110 + siteName: rec.value.domain, 111 + type: "citation", 112 + url, 113 + }; 114 + cardCache.set(url, meta); 115 + return meta; 116 + } 117 + } catch {} 118 + 119 + return null; 120 + } 121 + 122 + async function resolveBatch(uris: string[]): Promise<Map<string, CardMetadata | null>> { 123 + const unique = [...new Set(uris.filter((u) => u.startsWith("http")))]; 124 + const results = new Map<string, CardMetadata | null>(); 125 + await Promise.all( 126 + unique.map(async (url) => { 127 + results.set(url, await resolveCardMeta(url)); 128 + }) 129 + ); 130 + return results; 131 + } 132 + 133 + // ── Face construction ────────────────────────────────────────────────────── 134 + 135 + /** Build faces from a flat list of connections. 136 + * Each unique URI that appears as source or target becomes a face. 137 + * The face collects all edges touching that URI. */ 138 + function buildFaces(connections: Connection[]): Face[] { 139 + const faceMap = new Map<string, { incoming: Connection[]; outgoing: Connection[] }>(); 140 + 141 + for (const c of connections) { 142 + if (!faceMap.has(c.source)) faceMap.set(c.source, { incoming: [], outgoing: [] }); 143 + if (!faceMap.has(c.target)) faceMap.set(c.target, { incoming: [], outgoing: [] }); 144 + 145 + faceMap.get(c.source)!.outgoing.push(c); 146 + faceMap.get(c.target)!.incoming.push(c); 147 + } 148 + 149 + const faces: Face[] = []; 150 + for (const [uri, edges] of faceMap) { 151 + const degree = edges.incoming.length + edges.outgoing.length; 152 + faces.push({ 153 + uri, 154 + meta: cardCache.get(uri) || null, 155 + incoming: edges.incoming, 156 + outgoing: edges.outgoing, 157 + degree, 158 + }); 159 + } 160 + 161 + // Sort by degree -- most connected faces first 162 + faces.sort((a, b) => b.degree - a.degree); 163 + return faces; 164 + } 165 + 166 + // ── Strata analysis ──────────────────────────────────────────────────────── 167 + 168 + async function runStrataAnalysis(url: string): Promise<{ citation: any; tid: string } | null> { 169 + const res = await fetch("/xrpc/org.latha.strata.analyzeCard", { 170 + method: "POST", 171 + headers: { "Content-Type": "application/json" }, 172 + body: JSON.stringify({ url }), 173 + }); 174 + if (!res.ok) { 175 + const err = await res.text(); 176 + throw new Error(`Analysis failed: ${err}`); 177 + } 178 + return res.json(); 179 + } 180 + 181 + function renderStrataModal(url: string): void { 182 + const overlay = document.createElement("div"); 183 + overlay.className = "modal-overlay"; 184 + overlay.id = "strata-modal"; 185 + 186 + overlay.innerHTML = ` 187 + <div class="modal-content"> 188 + <div class="modal-header"> 189 + <h2>Strata Analysis</h2> 190 + <button class="modal-close" id="strata-modal-close">&times;</button> 191 + </div> 192 + <div id="strata-modal-body"> 193 + <div class="analysis-loading"> 194 + <div class="spinner"></div> 195 + <div>Extracting metadata from ${escHtml(truncateUri(url))}...</div> 196 + </div> 197 + </div> 198 + </div> 199 + `; 200 + 201 + document.body.appendChild(overlay); 202 + 203 + document.getElementById("strata-modal-close")?.addEventListener("click", closeStrataModal); 204 + overlay.addEventListener("click", (e) => { 205 + if (e.target === overlay) closeStrataModal(); 206 + }); 207 + 208 + runStrataAnalysis(url) 209 + .then((result) => { 210 + const body = document.getElementById("strata-modal-body"); 211 + if (!body || !result) return; 212 + 213 + const c = result.citation; 214 + body.innerHTML = ` 215 + <div class="analysis-section"> 216 + <h3>Citation Generated</h3> 217 + <div class="citation-card"> 218 + <div class="citation-title">${escHtml(c.title)}</div> 219 + <div class="citation-url">${escHtml(c.url)}</div> 220 + <div class="citation-takeaway">${escHtml(c.takeaway)}</div> 221 + <div class="citation-meta"> 222 + <span class="citation-domain">${escHtml(c.domain)}</span> 223 + <span class="citation-confidence ${escHtml(c.confidence?.split("#").pop() || "")}">${escHtml(c.confidence?.split("#").pop() || "medium")}</span> 224 + </div> 225 + ${c.tags?.length ? `<div class="citation-tags">${c.tags.map((t: string) => `<span class="tag">${escHtml(t)}</span>`).join("")}</div>` : ""} 226 + </div> 227 + </div> 228 + <div class="analysis-section"> 229 + <h3>Record</h3> 230 + <pre class="citation-record">${escHtml(JSON.stringify(c, null, 2))}</pre> 231 + </div> 232 + `; 233 + }) 234 + .catch((err) => { 235 + const body = document.getElementById("strata-modal-body"); 236 + if (body) { 237 + body.innerHTML = `<div class="analysis-error">Analysis failed: ${escHtml(err.message)}</div>`; 238 + } 239 + }); 240 + } 241 + 242 + function closeStrataModal(): void { 243 + const modal = document.getElementById("strata-modal"); 244 + if (modal) modal.remove(); 245 + } 246 + 247 + // ── Rendering helpers ────────────────────────────────────────────────────── 248 + 249 + function escHtml(s: string): string { 250 + return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;"); 251 + } 252 + 253 + function truncateUri(uri: string): string { 254 + if (uri.startsWith("http")) { 255 + try { 256 + const u = new URL(uri); 257 + const path = u.pathname === "/" ? "" : u.pathname.slice(0, 40); 258 + return u.hostname + path; 259 + } catch { 260 + return uri.slice(0, 60); 261 + } 262 + } 263 + if (uri.startsWith("at://")) { 264 + const parts = uri.split("/"); 265 + return parts.slice(3).join("/") || uri.slice(0, 60); 266 + } 267 + return uri.slice(0, 60); 268 + } 269 + 270 + function connectionTypeLabel(t: string): string { 271 + if (!t) return "relates"; 272 + const parts = t.split("#"); 273 + return parts[parts.length - 1] || t; 274 + } 275 + 276 + function connectionTypeIcon(t: string): string { 277 + const label = connectionTypeLabel(t); 278 + const icons: Record<string, string> = { 279 + contains: "\u2192", 280 + cites: "\u2190", 281 + relates: "\u2194", 282 + RELATED: "\u2194", 283 + inspired: "\u2728", 284 + contradicts: "\u26D4", 285 + extends: "\u21D2", 286 + forks: "\u21C4", 287 + annotates: "\u270E", 288 + }; 289 + return icons[label] || "\u2194"; 290 + } 291 + 292 + function faviconUrl(hostname: string): string { 293 + return `https://www.google.com/s2/favicons?domain=${encodeURIComponent(hostname)}&sz=32`; 294 + } 295 + 296 + /** Render a neighbor edge within a face -- compact pill with icon + metadata. */ 297 + function renderNeighborPill(uri: string, connType: string, direction: "in" | "out"): string { 298 + const meta = cardCache.get(uri) || null; 299 + const icon = direction === "in" ? "\u2190" : "\u2192"; 300 + const typeLabel = connectionTypeLabel(connType); 301 + const hostname = meta?.siteName || (() => { try { return new URL(uri).hostname; } catch { return ""; } })(); 302 + const fav = faviconUrl(hostname.replace(/^www\./, "")); 303 + 304 + if (meta) { 305 + return `<a href="/resource?uri=${encodeURIComponent(uri)}" class="neighbor-pill" title="${escHtml(uri)}"> 306 + <img class="pill-favicon" src="${fav}" alt="" width="14" height="14" loading="lazy"> 307 + <span class="pill-type">${icon} ${escHtml(typeLabel)}</span> 308 + <span class="pill-title">${escHtml(meta.title)}</span> 309 + </a>`; 310 + } 311 + 312 + return `<a href="/resource?uri=${encodeURIComponent(uri)}" class="neighbor-pill" title="${escHtml(uri)}"> 313 + <span class="pill-type">${icon} ${escHtml(typeLabel)}</span> 314 + <span class="pill-title">${escHtml(truncateUri(uri))}</span> 315 + </a>`; 316 + } 317 + 318 + // ── Page renderers ───────────────────────────────────────────────────────── 319 + 320 + function renderFaceFeed(faces: Face[]): void { 321 + const feed = document.getElementById("face-feed"); 322 + if (!feed) return; 323 + 324 + if (faces.length === 0) { 325 + feed.innerHTML = '<div class="empty">No faces yet. Connections create faces.</div>'; 326 + return; 327 + } 328 + 329 + feed.innerHTML = faces 330 + .map((face) => { 331 + const meta = face.meta; 332 + const hostname = meta?.siteName || (() => { try { return new URL(face.uri).hostname; } catch { return ""; } })(); 333 + const fav = faviconUrl(hostname.replace(/^www\./, "")); 334 + 335 + // Header: the face itself 336 + const headerHtml = meta 337 + ? `<a href="/resource?uri=${encodeURIComponent(face.uri)}" class="face-header"> 338 + <img class="face-favicon" src="${fav}" alt="" width="20" height="20" loading="lazy"> 339 + <div class="face-title-block"> 340 + <div class="face-title">${escHtml(meta.title)}</div> 341 + <div class="face-site">${escHtml(hostname)}${meta.author ? ` -- ${escHtml(meta.author)}` : ""}</div> 342 + </div> 343 + </a>` 344 + : `<a href="/resource?uri=${encodeURIComponent(face.uri)}" class="face-header"> 345 + <div class="face-title-block"> 346 + <div class="face-title">${escHtml(truncateUri(face.uri))}</div> 347 + </div> 348 + </a>`; 349 + 350 + // Degree badge 351 + const degreeBadge = `<span class="face-degree">${face.degree}</span>`; 352 + 353 + // Incoming neighbors 354 + const incomingHtml = face.incoming.length > 0 355 + ? `<div class="face-neighbors incoming"> 356 + <div class="neighbors-label">${face.incoming.length} in</div> 357 + <div class="neighbors-list">${face.incoming.map((c) => 358 + renderNeighborPill(c.source, c.connectionType, "in") 359 + ).join("")}</div> 360 + </div>` 361 + : ""; 362 + 363 + // Outgoing neighbors 364 + const outgoingHtml = face.outgoing.length > 0 365 + ? `<div class="face-neighbors outgoing"> 366 + <div class="neighbors-label">${face.outgoing.length} out</div> 367 + <div class="neighbors-list">${face.outgoing.map((c) => 368 + renderNeighborPill(c.target, c.connectionType, "out") 369 + ).join("")}</div> 370 + </div>` 371 + : ""; 372 + 373 + // Description 374 + const descHtml = meta?.description 375 + ? `<div class="face-desc">${escHtml(meta.description.slice(0, 200))}</div>` 376 + : ""; 377 + 378 + return ` 379 + <div class="face-card" data-uri="${escHtml(face.uri)}"> 380 + <div class="face-top"> 381 + ${headerHtml} 382 + <div class="face-actions"> 383 + ${degreeBadge} 384 + <a href="/graph?uri=${encodeURIComponent(face.uri)}" class="face-action-btn">graph</a> 385 + ${face.uri.startsWith("http") ? `<button class="strata-btn" data-url="${escHtml(face.uri)}">Strata</button>` : ""} 386 + </div> 387 + </div> 388 + ${descHtml} 389 + <div class="face-edges"> 390 + ${incomingHtml} 391 + ${outgoingHtml} 392 + </div> 393 + </div>`; 394 + }) 395 + .join(""); 396 + } 397 + 398 + function renderCollectionsSidebar(collections: Collection[]): void { 399 + const sidebar = document.getElementById("collections-sidebar"); 400 + if (!sidebar) return; 401 + 402 + if (collections.length === 0) { 403 + sidebar.innerHTML = '<div class="sidebar-empty">No public collections</div>'; 404 + return; 405 + } 406 + 407 + sidebar.innerHTML = collections 408 + .map((c) => ` 409 + <a href="/resource?uri=${encodeURIComponent(c.uri)}" class="sidebar-collection"> 410 + <span class="sidebar-name">${escHtml(c.name)}</span> 411 + <span class="sidebar-handle">${escHtml(c.handle || "")}</span> 412 + </a>`) 413 + .join(""); 414 + } 415 + 416 + function renderResourcePage(uri: string, incoming: any[], outgoing: any[], meta: CardMetadata | null): void { 417 + const content = document.getElementById("page-content"); 418 + if (!content) return; 419 + 420 + const inConns = (incoming || []).map((r: any) => ({ 421 + uri: r.uri, 422 + did: r.did, 423 + source: r.value?.source || "", 424 + target: r.value?.target || "", 425 + connectionType: r.value?.connectionType || "relates", 426 + note: r.value?.note || "", 427 + handle: r.profile?.handle || null, 428 + })); 429 + 430 + const outConns = (outgoing || []).map((r: any) => ({ 431 + uri: r.uri, 432 + did: r.did, 433 + source: r.value?.source || "", 434 + target: r.value?.target || "", 435 + connectionType: r.value?.connectionType || "relates", 436 + note: r.value?.note || "", 437 + handle: r.profile?.handle || null, 438 + })); 439 + 440 + const headerHtml = meta 441 + ? `<div class="resource-header-card"> 442 + <img class="resource-favicon" src="${faviconUrl(meta.siteName || (() => { try { return new URL(uri).hostname; } catch { return ""; } })())}" alt="" width="32" height="32" loading="lazy"> 443 + <div class="resource-meta"> 444 + <h2 class="resource-title">${escHtml(meta.title)}</h2> 445 + <div class="resource-site">${escHtml(meta.siteName || "")}${meta.author ? ` -- ${escHtml(meta.author)}` : ""}</div> 446 + ${meta.description ? `<div class="resource-desc">${escHtml(meta.description)}</div>` : ""} 447 + </div> 448 + </div>` 449 + : `<div class="resource-uri">${escHtml(uri)}</div>`; 450 + 451 + content.innerHTML = ` 452 + <div class="resource-page"> 453 + <a href="/" class="back-link">&larr; Explore</a> 454 + ${headerHtml} 455 + <div class="resource-actions"> 456 + <a href="/graph?uri=${encodeURIComponent(uri)}" class="action-btn">Graph</a> 457 + <a href="/connect?source=${encodeURIComponent(uri)}" class="action-btn">Connect</a> 458 + ${uri.startsWith("http") ? `<button class="action-btn strata-btn" data-url="${escHtml(uri)}">Strata</button>` : ""} 459 + </div> 460 + 461 + <div class="yoneda-section"> 462 + <h3>Incoming <span class="yoneda-hint">C(-, a) -- what points here</span></h3> 463 + <div class="connection-list" id="incoming-list"></div> 464 + </div> 465 + 466 + <div class="yoneda-section"> 467 + <h3>Outgoing <span class="yoneda-hint">C(a, -) -- what this points at</span></h3> 468 + <div class="connection-list" id="outgoing-list"></div> 469 + </div> 470 + </div> 471 + `; 472 + 473 + const renderList = (containerId: string, conns: Connection[]) => { 474 + const el = document.getElementById(containerId); 475 + if (!el) return; 476 + if (conns.length === 0) { 477 + el.innerHTML = '<div class="empty">No connections.</div>'; 478 + return; 479 + } 480 + el.innerHTML = conns 481 + .map((c) => { 482 + const other = c.source === uri ? c.target : c.source; 483 + const otherMeta = cardCache.get(other) || null; 484 + const hostname = otherMeta?.siteName || (() => { try { return new URL(other).hostname; } catch { return ""; } })(); 485 + const fav = faviconUrl(hostname.replace(/^www\./, "")); 486 + 487 + if (otherMeta) { 488 + return `<div class="connection-item compact"> 489 + <img class="pill-favicon" src="${fav}" alt="" width="14" height="14" loading="lazy"> 490 + <span class="conn-type-badge">${connectionTypeIcon(c.connectionType)} ${escHtml(connectionTypeLabel(c.connectionType))}</span> 491 + <a href="/resource?uri=${encodeURIComponent(other)}" class="conn-uri">${escHtml(otherMeta.title)}</a> 492 + <span class="conn-site">${escHtml(hostname)}</span> 493 + ${c.note ? `<span class="conn-note-inline">${escHtml(c.note.slice(0, 80))}</span>` : ""} 494 + <span class="conn-handle-inline">${escHtml(c.handle || "")}</span> 495 + ${other.startsWith("http") ? `<button class="strata-btn compact" data-url="${escHtml(other)}">Strata</button>` : ""} 496 + </div>`; 497 + } 498 + 499 + return `<div class="connection-item compact"> 500 + <span class="conn-type-badge">${connectionTypeIcon(c.connectionType)} ${escHtml(connectionTypeLabel(c.connectionType))}</span> 501 + <a href="/resource?uri=${encodeURIComponent(other)}" class="conn-uri">${escHtml(truncateUri(other))}</a> 502 + ${c.note ? `<span class="conn-note-inline">${escHtml(c.note.slice(0, 80))}</span>` : ""} 503 + <span class="conn-handle-inline">${escHtml(c.handle || "")}</span> 504 + ${other.startsWith("http") ? `<button class="strata-btn compact" data-url="${escHtml(other)}">Strata</button>` : ""} 505 + </div>`; 506 + }) 507 + .join(""); 508 + }; 509 + 510 + renderList("incoming-list", inConns); 511 + renderList("outgoing-list", outConns); 512 + } 513 + 514 + function renderGraphPage(data: GraphData): void { 515 + const content = document.getElementById("page-content"); 516 + if (!content) return; 517 + 518 + // Build faces from graph data 519 + const faces = buildFaces(data.connections as Connection[]); 520 + 521 + content.innerHTML = ` 522 + <div class="graph-page"> 523 + <a href="/" class="back-link">&larr; Explore</a> 524 + <a href="/resource?uri=${encodeURIComponent(data.uri)}" class="back-link">Resource</a> 525 + <h2>Graph: ${escHtml(truncateUri(data.uri))}</h2> 526 + <p class="graph-meta">${data.connections.length} connections, ${faces.length} faces, depth ${data.depth}</p> 527 + <div id="graph-faces" class="face-feed"></div> 528 + </div> 529 + `; 530 + 531 + renderFaceFeed(faces); 532 + } 533 + 534 + function renderConnectForm(sourceUri?: string): void { 535 + const content = document.getElementById("page-content"); 536 + if (!content) return; 537 + 538 + content.innerHTML = ` 539 + <div class="connect-page"> 540 + <a href="/" class="back-link">&larr; Explore</a> 541 + <h2>Create Connection</h2> 542 + <p class="connect-hint">A connection is a morphism in the knowledge graph. Source relates to target via a typed connection.</p> 543 + 544 + <form id="connect-form" class="connect-form"> 545 + <div class="form-field"> 546 + <label for="source">Source</label> 547 + <input type="text" id="source" name="source" value="${escHtml(sourceUri || "")}" placeholder="URL or AT URI" required> 548 + </div> 549 + <div class="form-field"> 550 + <label for="target">Target</label> 551 + <input type="text" id="target" name="target" placeholder="URL or AT URI" required> 552 + </div> 553 + <div class="form-field"> 554 + <label for="connectionType">Type</label> 555 + <select id="connectionType" name="connectionType"> 556 + <option value="network.cosmik.connection#relates">relates</option> 557 + <option value="network.cosmik.connection#contains">contains</option> 558 + <option value="network.cosmik.connection#cites">cites</option> 559 + <option value="network.cosmik.connection#inspired">inspired</option> 560 + <option value="network.cosmik.connection#contradicts">contradicts</option> 561 + <option value="network.cosmik.connection#extends">extends</option> 562 + <option value="network.cosmik.connection#forks">forks</option> 563 + <option value="network.cosmik.connection#annotates">annotates</option> 564 + </select> 565 + </div> 566 + <div class="form-field"> 567 + <label for="note">Note</label> 568 + <textarea id="note" name="note" placeholder="Optional note about this connection" maxlength="1000"></textarea> 569 + </div> 570 + <div class="form-actions"> 571 + <button type="submit" class="action-btn primary">Connect</button> 572 + </div> 573 + <div id="connect-result" class="connect-result"></div> 574 + </form> 575 + </div> 576 + `; 577 + 578 + document.getElementById("connect-form")?.addEventListener("submit", async (e) => { 579 + e.preventDefault(); 580 + const result = document.getElementById("connect-result"); 581 + if (!result) return; 582 + 583 + result.innerHTML = '<div class="pending">Creating connection on your PDS...</div>'; 584 + 585 + const source = (document.getElementById("source") as HTMLInputElement).value; 586 + const target = (document.getElementById("target") as HTMLInputElement).value; 587 + const connectionType = (document.getElementById("connectionType") as unknown as HTMLSelectElement).value; 588 + const note = (document.getElementById("note") as HTMLTextAreaElement).value; 589 + 590 + const record = { 591 + $type: "network.cosmik.connection", 592 + source, 593 + target, 594 + connectionType, 595 + note: note || undefined, 596 + createdAt: new Date().toISOString(), 597 + }; 598 + 599 + result.innerHTML = `<div class="preview"> 600 + <p>Record to create on your PDS:</p> 601 + <pre>${escHtml(JSON.stringify(record, null, 2))}</pre> 602 + <p class="preview-hint">OAuth write flow not yet connected. Create this record on your PDS to add it to the graph.</p> 603 + </div>`; 604 + }); 605 + } 606 + 607 + // ── Pages ────────────────────────────────────────────────────────────────── 608 + 609 + async function showExplore(): Promise<void> { 610 + currentPage = "explore"; 611 + const content = document.getElementById("page-content"); 612 + if (!content) return; 613 + 614 + content.innerHTML = ` 615 + <div class="explore-page"> 616 + <div class="explore-main"> 617 + <div class="explore-header"> 618 + <h2>Faces</h2> 619 + <a href="/connect" class="action-btn">+ Connect</a> 620 + </div> 621 + <div id="face-feed" class="face-feed"></div> 622 + </div> 623 + <div class="explore-sidebar"> 624 + <h3>Collections</h3> 625 + <div id="collections-sidebar" class="collections-sidebar"></div> 626 + </div> 627 + </div> 628 + `; 629 + 630 + try { 631 + const data = await xrpcGet<any>( 632 + "org.latha.strata.connection.listRecords", 633 + { limit: "100", profiles: "true" } 634 + ); 635 + const connections = (data.records || []).map((r: any) => ({ 636 + uri: r.uri, 637 + did: r.did, 638 + source: r.value?.source || "", 639 + target: r.value?.target || "", 640 + connectionType: r.value?.connectionType || "relates", 641 + note: r.value?.note || "", 642 + handle: r.profile?.handle || null, 643 + })); 644 + 645 + // Resolve metadata for all URIs 646 + const allUris = connections.flatMap((c: Connection) => [c.source, c.target]); 647 + await resolveBatch(allUris); 648 + 649 + // Build faces from connections 650 + const faces = buildFaces(connections); 651 + renderFaceFeed(faces); 652 + } catch (err) { 653 + console.error("Failed to load connections:", err); 654 + const serverData = (window as any).__CONNECTIONS__; 655 + if (serverData) { 656 + await resolveBatch(serverData.flatMap((c: Connection) => [c.source, c.target])); 657 + const faces = buildFaces(serverData); 658 + renderFaceFeed(faces); 659 + } 660 + } 661 + 662 + // Load collections sidebar 663 + try { 664 + const data = await xrpcGet<any>( 665 + "org.latha.strata.collection.listRecords", 666 + { accessType: "OPEN", limit: "20", profiles: "true" } 667 + ); 668 + const collections = (data.records || []).map((r: any) => ({ 669 + uri: r.uri, 670 + did: r.did, 671 + rkey: r.rkey, 672 + name: r.value?.name || "Untitled", 673 + description: r.value?.description || "", 674 + handle: r.profile?.handle || null, 675 + })); 676 + renderCollectionsSidebar(collections); 677 + } catch (err) { 678 + console.error("Failed to load collections:", err); 679 + } 680 + } 681 + 682 + async function showResource(uri: string): Promise<void> { 683 + currentPage = "resource"; 684 + 685 + let incoming: any[] = []; 686 + let outgoing: any[] = []; 687 + 688 + try { 689 + const [inData, outData] = await Promise.all([ 690 + xrpcGet<any>("org.latha.strata.connection.getIncoming", { uri, limit: "100", profiles: "true" }), 691 + xrpcGet<any>("org.latha.strata.connection.getOutgoing", { uri, limit: "100", profiles: "true" }), 692 + ]); 693 + incoming = inData.records || []; 694 + outgoing = outData.records || []; 695 + } catch (err) { 696 + console.error("Failed to load resource connections:", err); 697 + } 698 + 699 + const meta = uri.startsWith("http") ? await resolveCardMeta(uri) : null; 700 + 701 + const allUris: string[] = []; 702 + for (const r of [...incoming, ...outgoing]) { 703 + allUris.push(r.value?.source || "", r.value?.target || ""); 704 + } 705 + await resolveBatch(allUris.filter((u) => u && u.startsWith("http"))); 706 + 707 + renderResourcePage(uri, incoming, outgoing, meta); 708 + } 709 + 710 + async function showGraph(uri: string): Promise<void> { 711 + currentPage = "graph"; 712 + 713 + try { 714 + const data = await xrpcGet<GraphData>( 715 + "org.latha.strata.connection.getGraph", 716 + { uri, depth: "2", limit: "50" } 717 + ); 718 + 719 + // Resolve metadata for graph resources 720 + const allUris = data.connections.flatMap((c: Connection) => [c.source, c.target]); 721 + await resolveBatch(allUris); 722 + 723 + renderGraphPage(data); 724 + } catch (err) { 725 + console.error("Failed to load graph:", err); 726 + const content = document.getElementById("page-content"); 727 + if (content) content.innerHTML = '<div class="empty">Failed to load graph.</div>'; 728 + } 729 + } 730 + 731 + function showConnect(sourceUri?: string): void { 732 + currentPage = "connect"; 733 + renderConnectForm(sourceUri); 734 + } 735 + 736 + // ── Routing ─────────────────────────────────────────────────────────────── 737 + 738 + function getRoute(): { page: string; params: Record<string, string> } { 739 + const url = new URL(window.location.href); 740 + const path = url.pathname; 741 + 742 + if (path === "/resource") { 743 + return { page: "resource", params: { uri: url.searchParams.get("uri") || "" } }; 744 + } 745 + if (path === "/graph") { 746 + return { page: "graph", params: { uri: url.searchParams.get("uri") || "" } }; 747 + } 748 + if (path === "/connect") { 749 + return { page: "connect", params: { source: url.searchParams.get("source") || "" } }; 750 + } 751 + return { page: "explore", params: {} }; 752 + } 753 + 754 + async function route(): Promise<void> { 755 + const { page, params } = getRoute(); 756 + 757 + if (page === "resource" && params.uri) { 758 + await showResource(params.uri); 759 + } else if (page === "graph" && params.uri) { 760 + await showGraph(params.uri); 761 + } else if (page === "connect") { 762 + showConnect(params.source); 763 + } else { 764 + await showExplore(); 765 + } 766 + } 767 + 768 + // ── Auth ─────────────────────────────────────────────────────────────────── 769 + 770 + async function initAuth(): Promise<void> { 771 + try { 772 + const res = await fetch("/xrpc/org.latha.strata.getProfile", { 773 + headers: { Authorization: "Bearer " + localStorage.getItem("stigmergic_at") }, 774 + }); 775 + if (res.ok) { 776 + const data: any = await res.json(); 777 + session = { did: data.did, handle: data.handle }; 778 + updateAuthUI(); 779 + return; 780 + } 781 + } catch {} 782 + 783 + updateAuthUI(); 784 + } 785 + 786 + function updateAuthUI(): void { 787 + const status = document.getElementById("auth-status"); 788 + const loginBtn = document.getElementById("login-btn"); 789 + if (!status || !loginBtn) return; 790 + 791 + if (session) { 792 + status.textContent = session.handle; 793 + status.classList.add("visible"); 794 + loginBtn.classList.add("hidden"); 795 + } else { 796 + status.classList.remove("visible"); 797 + loginBtn.classList.remove("hidden"); 798 + } 799 + } 800 + 801 + // ── Init ─────────────────────────────────────────────────────────────────── 802 + 803 + document.addEventListener("DOMContentLoaded", () => { 804 + const searchInput = document.getElementById("search-input") as HTMLInputElement; 805 + const searchBtn = document.getElementById("search-btn"); 806 + 807 + searchBtn?.addEventListener("click", () => { 808 + const q = searchInput?.value.trim(); 809 + if (q) { 810 + window.location.href = `/resource?uri=${encodeURIComponent(q)}`; 811 + } 812 + }); 813 + 814 + searchInput?.addEventListener("keydown", (e: KeyboardEvent) => { 815 + if (e.key === "Enter") { 816 + const q = searchInput.value.trim(); 817 + if (q) { 818 + window.location.href = `/resource?uri=${encodeURIComponent(q)}`; 819 + } 820 + } 821 + }); 822 + 823 + document.getElementById("login-btn")?.addEventListener("click", () => { 824 + alert("OAuth login not yet implemented. Use your PDS directly to create connection records."); 825 + }); 826 + 827 + // Strata analysis button delegation 828 + document.addEventListener("click", (e: MouseEvent) => { 829 + const target = e.target as HTMLElement; 830 + 831 + if (target.classList.contains("strata-btn") && target.dataset.url) { 832 + const url = target.dataset.url; 833 + renderStrataModal(url); 834 + } 835 + }); 836 + 837 + route(); 838 + initAuth(); 839 + }); 840 + 841 + window.addEventListener("popstate", route);
+831
src/landing-page.ts
··· 1 + export const LANDING_PAGE = `<!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="utf-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1"> 6 + <title>Stigmergic</title> 7 + <style> 8 + :root { 9 + --bg: #0d1117; 10 + --surface: #161b22; 11 + --border: #30363d; 12 + --text: #e6edf3; 13 + --text-muted: #8b949e; 14 + --accent: #58a6ff; 15 + --accent-hover: #79c0ff; 16 + --green: #3fb950; 17 + --red: #f85149; 18 + --yellow: #d29922; 19 + --purple: #bc8cff; 20 + } 21 + * { margin: 0; padding: 0; box-sizing: border-box; } 22 + body { 23 + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif; 24 + background: var(--bg); 25 + color: var(--text); 26 + line-height: 1.6; 27 + min-height: 100vh; 28 + } 29 + header { 30 + border-bottom: 1px solid var(--border); 31 + padding: 1rem 2rem; 32 + display: flex; 33 + align-items: center; 34 + justify-content: space-between; 35 + } 36 + header h1 { 37 + font-size: 1.25rem; 38 + font-weight: 600; 39 + color: var(--accent); 40 + } 41 + header nav { display: flex; gap: 1rem; align-items: center; } 42 + header nav a, header nav button { 43 + color: var(--text-muted); 44 + text-decoration: none; 45 + font-size: 0.875rem; 46 + background: none; 47 + border: none; 48 + cursor: pointer; 49 + padding: 0.25rem 0.75rem; 50 + border-radius: 6px; 51 + } 52 + header nav a:hover, header nav button:hover { 53 + color: var(--text); 54 + background: var(--surface); 55 + } 56 + main { 57 + max-width: 960px; 58 + margin: 0 auto; 59 + padding: 2rem; 60 + } 61 + .search-bar { 62 + display: flex; 63 + max-width: 480px; 64 + margin: 0 auto 2rem; 65 + } 66 + .search-bar input { 67 + flex: 1; 68 + padding: 0.625rem 1rem; 69 + border: 1px solid var(--border); 70 + border-radius: 6px 0 0 6px; 71 + background: var(--surface); 72 + color: var(--text); 73 + font-size: 0.875rem; 74 + outline: none; 75 + } 76 + .search-bar input:focus { border-color: var(--accent); } 77 + .search-bar button { 78 + padding: 0.625rem 1.25rem; 79 + background: var(--accent); 80 + color: #fff; 81 + border: none; 82 + border-radius: 0 6px 6px 0; 83 + cursor: pointer; 84 + font-size: 0.875rem; 85 + font-weight: 500; 86 + } 87 + .search-bar button:hover { background: var(--accent-hover); } 88 + .search-hint { 89 + text-align: center; 90 + color: var(--text-muted); 91 + font-size: 0.75rem; 92 + margin-bottom: 2rem; 93 + } 94 + 95 + /* Explore layout */ 96 + .explore-page { 97 + display: grid; 98 + grid-template-columns: 1fr 240px; 99 + gap: 2rem; 100 + } 101 + .explore-header { 102 + display: flex; 103 + justify-content: space-between; 104 + align-items: center; 105 + margin-bottom: 1rem; 106 + } 107 + .explore-header h2 { 108 + font-size: 1.25rem; 109 + color: var(--text); 110 + } 111 + .explore-sidebar h3 { 112 + font-size: 0.875rem; 113 + color: var(--text-muted); 114 + margin-bottom: 0.75rem; 115 + } 116 + .collections-sidebar { 117 + display: flex; 118 + flex-direction: column; 119 + gap: 0.5rem; 120 + } 121 + .sidebar-collection { 122 + display: flex; 123 + flex-direction: column; 124 + padding: 0.5rem 0.75rem; 125 + border-radius: 6px; 126 + text-decoration: none; 127 + color: inherit; 128 + border: 1px solid transparent; 129 + } 130 + .sidebar-collection:hover { 131 + background: var(--surface); 132 + border-color: var(--border); 133 + } 134 + .sidebar-name { font-size: 0.8125rem; font-weight: 500; } 135 + .sidebar-handle { font-size: 0.6875rem; color: var(--text-muted); } 136 + .sidebar-empty { color: var(--text-muted); font-size: 0.75rem; } 137 + 138 + /* Face feed */ 139 + .face-feed { 140 + display: flex; 141 + flex-direction: column; 142 + gap: 1rem; 143 + } 144 + .face-card { 145 + background: var(--surface); 146 + border: 1px solid var(--border); 147 + border-radius: 10px; 148 + padding: 1rem 1.25rem; 149 + transition: border-color 0.15s; 150 + } 151 + .face-card:hover { border-color: var(--accent); } 152 + .face-top { 153 + display: flex; 154 + justify-content: space-between; 155 + align-items: flex-start; 156 + gap: 0.75rem; 157 + margin-bottom: 0.5rem; 158 + } 159 + .face-header { 160 + display: flex; 161 + align-items: flex-start; 162 + gap: 0.625rem; 163 + text-decoration: none; 164 + color: inherit; 165 + flex: 1; 166 + min-width: 0; 167 + } 168 + .face-header:hover .face-title { color: var(--accent); } 169 + .face-favicon { 170 + width: 20px; 171 + height: 20px; 172 + border-radius: 3px; 173 + margin-top: 2px; 174 + flex-shrink: 0; 175 + } 176 + .face-title-block { min-width: 0; } 177 + .face-title { 178 + font-size: 0.9375rem; 179 + font-weight: 600; 180 + color: var(--text); 181 + line-height: 1.3; 182 + overflow: hidden; 183 + text-overflow: ellipsis; 184 + white-space: nowrap; 185 + } 186 + .face-site { 187 + font-size: 0.6875rem; 188 + color: var(--text-muted); 189 + } 190 + .face-actions { 191 + display: flex; 192 + align-items: center; 193 + gap: 0.5rem; 194 + flex-shrink: 0; 195 + } 196 + .face-degree { 197 + font-size: 0.625rem; 198 + padding: 0.125rem 0.375rem; 199 + border-radius: 8px; 200 + background: var(--border); 201 + color: var(--text-muted); 202 + font-weight: 600; 203 + } 204 + .face-action-btn { 205 + color: var(--text-muted); 206 + font-size: 0.6875rem; 207 + text-decoration: none; 208 + } 209 + .face-action-btn:hover { color: var(--accent); } 210 + .face-desc { 211 + font-size: 0.8125rem; 212 + color: var(--text-muted); 213 + line-height: 1.4; 214 + margin-bottom: 0.75rem; 215 + overflow: hidden; 216 + text-overflow: ellipsis; 217 + display: -webkit-box; 218 + -webkit-line-clamp: 2; 219 + -webkit-box-orient: vertical; 220 + } 221 + 222 + /* Face edges */ 223 + .face-edges { 224 + display: flex; 225 + gap: 1rem; 226 + flex-wrap: wrap; 227 + } 228 + .face-neighbors { 229 + flex: 1; 230 + min-width: 200px; 231 + } 232 + .face-neighbors.incoming { 233 + border-left: 2px solid var(--green); 234 + padding-left: 0.75rem; 235 + } 236 + .face-neighbors.outgoing { 237 + border-left: 2px solid var(--accent); 238 + padding-left: 0.75rem; 239 + } 240 + .neighbors-label { 241 + font-size: 0.625rem; 242 + color: var(--text-muted); 243 + text-transform: uppercase; 244 + letter-spacing: 0.05em; 245 + margin-bottom: 0.375rem; 246 + font-weight: 600; 247 + } 248 + .face-neighbors.incoming .neighbors-label { color: var(--green); } 249 + .face-neighbors.outgoing .neighbors-label { color: var(--accent); } 250 + .neighbors-list { 251 + display: flex; 252 + flex-direction: column; 253 + gap: 0.25rem; 254 + } 255 + .neighbor-pill { 256 + display: flex; 257 + align-items: center; 258 + gap: 0.375rem; 259 + text-decoration: none; 260 + color: inherit; 261 + padding: 0.25rem 0.5rem; 262 + border-radius: 6px; 263 + background: var(--bg); 264 + border: 1px solid transparent; 265 + transition: border-color 0.1s; 266 + } 267 + .neighbor-pill:hover { border-color: var(--border); } 268 + .neighbor-pill:hover .pill-title { color: var(--accent); } 269 + .pill-favicon { 270 + width: 14px; 271 + height: 14px; 272 + border-radius: 2px; 273 + flex-shrink: 0; 274 + } 275 + .pill-type { 276 + font-size: 0.625rem; 277 + color: var(--text-muted); 278 + flex-shrink: 0; 279 + } 280 + .pill-title { 281 + font-size: 0.75rem; 282 + color: var(--text); 283 + overflow: hidden; 284 + text-overflow: ellipsis; 285 + white-space: nowrap; 286 + } 287 + 288 + /* Connection items (resource page) */ 289 + .connection-item { 290 + background: var(--surface); 291 + border: 1px solid var(--border); 292 + border-radius: 8px; 293 + padding: 1rem 1.25rem; 294 + transition: border-color 0.15s; 295 + } 296 + .connection-item:hover { border-color: var(--accent); } 297 + .connection-item.compact { 298 + padding: 0.5rem 0.75rem; 299 + display: flex; 300 + align-items: center; 301 + gap: 0.5rem; 302 + flex-wrap: wrap; 303 + background: var(--bg); 304 + border-radius: 6px; 305 + } 306 + .conn-type-badge { 307 + font-size: 0.6875rem; 308 + padding: 0.125rem 0.5rem; 309 + border-radius: 12px; 310 + background: var(--border); 311 + color: var(--text); 312 + } 313 + .conn-uri { 314 + color: var(--accent); 315 + text-decoration: none; 316 + font-size: 0.875rem; 317 + font-weight: 500; 318 + word-break: break-all; 319 + } 320 + .conn-uri:hover { text-decoration: underline; } 321 + .conn-site { 322 + font-size: 0.625rem; 323 + color: var(--text-muted); 324 + } 325 + .conn-note-inline { 326 + color: var(--text-muted); 327 + font-size: 0.75rem; 328 + } 329 + .conn-handle-inline { 330 + color: var(--text-muted); 331 + font-size: 0.6875rem; 332 + margin-left: auto; 333 + } 334 + 335 + /* Resource page header card */ 336 + .resource-header-card { 337 + display: flex; 338 + gap: 1rem; 339 + padding: 1.25rem; 340 + background: var(--surface); 341 + border: 1px solid var(--border); 342 + border-radius: 8px; 343 + margin-bottom: 1rem; 344 + } 345 + .resource-favicon { 346 + width: 32px; 347 + height: 32px; 348 + border-radius: 4px; 349 + flex-shrink: 0; 350 + } 351 + .resource-meta { min-width: 0; } 352 + .resource-title { 353 + font-size: 1.125rem; 354 + font-weight: 600; 355 + color: var(--text); 356 + margin-bottom: 0.25rem; 357 + line-height: 1.3; 358 + } 359 + .resource-site { 360 + font-size: 0.75rem; 361 + color: var(--text-muted); 362 + margin-bottom: 0.375rem; 363 + } 364 + .resource-desc { 365 + font-size: 0.8125rem; 366 + color: var(--text-muted); 367 + line-height: 1.4; 368 + } 369 + 370 + /* Strata button */ 371 + .strata-btn { 372 + background: none; 373 + border: 1px solid var(--purple); 374 + color: var(--purple); 375 + font-size: 0.6875rem; 376 + padding: 0.125rem 0.5rem; 377 + border-radius: 4px; 378 + cursor: pointer; 379 + font-weight: 500; 380 + } 381 + .strata-btn:hover { background: var(--purple); color: #fff; } 382 + .strata-btn.compact { 383 + font-size: 0.625rem; 384 + padding: 0.0625rem 0.375rem; 385 + margin-left: auto; 386 + } 387 + 388 + /* Modal */ 389 + .modal-overlay { 390 + position: fixed; 391 + top: 0; left: 0; right: 0; bottom: 0; 392 + background: rgba(0,0,0,0.6); 393 + display: flex; 394 + align-items: center; 395 + justify-content: center; 396 + z-index: 1000; 397 + } 398 + .modal-content { 399 + background: var(--surface); 400 + border: 1px solid var(--border); 401 + border-radius: 12px; 402 + max-width: 560px; 403 + width: 90%; 404 + max-height: 80vh; 405 + overflow-y: auto; 406 + padding: 1.5rem; 407 + } 408 + .modal-header { 409 + display: flex; 410 + justify-content: space-between; 411 + align-items: center; 412 + margin-bottom: 1rem; 413 + } 414 + .modal-header h2 { 415 + font-size: 1rem; 416 + color: var(--purple); 417 + } 418 + .modal-close { 419 + background: none; 420 + border: none; 421 + color: var(--text-muted); 422 + font-size: 1.5rem; 423 + cursor: pointer; 424 + line-height: 1; 425 + } 426 + .modal-close:hover { color: var(--text); } 427 + 428 + /* Analysis results */ 429 + .analysis-loading { 430 + text-align: center; 431 + color: var(--text-muted); 432 + padding: 2rem; 433 + } 434 + .spinner { 435 + width: 24px; 436 + height: 24px; 437 + border: 2px solid var(--border); 438 + border-top-color: var(--purple); 439 + border-radius: 50%; 440 + animation: spin 0.8s linear infinite; 441 + margin: 0 auto 0.75rem; 442 + } 443 + @keyframes spin { to { transform: rotate(360deg); } } 444 + 445 + .analysis-section { 446 + margin-bottom: 1.25rem; 447 + } 448 + .analysis-section h3 { 449 + font-size: 0.875rem; 450 + color: var(--text-muted); 451 + margin-bottom: 0.5rem; 452 + } 453 + .citation-card { 454 + background: var(--bg); 455 + border: 1px solid var(--border); 456 + border-radius: 6px; 457 + padding: 1rem; 458 + } 459 + .citation-title { 460 + font-size: 0.9375rem; 461 + font-weight: 600; 462 + color: var(--text); 463 + margin-bottom: 0.25rem; 464 + } 465 + .citation-url { 466 + font-size: 0.75rem; 467 + color: var(--accent); 468 + margin-bottom: 0.5rem; 469 + word-break: break-all; 470 + } 471 + .citation-takeaway { 472 + font-size: 0.8125rem; 473 + color: var(--text-muted); 474 + line-height: 1.4; 475 + margin-bottom: 0.5rem; 476 + } 477 + .citation-meta { 478 + display: flex; 479 + gap: 0.75rem; 480 + align-items: center; 481 + margin-bottom: 0.5rem; 482 + } 483 + .citation-domain { 484 + font-size: 0.6875rem; 485 + color: var(--text-muted); 486 + } 487 + .citation-confidence { 488 + font-size: 0.625rem; 489 + padding: 0.0625rem 0.375rem; 490 + border-radius: 8px; 491 + font-weight: 500; 492 + } 493 + .citation-confidence.high { background: #1a3a1a; color: var(--green); } 494 + .citation-confidence.medium { background: #3a2a1a; color: var(--yellow); } 495 + .citation-confidence.low { background: #3a1a1a; color: var(--red); } 496 + .citation-tags { 497 + display: flex; 498 + gap: 0.25rem; 499 + flex-wrap: wrap; 500 + } 501 + .tag { 502 + font-size: 0.625rem; 503 + padding: 0.0625rem 0.375rem; 504 + border-radius: 8px; 505 + background: var(--border); 506 + color: var(--text-muted); 507 + } 508 + .citation-record { 509 + font-size: 0.75rem; 510 + background: var(--bg); 511 + border: 1px solid var(--border); 512 + border-radius: 6px; 513 + padding: 0.75rem; 514 + overflow-x: auto; 515 + color: var(--text-muted); 516 + } 517 + .analysis-error { 518 + color: var(--red); 519 + padding: 1rem; 520 + text-align: center; 521 + } 522 + 523 + /* Strata analysis button */ 524 + .strata-btn { 525 + display: inline-flex; 526 + align-items: center; 527 + gap: 0.375rem; 528 + padding: 0.375rem 0.75rem; 529 + border-radius: 6px; 530 + font-size: 0.75rem; 531 + font-weight: 500; 532 + background: var(--purple); 533 + color: #fff; 534 + border: none; 535 + cursor: pointer; 536 + text-decoration: none; 537 + } 538 + .strata-btn:hover { opacity: 0.9; } 539 + .strata-btn:disabled { opacity: 0.5; cursor: wait; } 540 + 541 + /* Strata analysis modal */ 542 + .modal-overlay { 543 + position: fixed; 544 + inset: 0; 545 + background: rgba(0,0,0,0.6); 546 + z-index: 100; 547 + display: flex; 548 + align-items: center; 549 + justify-content: center; 550 + } 551 + .modal-content { 552 + background: var(--surface); 553 + border: 1px solid var(--border); 554 + border-radius: 12px; 555 + padding: 2rem; 556 + max-width: 640px; 557 + width: 90%; 558 + max-height: 80vh; 559 + overflow-y: auto; 560 + } 561 + .modal-header { 562 + display: flex; 563 + justify-content: space-between; 564 + align-items: center; 565 + margin-bottom: 1.5rem; 566 + } 567 + .modal-header h2 { font-size: 1.125rem; color: var(--purple); } 568 + .modal-close { 569 + background: none; 570 + border: none; 571 + color: var(--text-muted); 572 + font-size: 1.25rem; 573 + cursor: pointer; 574 + } 575 + .modal-close:hover { color: var(--text); } 576 + .analysis-section { margin-bottom: 1.5rem; } 577 + .analysis-section h3 { 578 + font-size: 0.875rem; 579 + color: var(--text-muted); 580 + margin-bottom: 0.5rem; 581 + } 582 + .theme-tags { display: flex; flex-wrap: wrap; gap: 0.375rem; } 583 + .theme-tag { 584 + padding: 0.25rem 0.625rem; 585 + border-radius: 12px; 586 + background: var(--border); 587 + color: var(--text); 588 + font-size: 0.75rem; 589 + } 590 + .analysis-connection { 591 + padding: 0.5rem 0.75rem; 592 + border: 1px solid var(--border); 593 + border-radius: 6px; 594 + margin-bottom: 0.5rem; 595 + font-size: 0.8125rem; 596 + } 597 + .analysis-connection .relation { 598 + color: var(--purple); 599 + font-weight: 500; 600 + font-size: 0.6875rem; 601 + } 602 + .analysis-tension { 603 + padding: 0.5rem 0.75rem; 604 + border-left: 3px solid var(--red); 605 + background: rgba(248,81,73,0.05); 606 + border-radius: 0 6px 6px 0; 607 + margin-bottom: 0.5rem; 608 + font-size: 0.8125rem; 609 + } 610 + .analysis-question { 611 + padding: 0.5rem 0.75rem; 612 + border-left: 3px solid var(--yellow); 613 + background: rgba(210,153,34,0.05); 614 + border-radius: 0 6px 6px 0; 615 + margin-bottom: 0.5rem; 616 + font-size: 0.8125rem; 617 + } 618 + .synthesis-text { 619 + font-size: 0.875rem; 620 + line-height: 1.7; 621 + color: var(--text); 622 + } 623 + .carry-ref { 624 + display: inline-flex; 625 + align-items: center; 626 + gap: 0.25rem; 627 + padding: 0.25rem 0.5rem; 628 + border-radius: 4px; 629 + background: var(--surface); 630 + border: 1px solid var(--border); 631 + font-size: 0.6875rem; 632 + color: var(--text-muted); 633 + margin: 0.25rem; 634 + } 635 + .analysis-loading { 636 + text-align: center; 637 + padding: 2rem; 638 + color: var(--text-muted); 639 + } 640 + .analysis-loading .spinner { 641 + display: inline-block; 642 + width: 24px; 643 + height: 24px; 644 + border: 2px solid var(--border); 645 + border-top-color: var(--purple); 646 + border-radius: 50%; 647 + animation: spin 0.8s linear infinite; 648 + margin-bottom: 0.75rem; 649 + } 650 + @keyframes spin { to { transform: rotate(360deg); } } 651 + 652 + /* Resource page */ 653 + .resource-page { } 654 + .resource-uri { 655 + font-size: 1rem; 656 + color: var(--accent); 657 + word-break: break-all; 658 + margin-bottom: 1rem; 659 + padding: 0.75rem 1rem; 660 + background: var(--surface); 661 + border: 1px solid var(--border); 662 + border-radius: 6px; 663 + } 664 + .resource-actions { 665 + display: flex; 666 + gap: 0.75rem; 667 + margin-bottom: 2rem; 668 + } 669 + .yoneda-section { 670 + margin-bottom: 2rem; 671 + } 672 + .yoneda-section h3 { 673 + font-size: 1rem; 674 + margin-bottom: 0.75rem; 675 + } 676 + .yoneda-hint { 677 + font-size: 0.6875rem; 678 + color: var(--text-muted); 679 + font-weight: 400; 680 + } 681 + .connection-list { 682 + display: flex; 683 + flex-direction: column; 684 + gap: 0.5rem; 685 + } 686 + 687 + /* Graph page */ 688 + .graph-page { } 689 + .graph-meta { 690 + color: var(--text-muted); 691 + font-size: 0.875rem; 692 + margin-bottom: 2rem; 693 + } 694 + .graph-connections, .graph-nodes { 695 + margin-bottom: 2rem; 696 + } 697 + .graph-connections h3, .graph-nodes h3 { 698 + font-size: 1rem; 699 + margin-bottom: 0.75rem; 700 + } 701 + .graph-node { 702 + display: inline-block; 703 + padding: 0.375rem 0.75rem; 704 + margin: 0.25rem; 705 + background: var(--surface); 706 + border: 1px solid var(--border); 707 + border-radius: 6px; 708 + color: var(--accent); 709 + text-decoration: none; 710 + font-size: 0.8125rem; 711 + } 712 + .graph-node:hover { border-color: var(--accent); } 713 + 714 + /* Connect page */ 715 + .connect-page { max-width: 600px; } 716 + .connect-hint { 717 + color: var(--text-muted); 718 + font-size: 0.875rem; 719 + margin-bottom: 1.5rem; 720 + } 721 + .connect-form { 722 + display: flex; 723 + flex-direction: column; 724 + gap: 1rem; 725 + } 726 + .form-field { 727 + display: flex; 728 + flex-direction: column; 729 + gap: 0.25rem; 730 + } 731 + .form-field label { 732 + font-size: 0.875rem; 733 + font-weight: 500; 734 + } 735 + .form-field input, .form-field textarea, .form-field select { 736 + padding: 0.625rem 0.75rem; 737 + border: 1px solid var(--border); 738 + border-radius: 6px; 739 + background: var(--surface); 740 + color: var(--text); 741 + font-size: 0.875rem; 742 + outline: none; 743 + font-family: inherit; 744 + } 745 + .form-field input:focus, .form-field textarea:focus, .form-field select:focus { 746 + border-color: var(--accent); 747 + } 748 + .form-field textarea { resize: vertical; min-height: 80px; } 749 + .form-actions { 750 + display: flex; 751 + gap: 0.75rem; 752 + } 753 + .action-btn { 754 + display: inline-block; 755 + padding: 0.5rem 1rem; 756 + border-radius: 6px; 757 + font-size: 0.875rem; 758 + font-weight: 500; 759 + text-decoration: none; 760 + cursor: pointer; 761 + background: var(--surface); 762 + border: 1px solid var(--border); 763 + color: var(--text); 764 + } 765 + .action-btn:hover { border-color: var(--accent); color: var(--accent); } 766 + .action-btn.primary { 767 + background: var(--accent); 768 + border-color: var(--accent); 769 + color: #fff; 770 + } 771 + .action-btn.primary:hover { background: var(--accent-hover); } 772 + .connect-result { 773 + margin-top: 1rem; 774 + } 775 + .connect-result pre { 776 + background: var(--surface); 777 + border: 1px solid var(--border); 778 + border-radius: 6px; 779 + padding: 1rem; 780 + font-size: 0.8125rem; 781 + overflow-x: auto; 782 + } 783 + .preview-hint { 784 + color: var(--text-muted); 785 + font-size: 0.75rem; 786 + margin-top: 0.5rem; 787 + } 788 + .pending { color: var(--yellow); } 789 + 790 + /* Shared */ 791 + .back-link { 792 + color: var(--accent); 793 + text-decoration: none; 794 + font-size: 0.875rem; 795 + display: inline-block; 796 + margin-right: 1rem; 797 + margin-bottom: 1rem; 798 + } 799 + .back-link:hover { text-decoration: underline; } 800 + .empty { 801 + text-align: center; 802 + padding: 2rem; 803 + color: var(--text-muted); 804 + } 805 + #auth-status { display: none; } 806 + #auth-status.visible { display: inline; } 807 + #login-btn { display: inline; } 808 + #login-btn.hidden { display: none; } 809 + </style> 810 + </head> 811 + <body> 812 + <header> 813 + <h1>Stigmergic</h1> 814 + <nav> 815 + <a href="/">Explore</a> 816 + <a href="/connect">Connect</a> 817 + <span id="auth-status" class="visible"></span> 818 + <button id="login-btn">Sign in</button> 819 + </nav> 820 + </header> 821 + <main> 822 + <div class="search-bar"> 823 + <input type="text" id="search-input" placeholder="Enter a URL or AT URI to explore..."> 824 + <button id="search-btn">Go</button> 825 + </div> 826 + <div class="search-hint">A face is a resource defined by all its connections. Enter a URL to see its face.</div> 827 + <div id="page-content"></div> 828 + </main> 829 + <script src="/app.js"></script> 830 + </body> 831 + </html>`;
+24
src/lexicon-types/index.ts
··· 1 + export * as AppBskyActorProfile from "./types/app/bsky/actor/profile.js"; 2 + export * as NetworkCosmikCard from "./types/network/cosmik/card.js"; 3 + export * as NetworkCosmikCollection from "./types/network/cosmik/collection.js"; 4 + export * as NetworkCosmikConnection from "./types/network/cosmik/connection.js"; 5 + export * as NetworkCosmikDefs from "./types/network/cosmik/defs.js"; 6 + export * as NetworkCosmikFollow from "./types/network/cosmik/follow.js"; 7 + export * as OrgLathaStrataCardGetRecord from "./types/org/latha/strata/card/getRecord.js"; 8 + export * as OrgLathaStrataCardListRecords from "./types/org/latha/strata/card/listRecords.js"; 9 + export * as OrgLathaStrataCitationGetRecord from "./types/org/latha/strata/citation/getRecord.js"; 10 + export * as OrgLathaStrataCitationListRecords from "./types/org/latha/strata/citation/listRecords.js"; 11 + export * as OrgLathaStrataCollectionGetRecord from "./types/org/latha/strata/collection/getRecord.js"; 12 + export * as OrgLathaStrataCollectionListRecords from "./types/org/latha/strata/collection/listRecords.js"; 13 + export * as OrgLathaStrataConnectionGetRecord from "./types/org/latha/strata/connection/getRecord.js"; 14 + export * as OrgLathaStrataConnectionListRecords from "./types/org/latha/strata/connection/listRecords.js"; 15 + export * as OrgLathaStrataEntityGetRecord from "./types/org/latha/strata/entity/getRecord.js"; 16 + export * as OrgLathaStrataEntityListRecords from "./types/org/latha/strata/entity/listRecords.js"; 17 + export * as OrgLathaStrataFollowGetRecord from "./types/org/latha/strata/follow/getRecord.js"; 18 + export * as OrgLathaStrataFollowListRecords from "./types/org/latha/strata/follow/listRecords.js"; 19 + export * as OrgLathaStrataGetCursor from "./types/org/latha/strata/getCursor.js"; 20 + export * as OrgLathaStrataGetOverview from "./types/org/latha/strata/getOverview.js"; 21 + export * as OrgLathaStrataGetProfile from "./types/org/latha/strata/getProfile.js"; 22 + export * as OrgLathaStrataNotifyOfUpdate from "./types/org/latha/strata/notifyOfUpdate.js"; 23 + export * as OrgLathaStrataReasoningGetRecord from "./types/org/latha/strata/reasoning/getRecord.js"; 24 + export * as OrgLathaStrataReasoningListRecords from "./types/org/latha/strata/reasoning/listRecords.js";
+96
src/lexicon-types/types/app/bsky/actor/profile.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + import * as ComAtprotoLabelDefs from "@atcute/atproto/types/label/defs"; 5 + import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 6 + 7 + const _mainSchema = /*#__PURE__*/ v.record( 8 + /*#__PURE__*/ v.literal("self"), 9 + /*#__PURE__*/ v.object({ 10 + $type: /*#__PURE__*/ v.literal("app.bsky.actor.profile"), 11 + /** 12 + * Small image to be displayed next to posts from account. AKA, 'profile picture' 13 + * @accept image/png, image/jpeg 14 + * @maxSize 1000000 15 + */ 16 + avatar: /*#__PURE__*/ v.optional( 17 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 18 + /*#__PURE__*/ v.blobSize(1000000), 19 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 20 + ]), 21 + ), 22 + /** 23 + * Larger horizontal image to display behind profile view. 24 + * @accept image/png, image/jpeg 25 + * @maxSize 1000000 26 + */ 27 + banner: /*#__PURE__*/ v.optional( 28 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 29 + /*#__PURE__*/ v.blobSize(1000000), 30 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 31 + ]), 32 + ), 33 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 34 + /** 35 + * Free-form profile description text. 36 + * @maxLength 2560 37 + * @maxGraphemes 256 38 + */ 39 + description: /*#__PURE__*/ v.optional( 40 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 41 + /*#__PURE__*/ v.stringLength(0, 2560), 42 + /*#__PURE__*/ v.stringGraphemes(0, 256), 43 + ]), 44 + ), 45 + /** 46 + * @maxLength 640 47 + * @maxGraphemes 64 48 + */ 49 + displayName: /*#__PURE__*/ v.optional( 50 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 51 + /*#__PURE__*/ v.stringLength(0, 640), 52 + /*#__PURE__*/ v.stringGraphemes(0, 64), 53 + ]), 54 + ), 55 + get joinedViaStarterPack() { 56 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 57 + }, 58 + /** 59 + * Self-label values, specific to the Bluesky application, on the overall account. 60 + */ 61 + get labels() { 62 + return /*#__PURE__*/ v.optional( 63 + /*#__PURE__*/ v.variant([ComAtprotoLabelDefs.selfLabelsSchema]), 64 + ); 65 + }, 66 + get pinnedPost() { 67 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 68 + }, 69 + /** 70 + * Free-form pronouns text. 71 + * @maxLength 200 72 + * @maxGraphemes 20 73 + */ 74 + pronouns: /*#__PURE__*/ v.optional( 75 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 76 + /*#__PURE__*/ v.stringLength(0, 200), 77 + /*#__PURE__*/ v.stringGraphemes(0, 20), 78 + ]), 79 + ), 80 + website: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 81 + }), 82 + ); 83 + 84 + type main$schematype = typeof _mainSchema; 85 + 86 + export interface mainSchema extends main$schematype {} 87 + 88 + export const mainSchema = _mainSchema as mainSchema; 89 + 90 + export interface Main extends v.InferInput<typeof mainSchema> {} 91 + 92 + declare module "@atcute/lexicons/ambient" { 93 + interface Records { 94 + "app.bsky.actor.profile": mainSchema; 95 + } 96 + }
+146
src/lexicon-types/types/network/cosmik/card.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 5 + import * as NetworkCosmikDefs from "./defs.js"; 6 + 7 + const _mainSchema = /*#__PURE__*/ v.record( 8 + /*#__PURE__*/ v.tidString(), 9 + /*#__PURE__*/ v.object({ 10 + $type: /*#__PURE__*/ v.literal("network.cosmik.card"), 11 + /** 12 + * The specific content of the card, determined by the card type. 13 + */ 14 + get content() { 15 + return /*#__PURE__*/ v.variant([noteContentSchema, urlContentSchema]); 16 + }, 17 + /** 18 + * Timestamp when this card was created (usually set by PDS). 19 + */ 20 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 21 + /** 22 + * Optional strong reference to the original card (for NOTE cards). 23 + */ 24 + get originalCard() { 25 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 26 + }, 27 + /** 28 + * Optional strong reference to a parent card (for NOTE cards). 29 + */ 30 + get parentCard() { 31 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 32 + }, 33 + /** 34 + * Optional provenance information for this card. 35 + */ 36 + get provenance() { 37 + return /*#__PURE__*/ v.optional(NetworkCosmikDefs.provenanceSchema); 38 + }, 39 + /** 40 + * The type of card 41 + */ 42 + type: /*#__PURE__*/ v.string<"NOTE" | "URL" | (string & {})>(), 43 + /** 44 + * Optional URL associated with the card. Required for URL cards, optional for NOTE cards. 45 + */ 46 + url: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 47 + }), 48 + ); 49 + const _noteContentSchema = /*#__PURE__*/ v.object({ 50 + $type: /*#__PURE__*/ v.optional( 51 + /*#__PURE__*/ v.literal("network.cosmik.card#noteContent"), 52 + ), 53 + /** 54 + * The note text content 55 + * @maxLength 10000 56 + */ 57 + text: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 58 + /*#__PURE__*/ v.stringLength(0, 10000), 59 + ]), 60 + }); 61 + const _urlContentSchema = /*#__PURE__*/ v.object({ 62 + $type: /*#__PURE__*/ v.optional( 63 + /*#__PURE__*/ v.literal("network.cosmik.card#urlContent"), 64 + ), 65 + /** 66 + * Optional metadata about the URL 67 + */ 68 + get metadata() { 69 + return /*#__PURE__*/ v.optional(urlMetadataSchema); 70 + }, 71 + /** 72 + * The URL being saved 73 + */ 74 + url: /*#__PURE__*/ v.genericUriString(), 75 + }); 76 + const _urlMetadataSchema = /*#__PURE__*/ v.object({ 77 + $type: /*#__PURE__*/ v.optional( 78 + /*#__PURE__*/ v.literal("network.cosmik.card#urlMetadata"), 79 + ), 80 + /** 81 + * Author of the content 82 + */ 83 + author: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 84 + /** 85 + * Description of the page 86 + */ 87 + description: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 88 + /** 89 + * Digital Object Identifier (DOI) for academic content 90 + */ 91 + doi: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 92 + /** 93 + * URL of a representative image 94 + */ 95 + imageUrl: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 96 + /** 97 + * International Standard Book Number (ISBN) for books 98 + */ 99 + isbn: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 100 + /** 101 + * When the content was published 102 + */ 103 + publishedDate: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 104 + /** 105 + * When the metadata was retrieved 106 + */ 107 + retrievedAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 108 + /** 109 + * Name of the site 110 + */ 111 + siteName: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 112 + /** 113 + * Title of the page 114 + */ 115 + title: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 116 + /** 117 + * Type of content (e.g., 'video', 'article') 118 + */ 119 + type: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 120 + }); 121 + 122 + type main$schematype = typeof _mainSchema; 123 + type noteContent$schematype = typeof _noteContentSchema; 124 + type urlContent$schematype = typeof _urlContentSchema; 125 + type urlMetadata$schematype = typeof _urlMetadataSchema; 126 + 127 + export interface mainSchema extends main$schematype {} 128 + export interface noteContentSchema extends noteContent$schematype {} 129 + export interface urlContentSchema extends urlContent$schematype {} 130 + export interface urlMetadataSchema extends urlMetadata$schematype {} 131 + 132 + export const mainSchema = _mainSchema as mainSchema; 133 + export const noteContentSchema = _noteContentSchema as noteContentSchema; 134 + export const urlContentSchema = _urlContentSchema as urlContentSchema; 135 + export const urlMetadataSchema = _urlMetadataSchema as urlMetadataSchema; 136 + 137 + export interface Main extends v.InferInput<typeof mainSchema> {} 138 + export interface NoteContent extends v.InferInput<typeof noteContentSchema> {} 139 + export interface UrlContent extends v.InferInput<typeof urlContentSchema> {} 140 + export interface UrlMetadata extends v.InferInput<typeof urlMetadataSchema> {} 141 + 142 + declare module "@atcute/lexicons/ambient" { 143 + interface Records { 144 + "network.cosmik.card": mainSchema; 145 + } 146 + }
+58
src/lexicon-types/types/network/cosmik/collection.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + 5 + const _mainSchema = /*#__PURE__*/ v.record( 6 + /*#__PURE__*/ v.tidString(), 7 + /*#__PURE__*/ v.object({ 8 + $type: /*#__PURE__*/ v.literal("network.cosmik.collection"), 9 + /** 10 + * Access control for the collection 11 + */ 12 + accessType: /*#__PURE__*/ v.string<"CLOSED" | "OPEN" | (string & {})>(), 13 + /** 14 + * List of collaborator DIDs who can add cards to closed collections 15 + */ 16 + collaborators: /*#__PURE__*/ v.optional( 17 + /*#__PURE__*/ v.array(/*#__PURE__*/ v.string()), 18 + ), 19 + /** 20 + * Timestamp when this collection was created (usually set by PDS). 21 + */ 22 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 23 + /** 24 + * Description of the collection 25 + * @maxLength 500 26 + */ 27 + description: /*#__PURE__*/ v.optional( 28 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 29 + /*#__PURE__*/ v.stringLength(0, 500), 30 + ]), 31 + ), 32 + /** 33 + * Name of the collection 34 + * @maxLength 100 35 + */ 36 + name: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 37 + /*#__PURE__*/ v.stringLength(0, 100), 38 + ]), 39 + /** 40 + * Timestamp when this collection was last updated. 41 + */ 42 + updatedAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 43 + }), 44 + ); 45 + 46 + type main$schematype = typeof _mainSchema; 47 + 48 + export interface mainSchema extends main$schematype {} 49 + 50 + export const mainSchema = _mainSchema as mainSchema; 51 + 52 + export interface Main extends v.InferInput<typeof mainSchema> {} 53 + 54 + declare module "@atcute/lexicons/ambient" { 55 + interface Records { 56 + "network.cosmik.collection": mainSchema; 57 + } 58 + }
+53
src/lexicon-types/types/network/cosmik/connection.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + 5 + const _mainSchema = /*#__PURE__*/ v.record( 6 + /*#__PURE__*/ v.tidString(), 7 + /*#__PURE__*/ v.object({ 8 + $type: /*#__PURE__*/ v.literal("network.cosmik.connection"), 9 + /** 10 + * Optional type of connection 11 + */ 12 + connectionType: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 13 + /** 14 + * Timestamp when this connection was created. 15 + */ 16 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 17 + /** 18 + * Optional note about the connection 19 + * @maxLength 1000 20 + */ 21 + note: /*#__PURE__*/ v.optional( 22 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 23 + /*#__PURE__*/ v.stringLength(0, 1000), 24 + ]), 25 + ), 26 + /** 27 + * Source entity (URL string or AT URI) 28 + */ 29 + source: /*#__PURE__*/ v.string(), 30 + /** 31 + * Target entity (URL string or AT URI) 32 + */ 33 + target: /*#__PURE__*/ v.string(), 34 + /** 35 + * Timestamp when this connection was last updated. 36 + */ 37 + updatedAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 38 + }), 39 + ); 40 + 41 + type main$schematype = typeof _mainSchema; 42 + 43 + export interface mainSchema extends main$schematype {} 44 + 45 + export const mainSchema = _mainSchema as mainSchema; 46 + 47 + export interface Main extends v.InferInput<typeof mainSchema> {} 48 + 49 + declare module "@atcute/lexicons/ambient" { 50 + interface Records { 51 + "network.cosmik.connection": mainSchema; 52 + } 53 + }
+23
src/lexicon-types/types/network/cosmik/defs.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 4 + 5 + const _provenanceSchema = /*#__PURE__*/ v.object({ 6 + $type: /*#__PURE__*/ v.optional( 7 + /*#__PURE__*/ v.literal("network.cosmik.defs#provenance"), 8 + ), 9 + /** 10 + * Strong reference to the card that led to this record. 11 + */ 12 + get via() { 13 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 14 + }, 15 + }); 16 + 17 + type provenance$schematype = typeof _provenanceSchema; 18 + 19 + export interface provenanceSchema extends provenance$schematype {} 20 + 21 + export const provenanceSchema = _provenanceSchema as provenanceSchema; 22 + 23 + export interface Provenance extends v.InferInput<typeof provenanceSchema> {}
+32
src/lexicon-types/types/network/cosmik/follow.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + 5 + const _mainSchema = /*#__PURE__*/ v.record( 6 + /*#__PURE__*/ v.tidString(), 7 + /*#__PURE__*/ v.object({ 8 + $type: /*#__PURE__*/ v.literal("network.cosmik.follow"), 9 + /** 10 + * Timestamp when this follow was created. 11 + */ 12 + createdAt: /*#__PURE__*/ v.datetimeString(), 13 + /** 14 + * DID of the user being followed, or AT URI of the collection being followed 15 + */ 16 + subject: /*#__PURE__*/ v.string(), 17 + }), 18 + ); 19 + 20 + type main$schematype = typeof _mainSchema; 21 + 22 + export interface mainSchema extends main$schematype {} 23 + 24 + export const mainSchema = _mainSchema as mainSchema; 25 + 26 + export interface Main extends v.InferInput<typeof mainSchema> {} 27 + 28 + declare module "@atcute/lexicons/ambient" { 29 + interface Records { 30 + "network.cosmik.follow": mainSchema; 31 + } 32 + }
+186
src/lexicon-types/types/org/latha/strata/card/getRecord.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + import * as ComAtprotoLabelDefs from "@atcute/atproto/types/label/defs"; 5 + import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 6 + import * as NetworkCosmikCard from "../../../../network/cosmik/card.js"; 7 + 8 + const _appBskyActorProfileSchema = /*#__PURE__*/ v.object({ 9 + $type: /*#__PURE__*/ v.optional( 10 + /*#__PURE__*/ v.literal( 11 + "org.latha.strata.card.getRecord#appBskyActorProfile", 12 + ), 13 + ), 14 + /** 15 + * Small image to be displayed next to posts from account. AKA, 'profile picture' 16 + * @accept image/png, image/jpeg 17 + * @maxSize 1000000 18 + */ 19 + avatar: /*#__PURE__*/ v.optional( 20 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 21 + /*#__PURE__*/ v.blobSize(1000000), 22 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 23 + ]), 24 + ), 25 + /** 26 + * Larger horizontal image to display behind profile view. 27 + * @accept image/png, image/jpeg 28 + * @maxSize 1000000 29 + */ 30 + banner: /*#__PURE__*/ v.optional( 31 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 32 + /*#__PURE__*/ v.blobSize(1000000), 33 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 34 + ]), 35 + ), 36 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 37 + /** 38 + * Free-form profile description text. 39 + * @maxLength 2560 40 + * @maxGraphemes 256 41 + */ 42 + description: /*#__PURE__*/ v.optional( 43 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 44 + /*#__PURE__*/ v.stringLength(0, 2560), 45 + /*#__PURE__*/ v.stringGraphemes(0, 256), 46 + ]), 47 + ), 48 + /** 49 + * @maxLength 640 50 + * @maxGraphemes 64 51 + */ 52 + displayName: /*#__PURE__*/ v.optional( 53 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 54 + /*#__PURE__*/ v.stringLength(0, 640), 55 + /*#__PURE__*/ v.stringGraphemes(0, 64), 56 + ]), 57 + ), 58 + get joinedViaStarterPack() { 59 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 60 + }, 61 + /** 62 + * Self-label values, specific to the Bluesky application, on the overall account. 63 + */ 64 + get labels() { 65 + return /*#__PURE__*/ v.optional( 66 + /*#__PURE__*/ v.variant([ComAtprotoLabelDefs.selfLabelsSchema]), 67 + ); 68 + }, 69 + get pinnedPost() { 70 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 71 + }, 72 + /** 73 + * Free-form pronouns text. 74 + * @maxLength 200 75 + * @maxGraphemes 20 76 + */ 77 + pronouns: /*#__PURE__*/ v.optional( 78 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 79 + /*#__PURE__*/ v.stringLength(0, 200), 80 + /*#__PURE__*/ v.stringGraphemes(0, 20), 81 + ]), 82 + ), 83 + website: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 84 + }); 85 + const _mainSchema = /*#__PURE__*/ v.query("org.latha.strata.card.getRecord", { 86 + params: /*#__PURE__*/ v.object({ 87 + /** 88 + * Embed the referenced parentCard record 89 + */ 90 + hydrateParentCard: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), 91 + /** 92 + * Include profile + identity info keyed by DID 93 + */ 94 + profiles: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), 95 + /** 96 + * AT URI of the record 97 + */ 98 + uri: /*#__PURE__*/ v.resourceUriString(), 99 + }), 100 + output: { 101 + type: "lex", 102 + schema: /*#__PURE__*/ v.object({ 103 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), 104 + collection: /*#__PURE__*/ v.nsidString(), 105 + did: /*#__PURE__*/ v.didString(), 106 + get parentCard() { 107 + return /*#__PURE__*/ v.optional(refParentCardRecordSchema); 108 + }, 109 + get profiles() { 110 + return /*#__PURE__*/ v.optional( 111 + /*#__PURE__*/ v.array(profileEntrySchema), 112 + ); 113 + }, 114 + rkey: /*#__PURE__*/ v.string(), 115 + time_us: /*#__PURE__*/ v.integer(), 116 + uri: /*#__PURE__*/ v.resourceUriString(), 117 + get value() { 118 + return NetworkCosmikCard.mainSchema; 119 + }, 120 + }), 121 + }, 122 + }); 123 + const _profileEntrySchema = /*#__PURE__*/ v.object({ 124 + $type: /*#__PURE__*/ v.optional( 125 + /*#__PURE__*/ v.literal("org.latha.strata.card.getRecord#profileEntry"), 126 + ), 127 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), 128 + collection: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), 129 + did: /*#__PURE__*/ v.didString(), 130 + handle: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 131 + rkey: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 132 + uri: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), 133 + get value() { 134 + return /*#__PURE__*/ v.optional(appBskyActorProfileSchema); 135 + }, 136 + }); 137 + const _refParentCardRecordSchema = /*#__PURE__*/ v.object({ 138 + $type: /*#__PURE__*/ v.optional( 139 + /*#__PURE__*/ v.literal( 140 + "org.latha.strata.card.getRecord#refParentCardRecord", 141 + ), 142 + ), 143 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 144 + collection: /*#__PURE__*/ v.nsidString(), 145 + did: /*#__PURE__*/ v.didString(), 146 + get record() { 147 + return /*#__PURE__*/ v.optional(NetworkCosmikCard.mainSchema); 148 + }, 149 + rkey: /*#__PURE__*/ v.string(), 150 + time_us: /*#__PURE__*/ v.integer(), 151 + uri: /*#__PURE__*/ v.resourceUriString(), 152 + }); 153 + 154 + type appBskyActorProfile$schematype = typeof _appBskyActorProfileSchema; 155 + type main$schematype = typeof _mainSchema; 156 + type profileEntry$schematype = typeof _profileEntrySchema; 157 + type refParentCardRecord$schematype = typeof _refParentCardRecordSchema; 158 + 159 + export interface appBskyActorProfileSchema extends appBskyActorProfile$schematype {} 160 + export interface mainSchema extends main$schematype {} 161 + export interface profileEntrySchema extends profileEntry$schematype {} 162 + export interface refParentCardRecordSchema extends refParentCardRecord$schematype {} 163 + 164 + export const appBskyActorProfileSchema = 165 + _appBskyActorProfileSchema as appBskyActorProfileSchema; 166 + export const mainSchema = _mainSchema as mainSchema; 167 + export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; 168 + export const refParentCardRecordSchema = 169 + _refParentCardRecordSchema as refParentCardRecordSchema; 170 + 171 + export interface AppBskyActorProfile extends v.InferInput< 172 + typeof appBskyActorProfileSchema 173 + > {} 174 + export interface ProfileEntry extends v.InferInput<typeof profileEntrySchema> {} 175 + export interface RefParentCardRecord extends v.InferInput< 176 + typeof refParentCardRecordSchema 177 + > {} 178 + 179 + export interface $params extends v.InferInput<mainSchema["params"]> {} 180 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 181 + 182 + declare module "@atcute/lexicons/ambient" { 183 + interface XRPCQueries { 184 + "org.latha.strata.card.getRecord": mainSchema; 185 + } 186 + }
+235
src/lexicon-types/types/org/latha/strata/card/listRecords.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + import * as ComAtprotoLabelDefs from "@atcute/atproto/types/label/defs"; 5 + import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 6 + import * as NetworkCosmikCard from "../../../../network/cosmik/card.js"; 7 + 8 + const _appBskyActorProfileSchema = /*#__PURE__*/ v.object({ 9 + $type: /*#__PURE__*/ v.optional( 10 + /*#__PURE__*/ v.literal( 11 + "org.latha.strata.card.listRecords#appBskyActorProfile", 12 + ), 13 + ), 14 + /** 15 + * Small image to be displayed next to posts from account. AKA, 'profile picture' 16 + * @accept image/png, image/jpeg 17 + * @maxSize 1000000 18 + */ 19 + avatar: /*#__PURE__*/ v.optional( 20 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 21 + /*#__PURE__*/ v.blobSize(1000000), 22 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 23 + ]), 24 + ), 25 + /** 26 + * Larger horizontal image to display behind profile view. 27 + * @accept image/png, image/jpeg 28 + * @maxSize 1000000 29 + */ 30 + banner: /*#__PURE__*/ v.optional( 31 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 32 + /*#__PURE__*/ v.blobSize(1000000), 33 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 34 + ]), 35 + ), 36 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 37 + /** 38 + * Free-form profile description text. 39 + * @maxLength 2560 40 + * @maxGraphemes 256 41 + */ 42 + description: /*#__PURE__*/ v.optional( 43 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 44 + /*#__PURE__*/ v.stringLength(0, 2560), 45 + /*#__PURE__*/ v.stringGraphemes(0, 256), 46 + ]), 47 + ), 48 + /** 49 + * @maxLength 640 50 + * @maxGraphemes 64 51 + */ 52 + displayName: /*#__PURE__*/ v.optional( 53 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 54 + /*#__PURE__*/ v.stringLength(0, 640), 55 + /*#__PURE__*/ v.stringGraphemes(0, 64), 56 + ]), 57 + ), 58 + get joinedViaStarterPack() { 59 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 60 + }, 61 + /** 62 + * Self-label values, specific to the Bluesky application, on the overall account. 63 + */ 64 + get labels() { 65 + return /*#__PURE__*/ v.optional( 66 + /*#__PURE__*/ v.variant([ComAtprotoLabelDefs.selfLabelsSchema]), 67 + ); 68 + }, 69 + get pinnedPost() { 70 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 71 + }, 72 + /** 73 + * Free-form pronouns text. 74 + * @maxLength 200 75 + * @maxGraphemes 20 76 + */ 77 + pronouns: /*#__PURE__*/ v.optional( 78 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 79 + /*#__PURE__*/ v.stringLength(0, 200), 80 + /*#__PURE__*/ v.stringGraphemes(0, 20), 81 + ]), 82 + ), 83 + website: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 84 + }); 85 + const _mainSchema = /*#__PURE__*/ v.query("org.latha.strata.card.listRecords", { 86 + params: /*#__PURE__*/ v.object({ 87 + /** 88 + * Filter by DID or handle (triggers on-demand backfill) 89 + */ 90 + actor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.actorIdentifierString()), 91 + /** 92 + * Filter by content.url 93 + */ 94 + contentUrl: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 95 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 96 + /** 97 + * Embed the referenced parentCard record 98 + */ 99 + hydrateParentCard: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), 100 + /** 101 + * @minimum 1 102 + * @maximum 200 103 + * @default 50 104 + */ 105 + limit: /*#__PURE__*/ v.optional( 106 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ 107 + /*#__PURE__*/ v.integerRange(1, 200), 108 + ]), 109 + 50, 110 + ), 111 + /** 112 + * Sort direction (default: desc for dates/numbers/counts, asc for strings) 113 + */ 114 + order: /*#__PURE__*/ v.optional( 115 + /*#__PURE__*/ v.string<"asc" | "desc" | (string & {})>(), 116 + ), 117 + /** 118 + * Include profile + identity info keyed by DID 119 + */ 120 + profiles: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), 121 + /** 122 + * Full-text search across: content.url, content.text, content.metadata.title, content.metadata.description 123 + */ 124 + search: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 125 + /** 126 + * Field to sort by (default: time_us) 127 + */ 128 + sort: /*#__PURE__*/ v.optional( 129 + /*#__PURE__*/ v.string<"contentUrl" | "type" | (string & {})>(), 130 + ), 131 + /** 132 + * Filter by type 133 + */ 134 + type: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 135 + }), 136 + output: { 137 + type: "lex", 138 + schema: /*#__PURE__*/ v.object({ 139 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 140 + get profiles() { 141 + return /*#__PURE__*/ v.optional( 142 + /*#__PURE__*/ v.array(profileEntrySchema), 143 + ); 144 + }, 145 + get records() { 146 + return /*#__PURE__*/ v.array(recordSchema); 147 + }, 148 + }), 149 + }, 150 + }); 151 + const _profileEntrySchema = /*#__PURE__*/ v.object({ 152 + $type: /*#__PURE__*/ v.optional( 153 + /*#__PURE__*/ v.literal("org.latha.strata.card.listRecords#profileEntry"), 154 + ), 155 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), 156 + collection: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), 157 + did: /*#__PURE__*/ v.didString(), 158 + handle: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 159 + rkey: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 160 + uri: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), 161 + get value() { 162 + return /*#__PURE__*/ v.optional(appBskyActorProfileSchema); 163 + }, 164 + }); 165 + const _recordSchema = /*#__PURE__*/ v.object({ 166 + $type: /*#__PURE__*/ v.optional( 167 + /*#__PURE__*/ v.literal("org.latha.strata.card.listRecords#record"), 168 + ), 169 + cid: /*#__PURE__*/ v.cidString(), 170 + collection: /*#__PURE__*/ v.nsidString(), 171 + did: /*#__PURE__*/ v.didString(), 172 + get parentCard() { 173 + return /*#__PURE__*/ v.optional(refParentCardRecordSchema); 174 + }, 175 + rkey: /*#__PURE__*/ v.string(), 176 + time_us: /*#__PURE__*/ v.integer(), 177 + uri: /*#__PURE__*/ v.resourceUriString(), 178 + get value() { 179 + return NetworkCosmikCard.mainSchema; 180 + }, 181 + }); 182 + const _refParentCardRecordSchema = /*#__PURE__*/ v.object({ 183 + $type: /*#__PURE__*/ v.optional( 184 + /*#__PURE__*/ v.literal( 185 + "org.latha.strata.card.listRecords#refParentCardRecord", 186 + ), 187 + ), 188 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 189 + collection: /*#__PURE__*/ v.nsidString(), 190 + did: /*#__PURE__*/ v.didString(), 191 + get record() { 192 + return /*#__PURE__*/ v.optional(NetworkCosmikCard.mainSchema); 193 + }, 194 + rkey: /*#__PURE__*/ v.string(), 195 + time_us: /*#__PURE__*/ v.integer(), 196 + uri: /*#__PURE__*/ v.resourceUriString(), 197 + }); 198 + 199 + type appBskyActorProfile$schematype = typeof _appBskyActorProfileSchema; 200 + type main$schematype = typeof _mainSchema; 201 + type profileEntry$schematype = typeof _profileEntrySchema; 202 + type record$schematype = typeof _recordSchema; 203 + type refParentCardRecord$schematype = typeof _refParentCardRecordSchema; 204 + 205 + export interface appBskyActorProfileSchema extends appBskyActorProfile$schematype {} 206 + export interface mainSchema extends main$schematype {} 207 + export interface profileEntrySchema extends profileEntry$schematype {} 208 + export interface recordSchema extends record$schematype {} 209 + export interface refParentCardRecordSchema extends refParentCardRecord$schematype {} 210 + 211 + export const appBskyActorProfileSchema = 212 + _appBskyActorProfileSchema as appBskyActorProfileSchema; 213 + export const mainSchema = _mainSchema as mainSchema; 214 + export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; 215 + export const recordSchema = _recordSchema as recordSchema; 216 + export const refParentCardRecordSchema = 217 + _refParentCardRecordSchema as refParentCardRecordSchema; 218 + 219 + export interface AppBskyActorProfile extends v.InferInput< 220 + typeof appBskyActorProfileSchema 221 + > {} 222 + export interface ProfileEntry extends v.InferInput<typeof profileEntrySchema> {} 223 + export interface Record extends v.InferInput<typeof recordSchema> {} 224 + export interface RefParentCardRecord extends v.InferInput< 225 + typeof refParentCardRecordSchema 226 + > {} 227 + 228 + export interface $params extends v.InferInput<mainSchema["params"]> {} 229 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 230 + 231 + declare module "@atcute/lexicons/ambient" { 232 + interface XRPCQueries { 233 + "org.latha.strata.card.listRecords": mainSchema; 234 + } 235 + }
+196
src/lexicon-types/types/org/latha/strata/citation/getRecord.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + import * as ComAtprotoLabelDefs from "@atcute/atproto/types/label/defs"; 5 + import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 6 + 7 + const _appBskyActorProfileSchema = /*#__PURE__*/ v.object({ 8 + $type: /*#__PURE__*/ v.optional( 9 + /*#__PURE__*/ v.literal( 10 + "org.latha.strata.citation.getRecord#appBskyActorProfile", 11 + ), 12 + ), 13 + /** 14 + * Small image to be displayed next to posts from account. AKA, 'profile picture' 15 + * @accept image/png, image/jpeg 16 + * @maxSize 1000000 17 + */ 18 + avatar: /*#__PURE__*/ v.optional( 19 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 20 + /*#__PURE__*/ v.blobSize(1000000), 21 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 22 + ]), 23 + ), 24 + /** 25 + * Larger horizontal image to display behind profile view. 26 + * @accept image/png, image/jpeg 27 + * @maxSize 1000000 28 + */ 29 + banner: /*#__PURE__*/ v.optional( 30 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 31 + /*#__PURE__*/ v.blobSize(1000000), 32 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 33 + ]), 34 + ), 35 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 36 + /** 37 + * Free-form profile description text. 38 + * @maxLength 2560 39 + * @maxGraphemes 256 40 + */ 41 + description: /*#__PURE__*/ v.optional( 42 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 43 + /*#__PURE__*/ v.stringLength(0, 2560), 44 + /*#__PURE__*/ v.stringGraphemes(0, 256), 45 + ]), 46 + ), 47 + /** 48 + * @maxLength 640 49 + * @maxGraphemes 64 50 + */ 51 + displayName: /*#__PURE__*/ v.optional( 52 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 53 + /*#__PURE__*/ v.stringLength(0, 640), 54 + /*#__PURE__*/ v.stringGraphemes(0, 64), 55 + ]), 56 + ), 57 + get joinedViaStarterPack() { 58 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 59 + }, 60 + /** 61 + * Self-label values, specific to the Bluesky application, on the overall account. 62 + */ 63 + get labels() { 64 + return /*#__PURE__*/ v.optional( 65 + /*#__PURE__*/ v.variant([ComAtprotoLabelDefs.selfLabelsSchema]), 66 + ); 67 + }, 68 + get pinnedPost() { 69 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 70 + }, 71 + /** 72 + * Free-form pronouns text. 73 + * @maxLength 200 74 + * @maxGraphemes 20 75 + */ 76 + pronouns: /*#__PURE__*/ v.optional( 77 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 78 + /*#__PURE__*/ v.stringLength(0, 200), 79 + /*#__PURE__*/ v.stringGraphemes(0, 20), 80 + ]), 81 + ), 82 + website: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 83 + }); 84 + const _hydrateReasoningRecordSchema = /*#__PURE__*/ v.object({ 85 + $type: /*#__PURE__*/ v.optional( 86 + /*#__PURE__*/ v.literal( 87 + "org.latha.strata.citation.getRecord#hydrateReasoningRecord", 88 + ), 89 + ), 90 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 91 + collection: /*#__PURE__*/ v.nsidString(), 92 + did: /*#__PURE__*/ v.didString(), 93 + record: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.unknown()), 94 + rkey: /*#__PURE__*/ v.string(), 95 + time_us: /*#__PURE__*/ v.integer(), 96 + uri: /*#__PURE__*/ v.resourceUriString(), 97 + }); 98 + const _mainSchema = /*#__PURE__*/ v.query( 99 + "org.latha.strata.citation.getRecord", 100 + { 101 + params: /*#__PURE__*/ v.object({ 102 + /** 103 + * Number of reasoning records to embed 104 + * @minimum 1 105 + * @maximum 50 106 + */ 107 + hydrateReasoning: /*#__PURE__*/ v.optional( 108 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ 109 + /*#__PURE__*/ v.integerRange(1, 50), 110 + ]), 111 + ), 112 + /** 113 + * Include profile + identity info keyed by DID 114 + */ 115 + profiles: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), 116 + /** 117 + * AT URI of the record 118 + */ 119 + uri: /*#__PURE__*/ v.resourceUriString(), 120 + }), 121 + output: { 122 + type: "lex", 123 + schema: /*#__PURE__*/ v.object({ 124 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), 125 + collection: /*#__PURE__*/ v.nsidString(), 126 + did: /*#__PURE__*/ v.didString(), 127 + get profiles() { 128 + return /*#__PURE__*/ v.optional( 129 + /*#__PURE__*/ v.array(profileEntrySchema), 130 + ); 131 + }, 132 + get reasoning() { 133 + return /*#__PURE__*/ v.optional( 134 + /*#__PURE__*/ v.array(hydrateReasoningRecordSchema), 135 + ); 136 + }, 137 + /** 138 + * Total reasoning count 139 + */ 140 + reasoningCount: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.integer()), 141 + rkey: /*#__PURE__*/ v.string(), 142 + time_us: /*#__PURE__*/ v.integer(), 143 + uri: /*#__PURE__*/ v.resourceUriString(), 144 + value: /*#__PURE__*/ v.unknown(), 145 + }), 146 + }, 147 + }, 148 + ); 149 + const _profileEntrySchema = /*#__PURE__*/ v.object({ 150 + $type: /*#__PURE__*/ v.optional( 151 + /*#__PURE__*/ v.literal("org.latha.strata.citation.getRecord#profileEntry"), 152 + ), 153 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), 154 + collection: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), 155 + did: /*#__PURE__*/ v.didString(), 156 + handle: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 157 + rkey: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 158 + uri: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), 159 + get value() { 160 + return /*#__PURE__*/ v.optional(appBskyActorProfileSchema); 161 + }, 162 + }); 163 + 164 + type appBskyActorProfile$schematype = typeof _appBskyActorProfileSchema; 165 + type hydrateReasoningRecord$schematype = typeof _hydrateReasoningRecordSchema; 166 + type main$schematype = typeof _mainSchema; 167 + type profileEntry$schematype = typeof _profileEntrySchema; 168 + 169 + export interface appBskyActorProfileSchema extends appBskyActorProfile$schematype {} 170 + export interface hydrateReasoningRecordSchema extends hydrateReasoningRecord$schematype {} 171 + export interface mainSchema extends main$schematype {} 172 + export interface profileEntrySchema extends profileEntry$schematype {} 173 + 174 + export const appBskyActorProfileSchema = 175 + _appBskyActorProfileSchema as appBskyActorProfileSchema; 176 + export const hydrateReasoningRecordSchema = 177 + _hydrateReasoningRecordSchema as hydrateReasoningRecordSchema; 178 + export const mainSchema = _mainSchema as mainSchema; 179 + export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; 180 + 181 + export interface AppBskyActorProfile extends v.InferInput< 182 + typeof appBskyActorProfileSchema 183 + > {} 184 + export interface HydrateReasoningRecord extends v.InferInput< 185 + typeof hydrateReasoningRecordSchema 186 + > {} 187 + export interface ProfileEntry extends v.InferInput<typeof profileEntrySchema> {} 188 + 189 + export interface $params extends v.InferInput<mainSchema["params"]> {} 190 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 191 + 192 + declare module "@atcute/lexicons/ambient" { 193 + interface XRPCQueries { 194 + "org.latha.strata.citation.getRecord": mainSchema; 195 + } 196 + }
+257
src/lexicon-types/types/org/latha/strata/citation/listRecords.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + import * as ComAtprotoLabelDefs from "@atcute/atproto/types/label/defs"; 5 + import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 6 + 7 + const _appBskyActorProfileSchema = /*#__PURE__*/ v.object({ 8 + $type: /*#__PURE__*/ v.optional( 9 + /*#__PURE__*/ v.literal( 10 + "org.latha.strata.citation.listRecords#appBskyActorProfile", 11 + ), 12 + ), 13 + /** 14 + * Small image to be displayed next to posts from account. AKA, 'profile picture' 15 + * @accept image/png, image/jpeg 16 + * @maxSize 1000000 17 + */ 18 + avatar: /*#__PURE__*/ v.optional( 19 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 20 + /*#__PURE__*/ v.blobSize(1000000), 21 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 22 + ]), 23 + ), 24 + /** 25 + * Larger horizontal image to display behind profile view. 26 + * @accept image/png, image/jpeg 27 + * @maxSize 1000000 28 + */ 29 + banner: /*#__PURE__*/ v.optional( 30 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 31 + /*#__PURE__*/ v.blobSize(1000000), 32 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 33 + ]), 34 + ), 35 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 36 + /** 37 + * Free-form profile description text. 38 + * @maxLength 2560 39 + * @maxGraphemes 256 40 + */ 41 + description: /*#__PURE__*/ v.optional( 42 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 43 + /*#__PURE__*/ v.stringLength(0, 2560), 44 + /*#__PURE__*/ v.stringGraphemes(0, 256), 45 + ]), 46 + ), 47 + /** 48 + * @maxLength 640 49 + * @maxGraphemes 64 50 + */ 51 + displayName: /*#__PURE__*/ v.optional( 52 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 53 + /*#__PURE__*/ v.stringLength(0, 640), 54 + /*#__PURE__*/ v.stringGraphemes(0, 64), 55 + ]), 56 + ), 57 + get joinedViaStarterPack() { 58 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 59 + }, 60 + /** 61 + * Self-label values, specific to the Bluesky application, on the overall account. 62 + */ 63 + get labels() { 64 + return /*#__PURE__*/ v.optional( 65 + /*#__PURE__*/ v.variant([ComAtprotoLabelDefs.selfLabelsSchema]), 66 + ); 67 + }, 68 + get pinnedPost() { 69 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 70 + }, 71 + /** 72 + * Free-form pronouns text. 73 + * @maxLength 200 74 + * @maxGraphemes 20 75 + */ 76 + pronouns: /*#__PURE__*/ v.optional( 77 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 78 + /*#__PURE__*/ v.stringLength(0, 200), 79 + /*#__PURE__*/ v.stringGraphemes(0, 20), 80 + ]), 81 + ), 82 + website: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 83 + }); 84 + const _hydrateReasoningRecordSchema = /*#__PURE__*/ v.object({ 85 + $type: /*#__PURE__*/ v.optional( 86 + /*#__PURE__*/ v.literal( 87 + "org.latha.strata.citation.listRecords#hydrateReasoningRecord", 88 + ), 89 + ), 90 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 91 + collection: /*#__PURE__*/ v.nsidString(), 92 + did: /*#__PURE__*/ v.didString(), 93 + record: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.unknown()), 94 + rkey: /*#__PURE__*/ v.string(), 95 + time_us: /*#__PURE__*/ v.integer(), 96 + uri: /*#__PURE__*/ v.resourceUriString(), 97 + }); 98 + const _mainSchema = /*#__PURE__*/ v.query( 99 + "org.latha.strata.citation.listRecords", 100 + { 101 + params: /*#__PURE__*/ v.object({ 102 + /** 103 + * Filter by DID or handle (triggers on-demand backfill) 104 + */ 105 + actor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.actorIdentifierString()), 106 + /** 107 + * Filter by confidence 108 + */ 109 + confidence: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 110 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 111 + /** 112 + * Filter by domain 113 + */ 114 + domain: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 115 + /** 116 + * Number of reasoning records to embed per record 117 + * @minimum 1 118 + * @maximum 50 119 + */ 120 + hydrateReasoning: /*#__PURE__*/ v.optional( 121 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ 122 + /*#__PURE__*/ v.integerRange(1, 50), 123 + ]), 124 + ), 125 + /** 126 + * @minimum 1 127 + * @maximum 200 128 + * @default 50 129 + */ 130 + limit: /*#__PURE__*/ v.optional( 131 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ 132 + /*#__PURE__*/ v.integerRange(1, 200), 133 + ]), 134 + 50, 135 + ), 136 + /** 137 + * Sort direction (default: desc for dates/numbers/counts, asc for strings) 138 + */ 139 + order: /*#__PURE__*/ v.optional( 140 + /*#__PURE__*/ v.string<"asc" | "desc" | (string & {})>(), 141 + ), 142 + /** 143 + * Include profile + identity info keyed by DID 144 + */ 145 + profiles: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), 146 + /** 147 + * Minimum total reasoning count 148 + */ 149 + reasoningCountMin: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.integer()), 150 + /** 151 + * Full-text search across: title, takeaway 152 + */ 153 + search: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 154 + /** 155 + * Field to sort by (default: time_us) 156 + */ 157 + sort: /*#__PURE__*/ v.optional( 158 + /*#__PURE__*/ v.string< 159 + "confidence" | "domain" | "reasoningCount" | "url" | (string & {}) 160 + >(), 161 + ), 162 + /** 163 + * Filter by url 164 + */ 165 + url: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 166 + }), 167 + output: { 168 + type: "lex", 169 + schema: /*#__PURE__*/ v.object({ 170 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 171 + get profiles() { 172 + return /*#__PURE__*/ v.optional( 173 + /*#__PURE__*/ v.array(profileEntrySchema), 174 + ); 175 + }, 176 + get records() { 177 + return /*#__PURE__*/ v.array(recordSchema); 178 + }, 179 + }), 180 + }, 181 + }, 182 + ); 183 + const _profileEntrySchema = /*#__PURE__*/ v.object({ 184 + $type: /*#__PURE__*/ v.optional( 185 + /*#__PURE__*/ v.literal( 186 + "org.latha.strata.citation.listRecords#profileEntry", 187 + ), 188 + ), 189 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), 190 + collection: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), 191 + did: /*#__PURE__*/ v.didString(), 192 + handle: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 193 + rkey: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 194 + uri: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), 195 + get value() { 196 + return /*#__PURE__*/ v.optional(appBskyActorProfileSchema); 197 + }, 198 + }); 199 + const _recordSchema = /*#__PURE__*/ v.object({ 200 + $type: /*#__PURE__*/ v.optional( 201 + /*#__PURE__*/ v.literal("org.latha.strata.citation.listRecords#record"), 202 + ), 203 + cid: /*#__PURE__*/ v.cidString(), 204 + collection: /*#__PURE__*/ v.nsidString(), 205 + did: /*#__PURE__*/ v.didString(), 206 + get reasoning() { 207 + return /*#__PURE__*/ v.optional( 208 + /*#__PURE__*/ v.array(hydrateReasoningRecordSchema), 209 + ); 210 + }, 211 + /** 212 + * Total reasoning count 213 + */ 214 + reasoningCount: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.integer()), 215 + rkey: /*#__PURE__*/ v.string(), 216 + time_us: /*#__PURE__*/ v.integer(), 217 + uri: /*#__PURE__*/ v.resourceUriString(), 218 + value: /*#__PURE__*/ v.unknown(), 219 + }); 220 + 221 + type appBskyActorProfile$schematype = typeof _appBskyActorProfileSchema; 222 + type hydrateReasoningRecord$schematype = typeof _hydrateReasoningRecordSchema; 223 + type main$schematype = typeof _mainSchema; 224 + type profileEntry$schematype = typeof _profileEntrySchema; 225 + type record$schematype = typeof _recordSchema; 226 + 227 + export interface appBskyActorProfileSchema extends appBskyActorProfile$schematype {} 228 + export interface hydrateReasoningRecordSchema extends hydrateReasoningRecord$schematype {} 229 + export interface mainSchema extends main$schematype {} 230 + export interface profileEntrySchema extends profileEntry$schematype {} 231 + export interface recordSchema extends record$schematype {} 232 + 233 + export const appBskyActorProfileSchema = 234 + _appBskyActorProfileSchema as appBskyActorProfileSchema; 235 + export const hydrateReasoningRecordSchema = 236 + _hydrateReasoningRecordSchema as hydrateReasoningRecordSchema; 237 + export const mainSchema = _mainSchema as mainSchema; 238 + export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; 239 + export const recordSchema = _recordSchema as recordSchema; 240 + 241 + export interface AppBskyActorProfile extends v.InferInput< 242 + typeof appBskyActorProfileSchema 243 + > {} 244 + export interface HydrateReasoningRecord extends v.InferInput< 245 + typeof hydrateReasoningRecordSchema 246 + > {} 247 + export interface ProfileEntry extends v.InferInput<typeof profileEntrySchema> {} 248 + export interface Record extends v.InferInput<typeof recordSchema> {} 249 + 250 + export interface $params extends v.InferInput<mainSchema["params"]> {} 251 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 252 + 253 + declare module "@atcute/lexicons/ambient" { 254 + interface XRPCQueries { 255 + "org.latha.strata.citation.listRecords": mainSchema; 256 + } 257 + }
+204
src/lexicon-types/types/org/latha/strata/collection/getRecord.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + import * as ComAtprotoLabelDefs from "@atcute/atproto/types/label/defs"; 5 + import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 6 + import * as NetworkCosmikCard from "../../../../network/cosmik/card.js"; 7 + import * as NetworkCosmikCollection from "../../../../network/cosmik/collection.js"; 8 + 9 + const _appBskyActorProfileSchema = /*#__PURE__*/ v.object({ 10 + $type: /*#__PURE__*/ v.optional( 11 + /*#__PURE__*/ v.literal( 12 + "org.latha.strata.collection.getRecord#appBskyActorProfile", 13 + ), 14 + ), 15 + /** 16 + * Small image to be displayed next to posts from account. AKA, 'profile picture' 17 + * @accept image/png, image/jpeg 18 + * @maxSize 1000000 19 + */ 20 + avatar: /*#__PURE__*/ v.optional( 21 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 22 + /*#__PURE__*/ v.blobSize(1000000), 23 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 24 + ]), 25 + ), 26 + /** 27 + * Larger horizontal image to display behind profile view. 28 + * @accept image/png, image/jpeg 29 + * @maxSize 1000000 30 + */ 31 + banner: /*#__PURE__*/ v.optional( 32 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 33 + /*#__PURE__*/ v.blobSize(1000000), 34 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 35 + ]), 36 + ), 37 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 38 + /** 39 + * Free-form profile description text. 40 + * @maxLength 2560 41 + * @maxGraphemes 256 42 + */ 43 + description: /*#__PURE__*/ v.optional( 44 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 45 + /*#__PURE__*/ v.stringLength(0, 2560), 46 + /*#__PURE__*/ v.stringGraphemes(0, 256), 47 + ]), 48 + ), 49 + /** 50 + * @maxLength 640 51 + * @maxGraphemes 64 52 + */ 53 + displayName: /*#__PURE__*/ v.optional( 54 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 55 + /*#__PURE__*/ v.stringLength(0, 640), 56 + /*#__PURE__*/ v.stringGraphemes(0, 64), 57 + ]), 58 + ), 59 + get joinedViaStarterPack() { 60 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 61 + }, 62 + /** 63 + * Self-label values, specific to the Bluesky application, on the overall account. 64 + */ 65 + get labels() { 66 + return /*#__PURE__*/ v.optional( 67 + /*#__PURE__*/ v.variant([ComAtprotoLabelDefs.selfLabelsSchema]), 68 + ); 69 + }, 70 + get pinnedPost() { 71 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 72 + }, 73 + /** 74 + * Free-form pronouns text. 75 + * @maxLength 200 76 + * @maxGraphemes 20 77 + */ 78 + pronouns: /*#__PURE__*/ v.optional( 79 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 80 + /*#__PURE__*/ v.stringLength(0, 200), 81 + /*#__PURE__*/ v.stringGraphemes(0, 20), 82 + ]), 83 + ), 84 + website: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 85 + }); 86 + const _hydrateCardsRecordSchema = /*#__PURE__*/ v.object({ 87 + $type: /*#__PURE__*/ v.optional( 88 + /*#__PURE__*/ v.literal( 89 + "org.latha.strata.collection.getRecord#hydrateCardsRecord", 90 + ), 91 + ), 92 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 93 + collection: /*#__PURE__*/ v.nsidString(), 94 + did: /*#__PURE__*/ v.didString(), 95 + get record() { 96 + return /*#__PURE__*/ v.optional(NetworkCosmikCard.mainSchema); 97 + }, 98 + rkey: /*#__PURE__*/ v.string(), 99 + time_us: /*#__PURE__*/ v.integer(), 100 + uri: /*#__PURE__*/ v.resourceUriString(), 101 + }); 102 + const _mainSchema = /*#__PURE__*/ v.query( 103 + "org.latha.strata.collection.getRecord", 104 + { 105 + params: /*#__PURE__*/ v.object({ 106 + /** 107 + * Number of cards records to embed 108 + * @minimum 1 109 + * @maximum 50 110 + */ 111 + hydrateCards: /*#__PURE__*/ v.optional( 112 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ 113 + /*#__PURE__*/ v.integerRange(1, 50), 114 + ]), 115 + ), 116 + /** 117 + * Include profile + identity info keyed by DID 118 + */ 119 + profiles: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), 120 + /** 121 + * AT URI of the record 122 + */ 123 + uri: /*#__PURE__*/ v.resourceUriString(), 124 + }), 125 + output: { 126 + type: "lex", 127 + schema: /*#__PURE__*/ v.object({ 128 + get cards() { 129 + return /*#__PURE__*/ v.optional( 130 + /*#__PURE__*/ v.array(hydrateCardsRecordSchema), 131 + ); 132 + }, 133 + /** 134 + * Total cards count 135 + */ 136 + cardsCount: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.integer()), 137 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), 138 + collection: /*#__PURE__*/ v.nsidString(), 139 + did: /*#__PURE__*/ v.didString(), 140 + get profiles() { 141 + return /*#__PURE__*/ v.optional( 142 + /*#__PURE__*/ v.array(profileEntrySchema), 143 + ); 144 + }, 145 + rkey: /*#__PURE__*/ v.string(), 146 + time_us: /*#__PURE__*/ v.integer(), 147 + uri: /*#__PURE__*/ v.resourceUriString(), 148 + get value() { 149 + return NetworkCosmikCollection.mainSchema; 150 + }, 151 + }), 152 + }, 153 + }, 154 + ); 155 + const _profileEntrySchema = /*#__PURE__*/ v.object({ 156 + $type: /*#__PURE__*/ v.optional( 157 + /*#__PURE__*/ v.literal( 158 + "org.latha.strata.collection.getRecord#profileEntry", 159 + ), 160 + ), 161 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), 162 + collection: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), 163 + did: /*#__PURE__*/ v.didString(), 164 + handle: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 165 + rkey: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 166 + uri: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), 167 + get value() { 168 + return /*#__PURE__*/ v.optional(appBskyActorProfileSchema); 169 + }, 170 + }); 171 + 172 + type appBskyActorProfile$schematype = typeof _appBskyActorProfileSchema; 173 + type hydrateCardsRecord$schematype = typeof _hydrateCardsRecordSchema; 174 + type main$schematype = typeof _mainSchema; 175 + type profileEntry$schematype = typeof _profileEntrySchema; 176 + 177 + export interface appBskyActorProfileSchema extends appBskyActorProfile$schematype {} 178 + export interface hydrateCardsRecordSchema extends hydrateCardsRecord$schematype {} 179 + export interface mainSchema extends main$schematype {} 180 + export interface profileEntrySchema extends profileEntry$schematype {} 181 + 182 + export const appBskyActorProfileSchema = 183 + _appBskyActorProfileSchema as appBskyActorProfileSchema; 184 + export const hydrateCardsRecordSchema = 185 + _hydrateCardsRecordSchema as hydrateCardsRecordSchema; 186 + export const mainSchema = _mainSchema as mainSchema; 187 + export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; 188 + 189 + export interface AppBskyActorProfile extends v.InferInput< 190 + typeof appBskyActorProfileSchema 191 + > {} 192 + export interface HydrateCardsRecord extends v.InferInput< 193 + typeof hydrateCardsRecordSchema 194 + > {} 195 + export interface ProfileEntry extends v.InferInput<typeof profileEntrySchema> {} 196 + 197 + export interface $params extends v.InferInput<mainSchema["params"]> {} 198 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 199 + 200 + declare module "@atcute/lexicons/ambient" { 201 + interface XRPCQueries { 202 + "org.latha.strata.collection.getRecord": mainSchema; 203 + } 204 + }
+259
src/lexicon-types/types/org/latha/strata/collection/listRecords.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + import * as ComAtprotoLabelDefs from "@atcute/atproto/types/label/defs"; 5 + import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 6 + import * as NetworkCosmikCard from "../../../../network/cosmik/card.js"; 7 + import * as NetworkCosmikCollection from "../../../../network/cosmik/collection.js"; 8 + 9 + const _appBskyActorProfileSchema = /*#__PURE__*/ v.object({ 10 + $type: /*#__PURE__*/ v.optional( 11 + /*#__PURE__*/ v.literal( 12 + "org.latha.strata.collection.listRecords#appBskyActorProfile", 13 + ), 14 + ), 15 + /** 16 + * Small image to be displayed next to posts from account. AKA, 'profile picture' 17 + * @accept image/png, image/jpeg 18 + * @maxSize 1000000 19 + */ 20 + avatar: /*#__PURE__*/ v.optional( 21 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 22 + /*#__PURE__*/ v.blobSize(1000000), 23 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 24 + ]), 25 + ), 26 + /** 27 + * Larger horizontal image to display behind profile view. 28 + * @accept image/png, image/jpeg 29 + * @maxSize 1000000 30 + */ 31 + banner: /*#__PURE__*/ v.optional( 32 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 33 + /*#__PURE__*/ v.blobSize(1000000), 34 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 35 + ]), 36 + ), 37 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 38 + /** 39 + * Free-form profile description text. 40 + * @maxLength 2560 41 + * @maxGraphemes 256 42 + */ 43 + description: /*#__PURE__*/ v.optional( 44 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 45 + /*#__PURE__*/ v.stringLength(0, 2560), 46 + /*#__PURE__*/ v.stringGraphemes(0, 256), 47 + ]), 48 + ), 49 + /** 50 + * @maxLength 640 51 + * @maxGraphemes 64 52 + */ 53 + displayName: /*#__PURE__*/ v.optional( 54 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 55 + /*#__PURE__*/ v.stringLength(0, 640), 56 + /*#__PURE__*/ v.stringGraphemes(0, 64), 57 + ]), 58 + ), 59 + get joinedViaStarterPack() { 60 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 61 + }, 62 + /** 63 + * Self-label values, specific to the Bluesky application, on the overall account. 64 + */ 65 + get labels() { 66 + return /*#__PURE__*/ v.optional( 67 + /*#__PURE__*/ v.variant([ComAtprotoLabelDefs.selfLabelsSchema]), 68 + ); 69 + }, 70 + get pinnedPost() { 71 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 72 + }, 73 + /** 74 + * Free-form pronouns text. 75 + * @maxLength 200 76 + * @maxGraphemes 20 77 + */ 78 + pronouns: /*#__PURE__*/ v.optional( 79 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 80 + /*#__PURE__*/ v.stringLength(0, 200), 81 + /*#__PURE__*/ v.stringGraphemes(0, 20), 82 + ]), 83 + ), 84 + website: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 85 + }); 86 + const _hydrateCardsRecordSchema = /*#__PURE__*/ v.object({ 87 + $type: /*#__PURE__*/ v.optional( 88 + /*#__PURE__*/ v.literal( 89 + "org.latha.strata.collection.listRecords#hydrateCardsRecord", 90 + ), 91 + ), 92 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 93 + collection: /*#__PURE__*/ v.nsidString(), 94 + did: /*#__PURE__*/ v.didString(), 95 + get record() { 96 + return /*#__PURE__*/ v.optional(NetworkCosmikCard.mainSchema); 97 + }, 98 + rkey: /*#__PURE__*/ v.string(), 99 + time_us: /*#__PURE__*/ v.integer(), 100 + uri: /*#__PURE__*/ v.resourceUriString(), 101 + }); 102 + const _mainSchema = /*#__PURE__*/ v.query( 103 + "org.latha.strata.collection.listRecords", 104 + { 105 + params: /*#__PURE__*/ v.object({ 106 + /** 107 + * Filter by accessType 108 + */ 109 + accessType: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 110 + /** 111 + * Filter by DID or handle (triggers on-demand backfill) 112 + */ 113 + actor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.actorIdentifierString()), 114 + /** 115 + * Minimum total cards count 116 + */ 117 + cardsCountMin: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.integer()), 118 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 119 + /** 120 + * Number of cards records to embed per record 121 + * @minimum 1 122 + * @maximum 50 123 + */ 124 + hydrateCards: /*#__PURE__*/ v.optional( 125 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ 126 + /*#__PURE__*/ v.integerRange(1, 50), 127 + ]), 128 + ), 129 + /** 130 + * @minimum 1 131 + * @maximum 200 132 + * @default 50 133 + */ 134 + limit: /*#__PURE__*/ v.optional( 135 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ 136 + /*#__PURE__*/ v.integerRange(1, 200), 137 + ]), 138 + 50, 139 + ), 140 + /** 141 + * Filter by name 142 + */ 143 + name: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 144 + /** 145 + * Sort direction (default: desc for dates/numbers/counts, asc for strings) 146 + */ 147 + order: /*#__PURE__*/ v.optional( 148 + /*#__PURE__*/ v.string<"asc" | "desc" | (string & {})>(), 149 + ), 150 + /** 151 + * Include profile + identity info keyed by DID 152 + */ 153 + profiles: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), 154 + /** 155 + * Full-text search across: name, description 156 + */ 157 + search: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 158 + /** 159 + * Field to sort by (default: time_us) 160 + */ 161 + sort: /*#__PURE__*/ v.optional( 162 + /*#__PURE__*/ v.string< 163 + "accessType" | "cardsCount" | "name" | (string & {}) 164 + >(), 165 + ), 166 + }), 167 + output: { 168 + type: "lex", 169 + schema: /*#__PURE__*/ v.object({ 170 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 171 + get profiles() { 172 + return /*#__PURE__*/ v.optional( 173 + /*#__PURE__*/ v.array(profileEntrySchema), 174 + ); 175 + }, 176 + get records() { 177 + return /*#__PURE__*/ v.array(recordSchema); 178 + }, 179 + }), 180 + }, 181 + }, 182 + ); 183 + const _profileEntrySchema = /*#__PURE__*/ v.object({ 184 + $type: /*#__PURE__*/ v.optional( 185 + /*#__PURE__*/ v.literal( 186 + "org.latha.strata.collection.listRecords#profileEntry", 187 + ), 188 + ), 189 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), 190 + collection: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), 191 + did: /*#__PURE__*/ v.didString(), 192 + handle: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 193 + rkey: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 194 + uri: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), 195 + get value() { 196 + return /*#__PURE__*/ v.optional(appBskyActorProfileSchema); 197 + }, 198 + }); 199 + const _recordSchema = /*#__PURE__*/ v.object({ 200 + $type: /*#__PURE__*/ v.optional( 201 + /*#__PURE__*/ v.literal("org.latha.strata.collection.listRecords#record"), 202 + ), 203 + get cards() { 204 + return /*#__PURE__*/ v.optional( 205 + /*#__PURE__*/ v.array(hydrateCardsRecordSchema), 206 + ); 207 + }, 208 + /** 209 + * Total cards count 210 + */ 211 + cardsCount: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.integer()), 212 + cid: /*#__PURE__*/ v.cidString(), 213 + collection: /*#__PURE__*/ v.nsidString(), 214 + did: /*#__PURE__*/ v.didString(), 215 + rkey: /*#__PURE__*/ v.string(), 216 + time_us: /*#__PURE__*/ v.integer(), 217 + uri: /*#__PURE__*/ v.resourceUriString(), 218 + get value() { 219 + return NetworkCosmikCollection.mainSchema; 220 + }, 221 + }); 222 + 223 + type appBskyActorProfile$schematype = typeof _appBskyActorProfileSchema; 224 + type hydrateCardsRecord$schematype = typeof _hydrateCardsRecordSchema; 225 + type main$schematype = typeof _mainSchema; 226 + type profileEntry$schematype = typeof _profileEntrySchema; 227 + type record$schematype = typeof _recordSchema; 228 + 229 + export interface appBskyActorProfileSchema extends appBskyActorProfile$schematype {} 230 + export interface hydrateCardsRecordSchema extends hydrateCardsRecord$schematype {} 231 + export interface mainSchema extends main$schematype {} 232 + export interface profileEntrySchema extends profileEntry$schematype {} 233 + export interface recordSchema extends record$schematype {} 234 + 235 + export const appBskyActorProfileSchema = 236 + _appBskyActorProfileSchema as appBskyActorProfileSchema; 237 + export const hydrateCardsRecordSchema = 238 + _hydrateCardsRecordSchema as hydrateCardsRecordSchema; 239 + export const mainSchema = _mainSchema as mainSchema; 240 + export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; 241 + export const recordSchema = _recordSchema as recordSchema; 242 + 243 + export interface AppBskyActorProfile extends v.InferInput< 244 + typeof appBskyActorProfileSchema 245 + > {} 246 + export interface HydrateCardsRecord extends v.InferInput< 247 + typeof hydrateCardsRecordSchema 248 + > {} 249 + export interface ProfileEntry extends v.InferInput<typeof profileEntrySchema> {} 250 + export interface Record extends v.InferInput<typeof recordSchema> {} 251 + 252 + export interface $params extends v.InferInput<mainSchema["params"]> {} 253 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 254 + 255 + declare module "@atcute/lexicons/ambient" { 256 + interface XRPCQueries { 257 + "org.latha.strata.collection.listRecords": mainSchema; 258 + } 259 + }
+161
src/lexicon-types/types/org/latha/strata/connection/getRecord.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + import * as ComAtprotoLabelDefs from "@atcute/atproto/types/label/defs"; 5 + import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 6 + import * as NetworkCosmikConnection from "../../../../network/cosmik/connection.js"; 7 + 8 + const _appBskyActorProfileSchema = /*#__PURE__*/ v.object({ 9 + $type: /*#__PURE__*/ v.optional( 10 + /*#__PURE__*/ v.literal( 11 + "org.latha.strata.connection.getRecord#appBskyActorProfile", 12 + ), 13 + ), 14 + /** 15 + * Small image to be displayed next to posts from account. AKA, 'profile picture' 16 + * @accept image/png, image/jpeg 17 + * @maxSize 1000000 18 + */ 19 + avatar: /*#__PURE__*/ v.optional( 20 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 21 + /*#__PURE__*/ v.blobSize(1000000), 22 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 23 + ]), 24 + ), 25 + /** 26 + * Larger horizontal image to display behind profile view. 27 + * @accept image/png, image/jpeg 28 + * @maxSize 1000000 29 + */ 30 + banner: /*#__PURE__*/ v.optional( 31 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 32 + /*#__PURE__*/ v.blobSize(1000000), 33 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 34 + ]), 35 + ), 36 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 37 + /** 38 + * Free-form profile description text. 39 + * @maxLength 2560 40 + * @maxGraphemes 256 41 + */ 42 + description: /*#__PURE__*/ v.optional( 43 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 44 + /*#__PURE__*/ v.stringLength(0, 2560), 45 + /*#__PURE__*/ v.stringGraphemes(0, 256), 46 + ]), 47 + ), 48 + /** 49 + * @maxLength 640 50 + * @maxGraphemes 64 51 + */ 52 + displayName: /*#__PURE__*/ v.optional( 53 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 54 + /*#__PURE__*/ v.stringLength(0, 640), 55 + /*#__PURE__*/ v.stringGraphemes(0, 64), 56 + ]), 57 + ), 58 + get joinedViaStarterPack() { 59 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 60 + }, 61 + /** 62 + * Self-label values, specific to the Bluesky application, on the overall account. 63 + */ 64 + get labels() { 65 + return /*#__PURE__*/ v.optional( 66 + /*#__PURE__*/ v.variant([ComAtprotoLabelDefs.selfLabelsSchema]), 67 + ); 68 + }, 69 + get pinnedPost() { 70 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 71 + }, 72 + /** 73 + * Free-form pronouns text. 74 + * @maxLength 200 75 + * @maxGraphemes 20 76 + */ 77 + pronouns: /*#__PURE__*/ v.optional( 78 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 79 + /*#__PURE__*/ v.stringLength(0, 200), 80 + /*#__PURE__*/ v.stringGraphemes(0, 20), 81 + ]), 82 + ), 83 + website: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 84 + }); 85 + const _mainSchema = /*#__PURE__*/ v.query( 86 + "org.latha.strata.connection.getRecord", 87 + { 88 + params: /*#__PURE__*/ v.object({ 89 + /** 90 + * Include profile + identity info keyed by DID 91 + */ 92 + profiles: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), 93 + /** 94 + * AT URI of the record 95 + */ 96 + uri: /*#__PURE__*/ v.resourceUriString(), 97 + }), 98 + output: { 99 + type: "lex", 100 + schema: /*#__PURE__*/ v.object({ 101 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), 102 + collection: /*#__PURE__*/ v.nsidString(), 103 + did: /*#__PURE__*/ v.didString(), 104 + get profiles() { 105 + return /*#__PURE__*/ v.optional( 106 + /*#__PURE__*/ v.array(profileEntrySchema), 107 + ); 108 + }, 109 + rkey: /*#__PURE__*/ v.string(), 110 + time_us: /*#__PURE__*/ v.integer(), 111 + uri: /*#__PURE__*/ v.resourceUriString(), 112 + get value() { 113 + return NetworkCosmikConnection.mainSchema; 114 + }, 115 + }), 116 + }, 117 + }, 118 + ); 119 + const _profileEntrySchema = /*#__PURE__*/ v.object({ 120 + $type: /*#__PURE__*/ v.optional( 121 + /*#__PURE__*/ v.literal( 122 + "org.latha.strata.connection.getRecord#profileEntry", 123 + ), 124 + ), 125 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), 126 + collection: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), 127 + did: /*#__PURE__*/ v.didString(), 128 + handle: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 129 + rkey: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 130 + uri: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), 131 + get value() { 132 + return /*#__PURE__*/ v.optional(appBskyActorProfileSchema); 133 + }, 134 + }); 135 + 136 + type appBskyActorProfile$schematype = typeof _appBskyActorProfileSchema; 137 + type main$schematype = typeof _mainSchema; 138 + type profileEntry$schematype = typeof _profileEntrySchema; 139 + 140 + export interface appBskyActorProfileSchema extends appBskyActorProfile$schematype {} 141 + export interface mainSchema extends main$schematype {} 142 + export interface profileEntrySchema extends profileEntry$schematype {} 143 + 144 + export const appBskyActorProfileSchema = 145 + _appBskyActorProfileSchema as appBskyActorProfileSchema; 146 + export const mainSchema = _mainSchema as mainSchema; 147 + export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; 148 + 149 + export interface AppBskyActorProfile extends v.InferInput< 150 + typeof appBskyActorProfileSchema 151 + > {} 152 + export interface ProfileEntry extends v.InferInput<typeof profileEntrySchema> {} 153 + 154 + export interface $params extends v.InferInput<mainSchema["params"]> {} 155 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 156 + 157 + declare module "@atcute/lexicons/ambient" { 158 + interface XRPCQueries { 159 + "org.latha.strata.connection.getRecord": mainSchema; 160 + } 161 + }
+216
src/lexicon-types/types/org/latha/strata/connection/listRecords.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + import * as ComAtprotoLabelDefs from "@atcute/atproto/types/label/defs"; 5 + import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 6 + import * as NetworkCosmikConnection from "../../../../network/cosmik/connection.js"; 7 + 8 + const _appBskyActorProfileSchema = /*#__PURE__*/ v.object({ 9 + $type: /*#__PURE__*/ v.optional( 10 + /*#__PURE__*/ v.literal( 11 + "org.latha.strata.connection.listRecords#appBskyActorProfile", 12 + ), 13 + ), 14 + /** 15 + * Small image to be displayed next to posts from account. AKA, 'profile picture' 16 + * @accept image/png, image/jpeg 17 + * @maxSize 1000000 18 + */ 19 + avatar: /*#__PURE__*/ v.optional( 20 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 21 + /*#__PURE__*/ v.blobSize(1000000), 22 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 23 + ]), 24 + ), 25 + /** 26 + * Larger horizontal image to display behind profile view. 27 + * @accept image/png, image/jpeg 28 + * @maxSize 1000000 29 + */ 30 + banner: /*#__PURE__*/ v.optional( 31 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 32 + /*#__PURE__*/ v.blobSize(1000000), 33 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 34 + ]), 35 + ), 36 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 37 + /** 38 + * Free-form profile description text. 39 + * @maxLength 2560 40 + * @maxGraphemes 256 41 + */ 42 + description: /*#__PURE__*/ v.optional( 43 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 44 + /*#__PURE__*/ v.stringLength(0, 2560), 45 + /*#__PURE__*/ v.stringGraphemes(0, 256), 46 + ]), 47 + ), 48 + /** 49 + * @maxLength 640 50 + * @maxGraphemes 64 51 + */ 52 + displayName: /*#__PURE__*/ v.optional( 53 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 54 + /*#__PURE__*/ v.stringLength(0, 640), 55 + /*#__PURE__*/ v.stringGraphemes(0, 64), 56 + ]), 57 + ), 58 + get joinedViaStarterPack() { 59 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 60 + }, 61 + /** 62 + * Self-label values, specific to the Bluesky application, on the overall account. 63 + */ 64 + get labels() { 65 + return /*#__PURE__*/ v.optional( 66 + /*#__PURE__*/ v.variant([ComAtprotoLabelDefs.selfLabelsSchema]), 67 + ); 68 + }, 69 + get pinnedPost() { 70 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 71 + }, 72 + /** 73 + * Free-form pronouns text. 74 + * @maxLength 200 75 + * @maxGraphemes 20 76 + */ 77 + pronouns: /*#__PURE__*/ v.optional( 78 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 79 + /*#__PURE__*/ v.stringLength(0, 200), 80 + /*#__PURE__*/ v.stringGraphemes(0, 20), 81 + ]), 82 + ), 83 + website: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 84 + }); 85 + const _mainSchema = /*#__PURE__*/ v.query( 86 + "org.latha.strata.connection.listRecords", 87 + { 88 + params: /*#__PURE__*/ v.object({ 89 + /** 90 + * Filter by DID or handle (triggers on-demand backfill) 91 + */ 92 + actor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.actorIdentifierString()), 93 + /** 94 + * Filter by connectionType 95 + */ 96 + connectionType: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 97 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 98 + /** 99 + * @minimum 1 100 + * @maximum 200 101 + * @default 50 102 + */ 103 + limit: /*#__PURE__*/ v.optional( 104 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ 105 + /*#__PURE__*/ v.integerRange(1, 200), 106 + ]), 107 + 50, 108 + ), 109 + /** 110 + * Sort direction (default: desc for dates/numbers/counts, asc for strings) 111 + */ 112 + order: /*#__PURE__*/ v.optional( 113 + /*#__PURE__*/ v.string<"asc" | "desc" | (string & {})>(), 114 + ), 115 + /** 116 + * Include profile + identity info keyed by DID 117 + */ 118 + profiles: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), 119 + /** 120 + * Full-text search across: note 121 + */ 122 + search: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 123 + /** 124 + * Field to sort by (default: time_us) 125 + */ 126 + sort: /*#__PURE__*/ v.optional( 127 + /*#__PURE__*/ v.string< 128 + "connectionType" | "source" | "target" | (string & {}) 129 + >(), 130 + ), 131 + /** 132 + * Filter by source 133 + */ 134 + source: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 135 + /** 136 + * Filter by target 137 + */ 138 + target: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 139 + }), 140 + output: { 141 + type: "lex", 142 + schema: /*#__PURE__*/ v.object({ 143 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 144 + get profiles() { 145 + return /*#__PURE__*/ v.optional( 146 + /*#__PURE__*/ v.array(profileEntrySchema), 147 + ); 148 + }, 149 + get records() { 150 + return /*#__PURE__*/ v.array(recordSchema); 151 + }, 152 + }), 153 + }, 154 + }, 155 + ); 156 + const _profileEntrySchema = /*#__PURE__*/ v.object({ 157 + $type: /*#__PURE__*/ v.optional( 158 + /*#__PURE__*/ v.literal( 159 + "org.latha.strata.connection.listRecords#profileEntry", 160 + ), 161 + ), 162 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), 163 + collection: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), 164 + did: /*#__PURE__*/ v.didString(), 165 + handle: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 166 + rkey: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 167 + uri: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), 168 + get value() { 169 + return /*#__PURE__*/ v.optional(appBskyActorProfileSchema); 170 + }, 171 + }); 172 + const _recordSchema = /*#__PURE__*/ v.object({ 173 + $type: /*#__PURE__*/ v.optional( 174 + /*#__PURE__*/ v.literal("org.latha.strata.connection.listRecords#record"), 175 + ), 176 + cid: /*#__PURE__*/ v.cidString(), 177 + collection: /*#__PURE__*/ v.nsidString(), 178 + did: /*#__PURE__*/ v.didString(), 179 + rkey: /*#__PURE__*/ v.string(), 180 + time_us: /*#__PURE__*/ v.integer(), 181 + uri: /*#__PURE__*/ v.resourceUriString(), 182 + get value() { 183 + return NetworkCosmikConnection.mainSchema; 184 + }, 185 + }); 186 + 187 + type appBskyActorProfile$schematype = typeof _appBskyActorProfileSchema; 188 + type main$schematype = typeof _mainSchema; 189 + type profileEntry$schematype = typeof _profileEntrySchema; 190 + type record$schematype = typeof _recordSchema; 191 + 192 + export interface appBskyActorProfileSchema extends appBskyActorProfile$schematype {} 193 + export interface mainSchema extends main$schematype {} 194 + export interface profileEntrySchema extends profileEntry$schematype {} 195 + export interface recordSchema extends record$schematype {} 196 + 197 + export const appBskyActorProfileSchema = 198 + _appBskyActorProfileSchema as appBskyActorProfileSchema; 199 + export const mainSchema = _mainSchema as mainSchema; 200 + export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; 201 + export const recordSchema = _recordSchema as recordSchema; 202 + 203 + export interface AppBskyActorProfile extends v.InferInput< 204 + typeof appBskyActorProfileSchema 205 + > {} 206 + export interface ProfileEntry extends v.InferInput<typeof profileEntrySchema> {} 207 + export interface Record extends v.InferInput<typeof recordSchema> {} 208 + 209 + export interface $params extends v.InferInput<mainSchema["params"]> {} 210 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 211 + 212 + declare module "@atcute/lexicons/ambient" { 213 + interface XRPCQueries { 214 + "org.latha.strata.connection.listRecords": mainSchema; 215 + } 216 + }
+153
src/lexicon-types/types/org/latha/strata/entity/getRecord.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + import * as ComAtprotoLabelDefs from "@atcute/atproto/types/label/defs"; 5 + import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 6 + 7 + const _appBskyActorProfileSchema = /*#__PURE__*/ v.object({ 8 + $type: /*#__PURE__*/ v.optional( 9 + /*#__PURE__*/ v.literal( 10 + "org.latha.strata.entity.getRecord#appBskyActorProfile", 11 + ), 12 + ), 13 + /** 14 + * Small image to be displayed next to posts from account. AKA, 'profile picture' 15 + * @accept image/png, image/jpeg 16 + * @maxSize 1000000 17 + */ 18 + avatar: /*#__PURE__*/ v.optional( 19 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 20 + /*#__PURE__*/ v.blobSize(1000000), 21 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 22 + ]), 23 + ), 24 + /** 25 + * Larger horizontal image to display behind profile view. 26 + * @accept image/png, image/jpeg 27 + * @maxSize 1000000 28 + */ 29 + banner: /*#__PURE__*/ v.optional( 30 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 31 + /*#__PURE__*/ v.blobSize(1000000), 32 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 33 + ]), 34 + ), 35 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 36 + /** 37 + * Free-form profile description text. 38 + * @maxLength 2560 39 + * @maxGraphemes 256 40 + */ 41 + description: /*#__PURE__*/ v.optional( 42 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 43 + /*#__PURE__*/ v.stringLength(0, 2560), 44 + /*#__PURE__*/ v.stringGraphemes(0, 256), 45 + ]), 46 + ), 47 + /** 48 + * @maxLength 640 49 + * @maxGraphemes 64 50 + */ 51 + displayName: /*#__PURE__*/ v.optional( 52 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 53 + /*#__PURE__*/ v.stringLength(0, 640), 54 + /*#__PURE__*/ v.stringGraphemes(0, 64), 55 + ]), 56 + ), 57 + get joinedViaStarterPack() { 58 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 59 + }, 60 + /** 61 + * Self-label values, specific to the Bluesky application, on the overall account. 62 + */ 63 + get labels() { 64 + return /*#__PURE__*/ v.optional( 65 + /*#__PURE__*/ v.variant([ComAtprotoLabelDefs.selfLabelsSchema]), 66 + ); 67 + }, 68 + get pinnedPost() { 69 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 70 + }, 71 + /** 72 + * Free-form pronouns text. 73 + * @maxLength 200 74 + * @maxGraphemes 20 75 + */ 76 + pronouns: /*#__PURE__*/ v.optional( 77 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 78 + /*#__PURE__*/ v.stringLength(0, 200), 79 + /*#__PURE__*/ v.stringGraphemes(0, 20), 80 + ]), 81 + ), 82 + website: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 83 + }); 84 + const _mainSchema = /*#__PURE__*/ v.query("org.latha.strata.entity.getRecord", { 85 + params: /*#__PURE__*/ v.object({ 86 + /** 87 + * Include profile + identity info keyed by DID 88 + */ 89 + profiles: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), 90 + /** 91 + * AT URI of the record 92 + */ 93 + uri: /*#__PURE__*/ v.resourceUriString(), 94 + }), 95 + output: { 96 + type: "lex", 97 + schema: /*#__PURE__*/ v.object({ 98 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), 99 + collection: /*#__PURE__*/ v.nsidString(), 100 + did: /*#__PURE__*/ v.didString(), 101 + get profiles() { 102 + return /*#__PURE__*/ v.optional( 103 + /*#__PURE__*/ v.array(profileEntrySchema), 104 + ); 105 + }, 106 + rkey: /*#__PURE__*/ v.string(), 107 + time_us: /*#__PURE__*/ v.integer(), 108 + uri: /*#__PURE__*/ v.resourceUriString(), 109 + value: /*#__PURE__*/ v.unknown(), 110 + }), 111 + }, 112 + }); 113 + const _profileEntrySchema = /*#__PURE__*/ v.object({ 114 + $type: /*#__PURE__*/ v.optional( 115 + /*#__PURE__*/ v.literal("org.latha.strata.entity.getRecord#profileEntry"), 116 + ), 117 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), 118 + collection: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), 119 + did: /*#__PURE__*/ v.didString(), 120 + handle: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 121 + rkey: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 122 + uri: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), 123 + get value() { 124 + return /*#__PURE__*/ v.optional(appBskyActorProfileSchema); 125 + }, 126 + }); 127 + 128 + type appBskyActorProfile$schematype = typeof _appBskyActorProfileSchema; 129 + type main$schematype = typeof _mainSchema; 130 + type profileEntry$schematype = typeof _profileEntrySchema; 131 + 132 + export interface appBskyActorProfileSchema extends appBskyActorProfile$schematype {} 133 + export interface mainSchema extends main$schematype {} 134 + export interface profileEntrySchema extends profileEntry$schematype {} 135 + 136 + export const appBskyActorProfileSchema = 137 + _appBskyActorProfileSchema as appBskyActorProfileSchema; 138 + export const mainSchema = _mainSchema as mainSchema; 139 + export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; 140 + 141 + export interface AppBskyActorProfile extends v.InferInput< 142 + typeof appBskyActorProfileSchema 143 + > {} 144 + export interface ProfileEntry extends v.InferInput<typeof profileEntrySchema> {} 145 + 146 + export interface $params extends v.InferInput<mainSchema["params"]> {} 147 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 148 + 149 + declare module "@atcute/lexicons/ambient" { 150 + interface XRPCQueries { 151 + "org.latha.strata.entity.getRecord": mainSchema; 152 + } 153 + }
+205
src/lexicon-types/types/org/latha/strata/entity/listRecords.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + import * as ComAtprotoLabelDefs from "@atcute/atproto/types/label/defs"; 5 + import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 6 + 7 + const _appBskyActorProfileSchema = /*#__PURE__*/ v.object({ 8 + $type: /*#__PURE__*/ v.optional( 9 + /*#__PURE__*/ v.literal( 10 + "org.latha.strata.entity.listRecords#appBskyActorProfile", 11 + ), 12 + ), 13 + /** 14 + * Small image to be displayed next to posts from account. AKA, 'profile picture' 15 + * @accept image/png, image/jpeg 16 + * @maxSize 1000000 17 + */ 18 + avatar: /*#__PURE__*/ v.optional( 19 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 20 + /*#__PURE__*/ v.blobSize(1000000), 21 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 22 + ]), 23 + ), 24 + /** 25 + * Larger horizontal image to display behind profile view. 26 + * @accept image/png, image/jpeg 27 + * @maxSize 1000000 28 + */ 29 + banner: /*#__PURE__*/ v.optional( 30 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 31 + /*#__PURE__*/ v.blobSize(1000000), 32 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 33 + ]), 34 + ), 35 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 36 + /** 37 + * Free-form profile description text. 38 + * @maxLength 2560 39 + * @maxGraphemes 256 40 + */ 41 + description: /*#__PURE__*/ v.optional( 42 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 43 + /*#__PURE__*/ v.stringLength(0, 2560), 44 + /*#__PURE__*/ v.stringGraphemes(0, 256), 45 + ]), 46 + ), 47 + /** 48 + * @maxLength 640 49 + * @maxGraphemes 64 50 + */ 51 + displayName: /*#__PURE__*/ v.optional( 52 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 53 + /*#__PURE__*/ v.stringLength(0, 640), 54 + /*#__PURE__*/ v.stringGraphemes(0, 64), 55 + ]), 56 + ), 57 + get joinedViaStarterPack() { 58 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 59 + }, 60 + /** 61 + * Self-label values, specific to the Bluesky application, on the overall account. 62 + */ 63 + get labels() { 64 + return /*#__PURE__*/ v.optional( 65 + /*#__PURE__*/ v.variant([ComAtprotoLabelDefs.selfLabelsSchema]), 66 + ); 67 + }, 68 + get pinnedPost() { 69 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 70 + }, 71 + /** 72 + * Free-form pronouns text. 73 + * @maxLength 200 74 + * @maxGraphemes 20 75 + */ 76 + pronouns: /*#__PURE__*/ v.optional( 77 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 78 + /*#__PURE__*/ v.stringLength(0, 200), 79 + /*#__PURE__*/ v.stringGraphemes(0, 20), 80 + ]), 81 + ), 82 + website: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 83 + }); 84 + const _mainSchema = /*#__PURE__*/ v.query( 85 + "org.latha.strata.entity.listRecords", 86 + { 87 + params: /*#__PURE__*/ v.object({ 88 + /** 89 + * Filter by DID or handle (triggers on-demand backfill) 90 + */ 91 + actor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.actorIdentifierString()), 92 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 93 + /** 94 + * Filter by entityType 95 + */ 96 + entityType: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 97 + /** 98 + * @minimum 1 99 + * @maximum 200 100 + * @default 50 101 + */ 102 + limit: /*#__PURE__*/ v.optional( 103 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ 104 + /*#__PURE__*/ v.integerRange(1, 200), 105 + ]), 106 + 50, 107 + ), 108 + /** 109 + * Filter by name 110 + */ 111 + name: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 112 + /** 113 + * Sort direction (default: desc for dates/numbers/counts, asc for strings) 114 + */ 115 + order: /*#__PURE__*/ v.optional( 116 + /*#__PURE__*/ v.string<"asc" | "desc" | (string & {})>(), 117 + ), 118 + /** 119 + * Include profile + identity info keyed by DID 120 + */ 121 + profiles: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), 122 + /** 123 + * Full-text search across: name, description 124 + */ 125 + search: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 126 + /** 127 + * Field to sort by (default: time_us) 128 + */ 129 + sort: /*#__PURE__*/ v.optional( 130 + /*#__PURE__*/ v.string<"entityType" | "name" | (string & {})>(), 131 + ), 132 + }), 133 + output: { 134 + type: "lex", 135 + schema: /*#__PURE__*/ v.object({ 136 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 137 + get profiles() { 138 + return /*#__PURE__*/ v.optional( 139 + /*#__PURE__*/ v.array(profileEntrySchema), 140 + ); 141 + }, 142 + get records() { 143 + return /*#__PURE__*/ v.array(recordSchema); 144 + }, 145 + }), 146 + }, 147 + }, 148 + ); 149 + const _profileEntrySchema = /*#__PURE__*/ v.object({ 150 + $type: /*#__PURE__*/ v.optional( 151 + /*#__PURE__*/ v.literal("org.latha.strata.entity.listRecords#profileEntry"), 152 + ), 153 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), 154 + collection: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), 155 + did: /*#__PURE__*/ v.didString(), 156 + handle: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 157 + rkey: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 158 + uri: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), 159 + get value() { 160 + return /*#__PURE__*/ v.optional(appBskyActorProfileSchema); 161 + }, 162 + }); 163 + const _recordSchema = /*#__PURE__*/ v.object({ 164 + $type: /*#__PURE__*/ v.optional( 165 + /*#__PURE__*/ v.literal("org.latha.strata.entity.listRecords#record"), 166 + ), 167 + cid: /*#__PURE__*/ v.cidString(), 168 + collection: /*#__PURE__*/ v.nsidString(), 169 + did: /*#__PURE__*/ v.didString(), 170 + rkey: /*#__PURE__*/ v.string(), 171 + time_us: /*#__PURE__*/ v.integer(), 172 + uri: /*#__PURE__*/ v.resourceUriString(), 173 + value: /*#__PURE__*/ v.unknown(), 174 + }); 175 + 176 + type appBskyActorProfile$schematype = typeof _appBskyActorProfileSchema; 177 + type main$schematype = typeof _mainSchema; 178 + type profileEntry$schematype = typeof _profileEntrySchema; 179 + type record$schematype = typeof _recordSchema; 180 + 181 + export interface appBskyActorProfileSchema extends appBskyActorProfile$schematype {} 182 + export interface mainSchema extends main$schematype {} 183 + export interface profileEntrySchema extends profileEntry$schematype {} 184 + export interface recordSchema extends record$schematype {} 185 + 186 + export const appBskyActorProfileSchema = 187 + _appBskyActorProfileSchema as appBskyActorProfileSchema; 188 + export const mainSchema = _mainSchema as mainSchema; 189 + export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; 190 + export const recordSchema = _recordSchema as recordSchema; 191 + 192 + export interface AppBskyActorProfile extends v.InferInput< 193 + typeof appBskyActorProfileSchema 194 + > {} 195 + export interface ProfileEntry extends v.InferInput<typeof profileEntrySchema> {} 196 + export interface Record extends v.InferInput<typeof recordSchema> {} 197 + 198 + export interface $params extends v.InferInput<mainSchema["params"]> {} 199 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 200 + 201 + declare module "@atcute/lexicons/ambient" { 202 + interface XRPCQueries { 203 + "org.latha.strata.entity.listRecords": mainSchema; 204 + } 205 + }
+156
src/lexicon-types/types/org/latha/strata/follow/getRecord.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + import * as ComAtprotoLabelDefs from "@atcute/atproto/types/label/defs"; 5 + import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 6 + import * as NetworkCosmikFollow from "../../../../network/cosmik/follow.js"; 7 + 8 + const _appBskyActorProfileSchema = /*#__PURE__*/ v.object({ 9 + $type: /*#__PURE__*/ v.optional( 10 + /*#__PURE__*/ v.literal( 11 + "org.latha.strata.follow.getRecord#appBskyActorProfile", 12 + ), 13 + ), 14 + /** 15 + * Small image to be displayed next to posts from account. AKA, 'profile picture' 16 + * @accept image/png, image/jpeg 17 + * @maxSize 1000000 18 + */ 19 + avatar: /*#__PURE__*/ v.optional( 20 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 21 + /*#__PURE__*/ v.blobSize(1000000), 22 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 23 + ]), 24 + ), 25 + /** 26 + * Larger horizontal image to display behind profile view. 27 + * @accept image/png, image/jpeg 28 + * @maxSize 1000000 29 + */ 30 + banner: /*#__PURE__*/ v.optional( 31 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 32 + /*#__PURE__*/ v.blobSize(1000000), 33 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 34 + ]), 35 + ), 36 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 37 + /** 38 + * Free-form profile description text. 39 + * @maxLength 2560 40 + * @maxGraphemes 256 41 + */ 42 + description: /*#__PURE__*/ v.optional( 43 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 44 + /*#__PURE__*/ v.stringLength(0, 2560), 45 + /*#__PURE__*/ v.stringGraphemes(0, 256), 46 + ]), 47 + ), 48 + /** 49 + * @maxLength 640 50 + * @maxGraphemes 64 51 + */ 52 + displayName: /*#__PURE__*/ v.optional( 53 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 54 + /*#__PURE__*/ v.stringLength(0, 640), 55 + /*#__PURE__*/ v.stringGraphemes(0, 64), 56 + ]), 57 + ), 58 + get joinedViaStarterPack() { 59 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 60 + }, 61 + /** 62 + * Self-label values, specific to the Bluesky application, on the overall account. 63 + */ 64 + get labels() { 65 + return /*#__PURE__*/ v.optional( 66 + /*#__PURE__*/ v.variant([ComAtprotoLabelDefs.selfLabelsSchema]), 67 + ); 68 + }, 69 + get pinnedPost() { 70 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 71 + }, 72 + /** 73 + * Free-form pronouns text. 74 + * @maxLength 200 75 + * @maxGraphemes 20 76 + */ 77 + pronouns: /*#__PURE__*/ v.optional( 78 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 79 + /*#__PURE__*/ v.stringLength(0, 200), 80 + /*#__PURE__*/ v.stringGraphemes(0, 20), 81 + ]), 82 + ), 83 + website: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 84 + }); 85 + const _mainSchema = /*#__PURE__*/ v.query("org.latha.strata.follow.getRecord", { 86 + params: /*#__PURE__*/ v.object({ 87 + /** 88 + * Include profile + identity info keyed by DID 89 + */ 90 + profiles: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), 91 + /** 92 + * AT URI of the record 93 + */ 94 + uri: /*#__PURE__*/ v.resourceUriString(), 95 + }), 96 + output: { 97 + type: "lex", 98 + schema: /*#__PURE__*/ v.object({ 99 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), 100 + collection: /*#__PURE__*/ v.nsidString(), 101 + did: /*#__PURE__*/ v.didString(), 102 + get profiles() { 103 + return /*#__PURE__*/ v.optional( 104 + /*#__PURE__*/ v.array(profileEntrySchema), 105 + ); 106 + }, 107 + rkey: /*#__PURE__*/ v.string(), 108 + time_us: /*#__PURE__*/ v.integer(), 109 + uri: /*#__PURE__*/ v.resourceUriString(), 110 + get value() { 111 + return NetworkCosmikFollow.mainSchema; 112 + }, 113 + }), 114 + }, 115 + }); 116 + const _profileEntrySchema = /*#__PURE__*/ v.object({ 117 + $type: /*#__PURE__*/ v.optional( 118 + /*#__PURE__*/ v.literal("org.latha.strata.follow.getRecord#profileEntry"), 119 + ), 120 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), 121 + collection: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), 122 + did: /*#__PURE__*/ v.didString(), 123 + handle: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 124 + rkey: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 125 + uri: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), 126 + get value() { 127 + return /*#__PURE__*/ v.optional(appBskyActorProfileSchema); 128 + }, 129 + }); 130 + 131 + type appBskyActorProfile$schematype = typeof _appBskyActorProfileSchema; 132 + type main$schematype = typeof _mainSchema; 133 + type profileEntry$schematype = typeof _profileEntrySchema; 134 + 135 + export interface appBskyActorProfileSchema extends appBskyActorProfile$schematype {} 136 + export interface mainSchema extends main$schematype {} 137 + export interface profileEntrySchema extends profileEntry$schematype {} 138 + 139 + export const appBskyActorProfileSchema = 140 + _appBskyActorProfileSchema as appBskyActorProfileSchema; 141 + export const mainSchema = _mainSchema as mainSchema; 142 + export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; 143 + 144 + export interface AppBskyActorProfile extends v.InferInput< 145 + typeof appBskyActorProfileSchema 146 + > {} 147 + export interface ProfileEntry extends v.InferInput<typeof profileEntrySchema> {} 148 + 149 + export interface $params extends v.InferInput<mainSchema["params"]> {} 150 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 151 + 152 + declare module "@atcute/lexicons/ambient" { 153 + interface XRPCQueries { 154 + "org.latha.strata.follow.getRecord": mainSchema; 155 + } 156 + }
+200
src/lexicon-types/types/org/latha/strata/follow/listRecords.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + import * as ComAtprotoLabelDefs from "@atcute/atproto/types/label/defs"; 5 + import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 6 + import * as NetworkCosmikFollow from "../../../../network/cosmik/follow.js"; 7 + 8 + const _appBskyActorProfileSchema = /*#__PURE__*/ v.object({ 9 + $type: /*#__PURE__*/ v.optional( 10 + /*#__PURE__*/ v.literal( 11 + "org.latha.strata.follow.listRecords#appBskyActorProfile", 12 + ), 13 + ), 14 + /** 15 + * Small image to be displayed next to posts from account. AKA, 'profile picture' 16 + * @accept image/png, image/jpeg 17 + * @maxSize 1000000 18 + */ 19 + avatar: /*#__PURE__*/ v.optional( 20 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 21 + /*#__PURE__*/ v.blobSize(1000000), 22 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 23 + ]), 24 + ), 25 + /** 26 + * Larger horizontal image to display behind profile view. 27 + * @accept image/png, image/jpeg 28 + * @maxSize 1000000 29 + */ 30 + banner: /*#__PURE__*/ v.optional( 31 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 32 + /*#__PURE__*/ v.blobSize(1000000), 33 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 34 + ]), 35 + ), 36 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 37 + /** 38 + * Free-form profile description text. 39 + * @maxLength 2560 40 + * @maxGraphemes 256 41 + */ 42 + description: /*#__PURE__*/ v.optional( 43 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 44 + /*#__PURE__*/ v.stringLength(0, 2560), 45 + /*#__PURE__*/ v.stringGraphemes(0, 256), 46 + ]), 47 + ), 48 + /** 49 + * @maxLength 640 50 + * @maxGraphemes 64 51 + */ 52 + displayName: /*#__PURE__*/ v.optional( 53 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 54 + /*#__PURE__*/ v.stringLength(0, 640), 55 + /*#__PURE__*/ v.stringGraphemes(0, 64), 56 + ]), 57 + ), 58 + get joinedViaStarterPack() { 59 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 60 + }, 61 + /** 62 + * Self-label values, specific to the Bluesky application, on the overall account. 63 + */ 64 + get labels() { 65 + return /*#__PURE__*/ v.optional( 66 + /*#__PURE__*/ v.variant([ComAtprotoLabelDefs.selfLabelsSchema]), 67 + ); 68 + }, 69 + get pinnedPost() { 70 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 71 + }, 72 + /** 73 + * Free-form pronouns text. 74 + * @maxLength 200 75 + * @maxGraphemes 20 76 + */ 77 + pronouns: /*#__PURE__*/ v.optional( 78 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 79 + /*#__PURE__*/ v.stringLength(0, 200), 80 + /*#__PURE__*/ v.stringGraphemes(0, 20), 81 + ]), 82 + ), 83 + website: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 84 + }); 85 + const _mainSchema = /*#__PURE__*/ v.query( 86 + "org.latha.strata.follow.listRecords", 87 + { 88 + params: /*#__PURE__*/ v.object({ 89 + /** 90 + * Filter by DID or handle (triggers on-demand backfill) 91 + */ 92 + actor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.actorIdentifierString()), 93 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 94 + /** 95 + * @minimum 1 96 + * @maximum 200 97 + * @default 50 98 + */ 99 + limit: /*#__PURE__*/ v.optional( 100 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ 101 + /*#__PURE__*/ v.integerRange(1, 200), 102 + ]), 103 + 50, 104 + ), 105 + /** 106 + * Sort direction (default: desc for dates/numbers/counts, asc for strings) 107 + */ 108 + order: /*#__PURE__*/ v.optional( 109 + /*#__PURE__*/ v.string<"asc" | "desc" | (string & {})>(), 110 + ), 111 + /** 112 + * Include profile + identity info keyed by DID 113 + */ 114 + profiles: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), 115 + /** 116 + * Field to sort by (default: time_us) 117 + */ 118 + sort: /*#__PURE__*/ v.optional( 119 + /*#__PURE__*/ v.string<"subject" | (string & {})>(), 120 + ), 121 + /** 122 + * Filter by subject 123 + */ 124 + subject: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 125 + }), 126 + output: { 127 + type: "lex", 128 + schema: /*#__PURE__*/ v.object({ 129 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 130 + get profiles() { 131 + return /*#__PURE__*/ v.optional( 132 + /*#__PURE__*/ v.array(profileEntrySchema), 133 + ); 134 + }, 135 + get records() { 136 + return /*#__PURE__*/ v.array(recordSchema); 137 + }, 138 + }), 139 + }, 140 + }, 141 + ); 142 + const _profileEntrySchema = /*#__PURE__*/ v.object({ 143 + $type: /*#__PURE__*/ v.optional( 144 + /*#__PURE__*/ v.literal("org.latha.strata.follow.listRecords#profileEntry"), 145 + ), 146 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), 147 + collection: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), 148 + did: /*#__PURE__*/ v.didString(), 149 + handle: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 150 + rkey: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 151 + uri: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), 152 + get value() { 153 + return /*#__PURE__*/ v.optional(appBskyActorProfileSchema); 154 + }, 155 + }); 156 + const _recordSchema = /*#__PURE__*/ v.object({ 157 + $type: /*#__PURE__*/ v.optional( 158 + /*#__PURE__*/ v.literal("org.latha.strata.follow.listRecords#record"), 159 + ), 160 + cid: /*#__PURE__*/ v.cidString(), 161 + collection: /*#__PURE__*/ v.nsidString(), 162 + did: /*#__PURE__*/ v.didString(), 163 + rkey: /*#__PURE__*/ v.string(), 164 + time_us: /*#__PURE__*/ v.integer(), 165 + uri: /*#__PURE__*/ v.resourceUriString(), 166 + get value() { 167 + return NetworkCosmikFollow.mainSchema; 168 + }, 169 + }); 170 + 171 + type appBskyActorProfile$schematype = typeof _appBskyActorProfileSchema; 172 + type main$schematype = typeof _mainSchema; 173 + type profileEntry$schematype = typeof _profileEntrySchema; 174 + type record$schematype = typeof _recordSchema; 175 + 176 + export interface appBskyActorProfileSchema extends appBskyActorProfile$schematype {} 177 + export interface mainSchema extends main$schematype {} 178 + export interface profileEntrySchema extends profileEntry$schematype {} 179 + export interface recordSchema extends record$schematype {} 180 + 181 + export const appBskyActorProfileSchema = 182 + _appBskyActorProfileSchema as appBskyActorProfileSchema; 183 + export const mainSchema = _mainSchema as mainSchema; 184 + export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; 185 + export const recordSchema = _recordSchema as recordSchema; 186 + 187 + export interface AppBskyActorProfile extends v.InferInput< 188 + typeof appBskyActorProfileSchema 189 + > {} 190 + export interface ProfileEntry extends v.InferInput<typeof profileEntrySchema> {} 191 + export interface Record extends v.InferInput<typeof recordSchema> {} 192 + 193 + export interface $params extends v.InferInput<mainSchema["params"]> {} 194 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 195 + 196 + declare module "@atcute/lexicons/ambient" { 197 + interface XRPCQueries { 198 + "org.latha.strata.follow.listRecords": mainSchema; 199 + } 200 + }
+30
src/lexicon-types/types/org/latha/strata/getCursor.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + 5 + const _mainSchema = /*#__PURE__*/ v.query("org.latha.strata.getCursor", { 6 + params: null, 7 + output: { 8 + type: "lex", 9 + schema: /*#__PURE__*/ v.object({ 10 + date: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 11 + seconds_ago: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.integer()), 12 + time_us: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.integer()), 13 + }), 14 + }, 15 + }); 16 + 17 + type main$schematype = typeof _mainSchema; 18 + 19 + export interface mainSchema extends main$schematype {} 20 + 21 + export const mainSchema = _mainSchema as mainSchema; 22 + 23 + export interface $params {} 24 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 25 + 26 + declare module "@atcute/lexicons/ambient" { 27 + interface XRPCQueries { 28 + "org.latha.strata.getCursor": mainSchema; 29 + } 30 + }
+47
src/lexicon-types/types/org/latha/strata/getOverview.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + 5 + const _collectionStatsSchema = /*#__PURE__*/ v.object({ 6 + $type: /*#__PURE__*/ v.optional( 7 + /*#__PURE__*/ v.literal("org.latha.strata.getOverview#collectionStats"), 8 + ), 9 + collection: /*#__PURE__*/ v.string(), 10 + records: /*#__PURE__*/ v.integer(), 11 + unique_users: /*#__PURE__*/ v.integer(), 12 + }); 13 + const _mainSchema = /*#__PURE__*/ v.query("org.latha.strata.getOverview", { 14 + params: null, 15 + output: { 16 + type: "lex", 17 + schema: /*#__PURE__*/ v.object({ 18 + get collections() { 19 + return /*#__PURE__*/ v.array(collectionStatsSchema); 20 + }, 21 + total_records: /*#__PURE__*/ v.integer(), 22 + }), 23 + }, 24 + }); 25 + 26 + type collectionStats$schematype = typeof _collectionStatsSchema; 27 + type main$schematype = typeof _mainSchema; 28 + 29 + export interface collectionStatsSchema extends collectionStats$schematype {} 30 + export interface mainSchema extends main$schematype {} 31 + 32 + export const collectionStatsSchema = 33 + _collectionStatsSchema as collectionStatsSchema; 34 + export const mainSchema = _mainSchema as mainSchema; 35 + 36 + export interface CollectionStats extends v.InferInput< 37 + typeof collectionStatsSchema 38 + > {} 39 + 40 + export interface $params {} 41 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 42 + 43 + declare module "@atcute/lexicons/ambient" { 44 + interface XRPCQueries { 45 + "org.latha.strata.getOverview": mainSchema; 46 + } 47 + }
+138
src/lexicon-types/types/org/latha/strata/getProfile.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + import * as ComAtprotoLabelDefs from "@atcute/atproto/types/label/defs"; 5 + import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 6 + 7 + const _appBskyActorProfileSchema = /*#__PURE__*/ v.object({ 8 + $type: /*#__PURE__*/ v.optional( 9 + /*#__PURE__*/ v.literal("org.latha.strata.getProfile#appBskyActorProfile"), 10 + ), 11 + /** 12 + * Small image to be displayed next to posts from account. AKA, 'profile picture' 13 + * @accept image/png, image/jpeg 14 + * @maxSize 1000000 15 + */ 16 + avatar: /*#__PURE__*/ v.optional( 17 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 18 + /*#__PURE__*/ v.blobSize(1000000), 19 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 20 + ]), 21 + ), 22 + /** 23 + * Larger horizontal image to display behind profile view. 24 + * @accept image/png, image/jpeg 25 + * @maxSize 1000000 26 + */ 27 + banner: /*#__PURE__*/ v.optional( 28 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 29 + /*#__PURE__*/ v.blobSize(1000000), 30 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 31 + ]), 32 + ), 33 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 34 + /** 35 + * Free-form profile description text. 36 + * @maxLength 2560 37 + * @maxGraphemes 256 38 + */ 39 + description: /*#__PURE__*/ v.optional( 40 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 41 + /*#__PURE__*/ v.stringLength(0, 2560), 42 + /*#__PURE__*/ v.stringGraphemes(0, 256), 43 + ]), 44 + ), 45 + /** 46 + * @maxLength 640 47 + * @maxGraphemes 64 48 + */ 49 + displayName: /*#__PURE__*/ v.optional( 50 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 51 + /*#__PURE__*/ v.stringLength(0, 640), 52 + /*#__PURE__*/ v.stringGraphemes(0, 64), 53 + ]), 54 + ), 55 + get joinedViaStarterPack() { 56 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 57 + }, 58 + /** 59 + * Self-label values, specific to the Bluesky application, on the overall account. 60 + */ 61 + get labels() { 62 + return /*#__PURE__*/ v.optional( 63 + /*#__PURE__*/ v.variant([ComAtprotoLabelDefs.selfLabelsSchema]), 64 + ); 65 + }, 66 + get pinnedPost() { 67 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 68 + }, 69 + /** 70 + * Free-form pronouns text. 71 + * @maxLength 200 72 + * @maxGraphemes 20 73 + */ 74 + pronouns: /*#__PURE__*/ v.optional( 75 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 76 + /*#__PURE__*/ v.stringLength(0, 200), 77 + /*#__PURE__*/ v.stringGraphemes(0, 20), 78 + ]), 79 + ), 80 + website: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 81 + }); 82 + const _mainSchema = /*#__PURE__*/ v.query("org.latha.strata.getProfile", { 83 + params: /*#__PURE__*/ v.object({ 84 + /** 85 + * DID or handle of the user 86 + */ 87 + actor: /*#__PURE__*/ v.actorIdentifierString(), 88 + }), 89 + output: { 90 + type: "lex", 91 + schema: /*#__PURE__*/ v.object({ 92 + get profiles() { 93 + return /*#__PURE__*/ v.array(profileEntrySchema); 94 + }, 95 + }), 96 + }, 97 + }); 98 + const _profileEntrySchema = /*#__PURE__*/ v.object({ 99 + $type: /*#__PURE__*/ v.optional( 100 + /*#__PURE__*/ v.literal("org.latha.strata.getProfile#profileEntry"), 101 + ), 102 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), 103 + collection: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), 104 + did: /*#__PURE__*/ v.didString(), 105 + handle: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 106 + rkey: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 107 + uri: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), 108 + get value() { 109 + return /*#__PURE__*/ v.optional(appBskyActorProfileSchema); 110 + }, 111 + }); 112 + 113 + type appBskyActorProfile$schematype = typeof _appBskyActorProfileSchema; 114 + type main$schematype = typeof _mainSchema; 115 + type profileEntry$schematype = typeof _profileEntrySchema; 116 + 117 + export interface appBskyActorProfileSchema extends appBskyActorProfile$schematype {} 118 + export interface mainSchema extends main$schematype {} 119 + export interface profileEntrySchema extends profileEntry$schematype {} 120 + 121 + export const appBskyActorProfileSchema = 122 + _appBskyActorProfileSchema as appBskyActorProfileSchema; 123 + export const mainSchema = _mainSchema as mainSchema; 124 + export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; 125 + 126 + export interface AppBskyActorProfile extends v.InferInput< 127 + typeof appBskyActorProfileSchema 128 + > {} 129 + export interface ProfileEntry extends v.InferInput<typeof profileEntrySchema> {} 130 + 131 + export interface $params extends v.InferInput<mainSchema["params"]> {} 132 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 133 + 134 + declare module "@atcute/lexicons/ambient" { 135 + interface XRPCQueries { 136 + "org.latha.strata.getProfile": mainSchema; 137 + } 138 + }
+64
src/lexicon-types/types/org/latha/strata/notifyOfUpdate.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + 5 + const _mainSchema = /*#__PURE__*/ v.procedure( 6 + "org.latha.strata.notifyOfUpdate", 7 + { 8 + params: null, 9 + input: { 10 + type: "lex", 11 + schema: /*#__PURE__*/ v.object({ 12 + /** 13 + * Single AT URI to fetch and index 14 + */ 15 + uri: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), 16 + /** 17 + * Batch of AT URIs to fetch and index (max 25) 18 + * @maxLength 25 19 + */ 20 + uris: /*#__PURE__*/ v.optional( 21 + /*#__PURE__*/ v.constrain( 22 + /*#__PURE__*/ v.array(/*#__PURE__*/ v.resourceUriString()), 23 + [/*#__PURE__*/ v.arrayLength(0, 25)], 24 + ), 25 + ), 26 + }), 27 + }, 28 + output: { 29 + type: "lex", 30 + schema: /*#__PURE__*/ v.object({ 31 + /** 32 + * Number of records deleted (not found on PDS) 33 + */ 34 + deleted: /*#__PURE__*/ v.integer(), 35 + /** 36 + * Errors for individual URIs that could not be processed 37 + */ 38 + errors: /*#__PURE__*/ v.optional( 39 + /*#__PURE__*/ v.array(/*#__PURE__*/ v.string()), 40 + ), 41 + /** 42 + * Number of records created or updated 43 + */ 44 + indexed: /*#__PURE__*/ v.integer(), 45 + }), 46 + }, 47 + }, 48 + ); 49 + 50 + type main$schematype = typeof _mainSchema; 51 + 52 + export interface mainSchema extends main$schematype {} 53 + 54 + export const mainSchema = _mainSchema as mainSchema; 55 + 56 + export interface $params {} 57 + export interface $input extends v.InferXRPCBodyInput<mainSchema["input"]> {} 58 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 59 + 60 + declare module "@atcute/lexicons/ambient" { 61 + interface XRPCProcedures { 62 + "org.latha.strata.notifyOfUpdate": mainSchema; 63 + } 64 + }
+186
src/lexicon-types/types/org/latha/strata/reasoning/getRecord.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + import * as ComAtprotoLabelDefs from "@atcute/atproto/types/label/defs"; 5 + import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 6 + 7 + const _appBskyActorProfileSchema = /*#__PURE__*/ v.object({ 8 + $type: /*#__PURE__*/ v.optional( 9 + /*#__PURE__*/ v.literal( 10 + "org.latha.strata.reasoning.getRecord#appBskyActorProfile", 11 + ), 12 + ), 13 + /** 14 + * Small image to be displayed next to posts from account. AKA, 'profile picture' 15 + * @accept image/png, image/jpeg 16 + * @maxSize 1000000 17 + */ 18 + avatar: /*#__PURE__*/ v.optional( 19 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 20 + /*#__PURE__*/ v.blobSize(1000000), 21 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 22 + ]), 23 + ), 24 + /** 25 + * Larger horizontal image to display behind profile view. 26 + * @accept image/png, image/jpeg 27 + * @maxSize 1000000 28 + */ 29 + banner: /*#__PURE__*/ v.optional( 30 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 31 + /*#__PURE__*/ v.blobSize(1000000), 32 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 33 + ]), 34 + ), 35 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 36 + /** 37 + * Free-form profile description text. 38 + * @maxLength 2560 39 + * @maxGraphemes 256 40 + */ 41 + description: /*#__PURE__*/ v.optional( 42 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 43 + /*#__PURE__*/ v.stringLength(0, 2560), 44 + /*#__PURE__*/ v.stringGraphemes(0, 256), 45 + ]), 46 + ), 47 + /** 48 + * @maxLength 640 49 + * @maxGraphemes 64 50 + */ 51 + displayName: /*#__PURE__*/ v.optional( 52 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 53 + /*#__PURE__*/ v.stringLength(0, 640), 54 + /*#__PURE__*/ v.stringGraphemes(0, 64), 55 + ]), 56 + ), 57 + get joinedViaStarterPack() { 58 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 59 + }, 60 + /** 61 + * Self-label values, specific to the Bluesky application, on the overall account. 62 + */ 63 + get labels() { 64 + return /*#__PURE__*/ v.optional( 65 + /*#__PURE__*/ v.variant([ComAtprotoLabelDefs.selfLabelsSchema]), 66 + ); 67 + }, 68 + get pinnedPost() { 69 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 70 + }, 71 + /** 72 + * Free-form pronouns text. 73 + * @maxLength 200 74 + * @maxGraphemes 20 75 + */ 76 + pronouns: /*#__PURE__*/ v.optional( 77 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 78 + /*#__PURE__*/ v.stringLength(0, 200), 79 + /*#__PURE__*/ v.stringGraphemes(0, 20), 80 + ]), 81 + ), 82 + website: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 83 + }); 84 + const _mainSchema = /*#__PURE__*/ v.query( 85 + "org.latha.strata.reasoning.getRecord", 86 + { 87 + params: /*#__PURE__*/ v.object({ 88 + /** 89 + * Embed the referenced citation record 90 + */ 91 + hydrateCitation: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), 92 + /** 93 + * Include profile + identity info keyed by DID 94 + */ 95 + profiles: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), 96 + /** 97 + * AT URI of the record 98 + */ 99 + uri: /*#__PURE__*/ v.resourceUriString(), 100 + }), 101 + output: { 102 + type: "lex", 103 + schema: /*#__PURE__*/ v.object({ 104 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), 105 + get citation() { 106 + return /*#__PURE__*/ v.optional(refCitationRecordSchema); 107 + }, 108 + collection: /*#__PURE__*/ v.nsidString(), 109 + did: /*#__PURE__*/ v.didString(), 110 + get profiles() { 111 + return /*#__PURE__*/ v.optional( 112 + /*#__PURE__*/ v.array(profileEntrySchema), 113 + ); 114 + }, 115 + rkey: /*#__PURE__*/ v.string(), 116 + time_us: /*#__PURE__*/ v.integer(), 117 + uri: /*#__PURE__*/ v.resourceUriString(), 118 + value: /*#__PURE__*/ v.unknown(), 119 + }), 120 + }, 121 + }, 122 + ); 123 + const _profileEntrySchema = /*#__PURE__*/ v.object({ 124 + $type: /*#__PURE__*/ v.optional( 125 + /*#__PURE__*/ v.literal( 126 + "org.latha.strata.reasoning.getRecord#profileEntry", 127 + ), 128 + ), 129 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), 130 + collection: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), 131 + did: /*#__PURE__*/ v.didString(), 132 + handle: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 133 + rkey: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 134 + uri: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), 135 + get value() { 136 + return /*#__PURE__*/ v.optional(appBskyActorProfileSchema); 137 + }, 138 + }); 139 + const _refCitationRecordSchema = /*#__PURE__*/ v.object({ 140 + $type: /*#__PURE__*/ v.optional( 141 + /*#__PURE__*/ v.literal( 142 + "org.latha.strata.reasoning.getRecord#refCitationRecord", 143 + ), 144 + ), 145 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 146 + collection: /*#__PURE__*/ v.nsidString(), 147 + did: /*#__PURE__*/ v.didString(), 148 + record: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.unknown()), 149 + rkey: /*#__PURE__*/ v.string(), 150 + time_us: /*#__PURE__*/ v.integer(), 151 + uri: /*#__PURE__*/ v.resourceUriString(), 152 + }); 153 + 154 + type appBskyActorProfile$schematype = typeof _appBskyActorProfileSchema; 155 + type main$schematype = typeof _mainSchema; 156 + type profileEntry$schematype = typeof _profileEntrySchema; 157 + type refCitationRecord$schematype = typeof _refCitationRecordSchema; 158 + 159 + export interface appBskyActorProfileSchema extends appBskyActorProfile$schematype {} 160 + export interface mainSchema extends main$schematype {} 161 + export interface profileEntrySchema extends profileEntry$schematype {} 162 + export interface refCitationRecordSchema extends refCitationRecord$schematype {} 163 + 164 + export const appBskyActorProfileSchema = 165 + _appBskyActorProfileSchema as appBskyActorProfileSchema; 166 + export const mainSchema = _mainSchema as mainSchema; 167 + export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; 168 + export const refCitationRecordSchema = 169 + _refCitationRecordSchema as refCitationRecordSchema; 170 + 171 + export interface AppBskyActorProfile extends v.InferInput< 172 + typeof appBskyActorProfileSchema 173 + > {} 174 + export interface ProfileEntry extends v.InferInput<typeof profileEntrySchema> {} 175 + export interface RefCitationRecord extends v.InferInput< 176 + typeof refCitationRecordSchema 177 + > {} 178 + 179 + export interface $params extends v.InferInput<mainSchema["params"]> {} 180 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 181 + 182 + declare module "@atcute/lexicons/ambient" { 183 + interface XRPCQueries { 184 + "org.latha.strata.reasoning.getRecord": mainSchema; 185 + } 186 + }
+235
src/lexicon-types/types/org/latha/strata/reasoning/listRecords.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + import * as ComAtprotoLabelDefs from "@atcute/atproto/types/label/defs"; 5 + import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 6 + 7 + const _appBskyActorProfileSchema = /*#__PURE__*/ v.object({ 8 + $type: /*#__PURE__*/ v.optional( 9 + /*#__PURE__*/ v.literal( 10 + "org.latha.strata.reasoning.listRecords#appBskyActorProfile", 11 + ), 12 + ), 13 + /** 14 + * Small image to be displayed next to posts from account. AKA, 'profile picture' 15 + * @accept image/png, image/jpeg 16 + * @maxSize 1000000 17 + */ 18 + avatar: /*#__PURE__*/ v.optional( 19 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 20 + /*#__PURE__*/ v.blobSize(1000000), 21 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 22 + ]), 23 + ), 24 + /** 25 + * Larger horizontal image to display behind profile view. 26 + * @accept image/png, image/jpeg 27 + * @maxSize 1000000 28 + */ 29 + banner: /*#__PURE__*/ v.optional( 30 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.blob(), [ 31 + /*#__PURE__*/ v.blobSize(1000000), 32 + /*#__PURE__*/ v.blobAccept(["image/png", "image/jpeg"]), 33 + ]), 34 + ), 35 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 36 + /** 37 + * Free-form profile description text. 38 + * @maxLength 2560 39 + * @maxGraphemes 256 40 + */ 41 + description: /*#__PURE__*/ v.optional( 42 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 43 + /*#__PURE__*/ v.stringLength(0, 2560), 44 + /*#__PURE__*/ v.stringGraphemes(0, 256), 45 + ]), 46 + ), 47 + /** 48 + * @maxLength 640 49 + * @maxGraphemes 64 50 + */ 51 + displayName: /*#__PURE__*/ v.optional( 52 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 53 + /*#__PURE__*/ v.stringLength(0, 640), 54 + /*#__PURE__*/ v.stringGraphemes(0, 64), 55 + ]), 56 + ), 57 + get joinedViaStarterPack() { 58 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 59 + }, 60 + /** 61 + * Self-label values, specific to the Bluesky application, on the overall account. 62 + */ 63 + get labels() { 64 + return /*#__PURE__*/ v.optional( 65 + /*#__PURE__*/ v.variant([ComAtprotoLabelDefs.selfLabelsSchema]), 66 + ); 67 + }, 68 + get pinnedPost() { 69 + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 70 + }, 71 + /** 72 + * Free-form pronouns text. 73 + * @maxLength 200 74 + * @maxGraphemes 20 75 + */ 76 + pronouns: /*#__PURE__*/ v.optional( 77 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 78 + /*#__PURE__*/ v.stringLength(0, 200), 79 + /*#__PURE__*/ v.stringGraphemes(0, 20), 80 + ]), 81 + ), 82 + website: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 83 + }); 84 + const _mainSchema = /*#__PURE__*/ v.query( 85 + "org.latha.strata.reasoning.listRecords", 86 + { 87 + params: /*#__PURE__*/ v.object({ 88 + /** 89 + * Filter by DID or handle (triggers on-demand backfill) 90 + */ 91 + actor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.actorIdentifierString()), 92 + /** 93 + * Filter by confidence 94 + */ 95 + confidence: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 96 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 97 + /** 98 + * Embed the referenced citation record 99 + */ 100 + hydrateCitation: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), 101 + /** 102 + * @minimum 1 103 + * @maximum 200 104 + * @default 50 105 + */ 106 + limit: /*#__PURE__*/ v.optional( 107 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ 108 + /*#__PURE__*/ v.integerRange(1, 200), 109 + ]), 110 + 50, 111 + ), 112 + /** 113 + * Filter by method 114 + */ 115 + method: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 116 + /** 117 + * Sort direction (default: desc for dates/numbers/counts, asc for strings) 118 + */ 119 + order: /*#__PURE__*/ v.optional( 120 + /*#__PURE__*/ v.string<"asc" | "desc" | (string & {})>(), 121 + ), 122 + /** 123 + * Include profile + identity info keyed by DID 124 + */ 125 + profiles: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), 126 + /** 127 + * Full-text search across: question, evidence 128 + */ 129 + search: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 130 + /** 131 + * Field to sort by (default: time_us) 132 + */ 133 + sort: /*#__PURE__*/ v.optional( 134 + /*#__PURE__*/ v.string<"confidence" | "method" | (string & {})>(), 135 + ), 136 + }), 137 + output: { 138 + type: "lex", 139 + schema: /*#__PURE__*/ v.object({ 140 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 141 + get profiles() { 142 + return /*#__PURE__*/ v.optional( 143 + /*#__PURE__*/ v.array(profileEntrySchema), 144 + ); 145 + }, 146 + get records() { 147 + return /*#__PURE__*/ v.array(recordSchema); 148 + }, 149 + }), 150 + }, 151 + }, 152 + ); 153 + const _profileEntrySchema = /*#__PURE__*/ v.object({ 154 + $type: /*#__PURE__*/ v.optional( 155 + /*#__PURE__*/ v.literal( 156 + "org.latha.strata.reasoning.listRecords#profileEntry", 157 + ), 158 + ), 159 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), 160 + collection: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), 161 + did: /*#__PURE__*/ v.didString(), 162 + handle: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 163 + rkey: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 164 + uri: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), 165 + get value() { 166 + return /*#__PURE__*/ v.optional(appBskyActorProfileSchema); 167 + }, 168 + }); 169 + const _recordSchema = /*#__PURE__*/ v.object({ 170 + $type: /*#__PURE__*/ v.optional( 171 + /*#__PURE__*/ v.literal("org.latha.strata.reasoning.listRecords#record"), 172 + ), 173 + cid: /*#__PURE__*/ v.cidString(), 174 + get citation() { 175 + return /*#__PURE__*/ v.optional(refCitationRecordSchema); 176 + }, 177 + collection: /*#__PURE__*/ v.nsidString(), 178 + did: /*#__PURE__*/ v.didString(), 179 + rkey: /*#__PURE__*/ v.string(), 180 + time_us: /*#__PURE__*/ v.integer(), 181 + uri: /*#__PURE__*/ v.resourceUriString(), 182 + value: /*#__PURE__*/ v.unknown(), 183 + }); 184 + const _refCitationRecordSchema = /*#__PURE__*/ v.object({ 185 + $type: /*#__PURE__*/ v.optional( 186 + /*#__PURE__*/ v.literal( 187 + "org.latha.strata.reasoning.listRecords#refCitationRecord", 188 + ), 189 + ), 190 + cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 191 + collection: /*#__PURE__*/ v.nsidString(), 192 + did: /*#__PURE__*/ v.didString(), 193 + record: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.unknown()), 194 + rkey: /*#__PURE__*/ v.string(), 195 + time_us: /*#__PURE__*/ v.integer(), 196 + uri: /*#__PURE__*/ v.resourceUriString(), 197 + }); 198 + 199 + type appBskyActorProfile$schematype = typeof _appBskyActorProfileSchema; 200 + type main$schematype = typeof _mainSchema; 201 + type profileEntry$schematype = typeof _profileEntrySchema; 202 + type record$schematype = typeof _recordSchema; 203 + type refCitationRecord$schematype = typeof _refCitationRecordSchema; 204 + 205 + export interface appBskyActorProfileSchema extends appBskyActorProfile$schematype {} 206 + export interface mainSchema extends main$schematype {} 207 + export interface profileEntrySchema extends profileEntry$schematype {} 208 + export interface recordSchema extends record$schematype {} 209 + export interface refCitationRecordSchema extends refCitationRecord$schematype {} 210 + 211 + export const appBskyActorProfileSchema = 212 + _appBskyActorProfileSchema as appBskyActorProfileSchema; 213 + export const mainSchema = _mainSchema as mainSchema; 214 + export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; 215 + export const recordSchema = _recordSchema as recordSchema; 216 + export const refCitationRecordSchema = 217 + _refCitationRecordSchema as refCitationRecordSchema; 218 + 219 + export interface AppBskyActorProfile extends v.InferInput< 220 + typeof appBskyActorProfileSchema 221 + > {} 222 + export interface ProfileEntry extends v.InferInput<typeof profileEntrySchema> {} 223 + export interface Record extends v.InferInput<typeof recordSchema> {} 224 + export interface RefCitationRecord extends v.InferInput< 225 + typeof refCitationRecordSchema 226 + > {} 227 + 228 + export interface $params extends v.InferInput<mainSchema["params"]> {} 229 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 230 + 231 + declare module "@atcute/lexicons/ambient" { 232 + interface XRPCQueries { 233 + "org.latha.strata.reasoning.listRecords": mainSchema; 234 + } 235 + }
+418
src/worker.ts
··· 1 + import { Hono } from "hono"; 2 + import { cors } from "hono/cors"; 3 + import { createWorker } from "@atmo-dev/contrail/worker"; 4 + import { Contrail } from "@atmo-dev/contrail"; 5 + import { config } from "./contrail.config.js"; 6 + import { lexicons } from "../lexicons/generated/index.js"; 7 + import { LANDING_PAGE } from "./landing-page.js"; 8 + 9 + interface Env { 10 + DB: D1Database; 11 + ANALYSIS_SECRET?: string; 12 + } 13 + 14 + const contrailWorker = createWorker(config, { lexicons }); 15 + const contrail = new Contrail(config); 16 + let contrailReady = false; 17 + 18 + async function ensureContrailReady(db: D1Database): Promise<void> { 19 + if (contrailReady) return; 20 + await contrail.init(db); 21 + contrailReady = true; 22 + } 23 + 24 + // ── Analysis pipeline ──────────────────────────────────────────────── 25 + 26 + async function extractMetadata( 27 + url: string, 28 + ): Promise<{ title: string; description: string; imageUrl?: string; type?: string } | null> { 29 + try { 30 + const res = await fetch(url, { 31 + signal: AbortSignal.timeout(5000), 32 + headers: { 33 + "User-Agent": "Stigmergic/0.1 (org.latha.strata appview)", 34 + Accept: "text/html", 35 + }, 36 + }); 37 + if (!res.ok) return null; 38 + const html = await res.text(); 39 + 40 + const getMeta = (property: string): string | null => { 41 + const re = new RegExp( 42 + `<meta[^>]*(?:property|name)=["']${property}["'][^>]*content=["']([^"']*)["']`, 43 + "i", 44 + ); 45 + const m = html.match(re); 46 + if (m) return m[1]; 47 + const re2 = new RegExp( 48 + `<meta[^>]*content=["']([^"']*)["'][^>]*(?:property|name)=["']${property}["']`, 49 + "i", 50 + ); 51 + const m2 = html.match(re2); 52 + return m2 ? m2[1] : null; 53 + }; 54 + 55 + const title = 56 + getMeta("og:title") || 57 + getMeta("twitter:title") || 58 + html.match(/<title[^>]*>([^<]+)<\/title>/i)?.[1] || 59 + ""; 60 + const description = 61 + getMeta("og:description") || 62 + getMeta("twitter:description") || 63 + getMeta("description") || 64 + ""; 65 + const imageUrl = getMeta("og:image") || getMeta("twitter:image") || undefined; 66 + const type = getMeta("og:type") || undefined; 67 + 68 + if (!title && !description) return null; 69 + return { title: title.trim(), description: description.trim(), imageUrl, type }; 70 + } catch { 71 + return null; 72 + } 73 + } 74 + 75 + async function analyzeNewCards(db: D1Database, limit = 50): Promise<number> { 76 + await ensureContrailReady(db); 77 + 78 + const unanalyzed = await db 79 + .prepare( 80 + `SELECT r.record, r.did, r.rkey 81 + FROM records_card r 82 + WHERE json_extract(r.record, '$.type') = 'URL' 83 + AND json_extract(r.record, '$.content.url') IS NOT NULL 84 + AND NOT EXISTS ( 85 + SELECT 1 FROM records_citation c 86 + WHERE json_extract(c.record, '$.url') = json_extract(r.record, '$.content.url') 87 + ) 88 + ORDER BY r.time_us DESC 89 + LIMIT ?`, 90 + ) 91 + .bind(limit) 92 + .all<{ record: string; did: string; rkey: string }>(); 93 + 94 + let analyzed = 0; 95 + for (const row of unanalyzed.results || []) { 96 + try { 97 + const card = JSON.parse(row.record); 98 + const url = card?.content?.url; 99 + if (!url) continue; 100 + 101 + const meta = await extractMetadata(url); 102 + if (!meta) continue; 103 + 104 + const cardMeta = card?.content?.metadata; 105 + const title = meta.title || cardMeta?.title || url; 106 + const description = meta.description || cardMeta?.description || ""; 107 + 108 + const now = new Date().toISOString(); 109 + const citation = { 110 + $type: "org.latha.strata.citation", 111 + url, 112 + title, 113 + takeaway: description.slice(0, 2000), 114 + confidence: "org.latha.strata.defs#medium", 115 + domain: new URL(url).hostname.replace(/^www\./, ""), 116 + tags: [meta.type || "link"].filter(Boolean), 117 + createdAt: now, 118 + }; 119 + 120 + const tid = crypto.randomUUID().replace(/-/g, ""); 121 + await db 122 + .prepare( 123 + `INSERT OR IGNORE INTO records_citation (did, rkey, record, time_us) 124 + VALUES (?, ?, ?, ?)`, 125 + ) 126 + .bind( 127 + "did:web:strata.latha.org", 128 + tid, 129 + JSON.stringify(citation), 130 + Date.now() * 1000, 131 + ) 132 + .run(); 133 + 134 + analyzed++; 135 + } catch (e) { 136 + console.error("analyzeNewCards: failed for", row.rkey, e); 137 + } 138 + } 139 + return analyzed; 140 + } 141 + 142 + // ── Graph query: Yoneda neighborhood ────────────────────────────────── 143 + 144 + async function getGraph( 145 + db: D1Database, 146 + uri: string, 147 + depth: number, 148 + limit: number, 149 + types?: string[], 150 + ): Promise<{ connections: any[]; resources: Map<string, any> }> { 151 + const connections: any[] = []; 152 + const visited = new Set<string>(); 153 + const queue: string[] = [uri]; 154 + const resources = new Map<string, any>(); 155 + 156 + const typeFilter = types?.length 157 + ? ` AND json_extract(record, '$.connectionType') IN (${types.map(() => "?").join(",")})` 158 + : ""; 159 + 160 + for (let d = 0; d < depth && queue.length > 0; d++) { 161 + const batch = queue.splice(0, 100); 162 + const nextQueue: string[] = []; 163 + 164 + for (const u of batch) { 165 + if (visited.has(u)) continue; 166 + visited.add(u); 167 + 168 + const incoming = await db 169 + .prepare( 170 + `SELECT record, did, rkey, time_us FROM records_connection 171 + WHERE json_extract(record, '$.target') = ?${typeFilter} 172 + ORDER BY time_us DESC LIMIT ?`, 173 + ) 174 + .bind(u, ...(types || []), limit) 175 + .all<{ record: string; did: string; rkey: string; time_us: number }>(); 176 + 177 + const outgoing = await db 178 + .prepare( 179 + `SELECT record, did, rkey, time_us FROM records_connection 180 + WHERE json_extract(record, '$.source') = ?${typeFilter} 181 + ORDER BY time_us DESC LIMIT ?`, 182 + ) 183 + .bind(u, ...(types || []), limit) 184 + .all<{ record: string; did: string; rkey: string; time_us: number }>(); 185 + 186 + for (const row of [...(incoming.results || []), ...(outgoing.results || [])]) { 187 + try { 188 + const value = JSON.parse(row.record); 189 + const conn = { 190 + uri: `at://${row.did}/network.cosmik.connection/${row.rkey}`, 191 + did: row.did, 192 + rkey: row.rkey, 193 + value, 194 + }; 195 + connections.push(conn); 196 + 197 + const source = value.source; 198 + const target = value.target; 199 + if (!visited.has(source)) nextQueue.push(source); 200 + if (!visited.has(target)) nextQueue.push(target); 201 + } catch {} 202 + } 203 + 204 + if (!resources.has(u)) { 205 + resources.set(u, { uri: u, title: u, type: "unknown" }); 206 + } 207 + } 208 + 209 + queue.push(...nextQueue); 210 + } 211 + 212 + return { connections, resources }; 213 + } 214 + 215 + // ── Hono app ───────────────────────────────────────────────────────── 216 + 217 + let app: Hono<{ Bindings: Env }> | null = null; 218 + 219 + function buildApp(env: Env): Hono<{ Bindings: Env }> { 220 + const app = new Hono<{ Bindings: Env }>(); 221 + const db = env.DB; 222 + 223 + app.use("*", cors()); 224 + 225 + // Landing page 226 + app.get("/", async (c) => { 227 + await ensureContrailReady(db); 228 + 229 + let connectionsJson = "[]"; 230 + let collectionsJson = "[]"; 231 + try { 232 + const connRows = await db 233 + .prepare( 234 + `SELECT record, did, rkey FROM records_connection 235 + ORDER BY time_us DESC LIMIT 50`, 236 + ) 237 + .all<{ record: string; did: string; rkey: string }>(); 238 + 239 + const connections = (connRows.results || []).map((r) => { 240 + try { 241 + const value = JSON.parse(r.record); 242 + return { 243 + uri: `at://${r.did}/network.cosmik.connection/${r.rkey}`, 244 + did: r.did, 245 + source: value.source, 246 + target: value.target, 247 + connectionType: value.connectionType || "relates", 248 + note: value.note || "", 249 + }; 250 + } catch { 251 + return null; 252 + } 253 + }).filter(Boolean); 254 + 255 + const dids = [...new Set(connections.map((c: any) => c.did))]; 256 + if (dids.length > 0) { 257 + const placeholders = dids.map(() => "?").join(","); 258 + const handleRows = await db 259 + .prepare(`SELECT did, handle FROM identities WHERE did IN (${placeholders})`) 260 + .bind(...dids) 261 + .all<{ did: string; handle: string | null }>(); 262 + const handleMap = new Map( 263 + (handleRows.results || []).map((r) => [r.did, r.handle]), 264 + ); 265 + for (const conn of connections) { 266 + (conn as any).handle = handleMap.get((conn as any).did) || null; 267 + } 268 + } 269 + 270 + connectionsJson = JSON.stringify(connections); 271 + 272 + const colRows = await db 273 + .prepare( 274 + `SELECT record, did, rkey FROM records_collection 275 + WHERE json_extract(record, '$.accessType') = 'OPEN' 276 + ORDER BY time_us DESC LIMIT 20`, 277 + ) 278 + .all<{ record: string; did: string; rkey: string }>(); 279 + 280 + const collections = (colRows.results || []) 281 + .map((r) => { 282 + try { 283 + const value = JSON.parse(r.record); 284 + return { 285 + did: r.did, 286 + rkey: r.rkey, 287 + uri: `at://${r.did}/network.cosmik.collection/${r.rkey}`, 288 + name: value?.name || "Untitled", 289 + description: value?.description || "", 290 + }; 291 + } catch { 292 + return null; 293 + } 294 + }) 295 + .filter(Boolean); 296 + 297 + collectionsJson = JSON.stringify(collections); 298 + } catch {} 299 + 300 + const page = LANDING_PAGE 301 + .replace( 302 + "</head>", 303 + `<script>window.__CONNECTIONS__=${connectionsJson};window.__COLLECTIONS__=${collectionsJson};</script></head>`, 304 + ); 305 + return c.html(page); 306 + }); 307 + 308 + // Graph neighborhood query 309 + app.get("/xrpc/org.latha.strata.connection.getGraph", async (c) => { 310 + const uri = c.req.query("uri"); 311 + if (!uri) { 312 + return c.json({ error: "MissingRequiredParameter", message: "uri is required" }, 400); 313 + } 314 + 315 + const depth = Math.min(parseInt(c.req.query("depth") || "2"), 3); 316 + const limit = Math.min(parseInt(c.req.query("limit") || "50"), 100); 317 + const types = c.req.query("types")?.split(",").map((t) => t.trim()); 318 + 319 + const { connections, resources } = await getGraph(db, uri, depth, limit, types); 320 + const resourceList = Array.from(resources.values()); 321 + 322 + return c.json({ 323 + connections, 324 + resources: resourceList, 325 + depth, 326 + uri, 327 + }); 328 + }); 329 + 330 + // On-demand analysis endpoint 331 + app.post("/xrpc/org.latha.strata.analyzeCard", async (c) => { 332 + const body = await c.req.json<{ url?: string }>().catch(() => ({ url: "" })); 333 + const url = body.url; 334 + if (!url) { 335 + return c.json({ error: "MissingRequiredParameter", message: "url is required" }, 400); 336 + } 337 + 338 + const meta = await extractMetadata(url); 339 + if (!meta) { 340 + return c.json({ error: "ExtractionFailed", message: "Could not extract metadata from URL" }, 422); 341 + } 342 + 343 + const now = new Date().toISOString(); 344 + const citation = { 345 + $type: "org.latha.strata.citation", 346 + url, 347 + title: meta.title, 348 + takeaway: meta.description.slice(0, 2000), 349 + confidence: "org.latha.strata.defs#medium", 350 + domain: new URL(url).hostname.replace(/^www\./, ""), 351 + tags: [meta.type || "link"].filter(Boolean), 352 + createdAt: now, 353 + }; 354 + 355 + const tid = crypto.randomUUID().replace(/-/g, ""); 356 + await db 357 + .prepare( 358 + `INSERT OR IGNORE INTO records_citation (did, rkey, record, time_us) 359 + VALUES (?, ?, ?, ?)`, 360 + ) 361 + .bind( 362 + "did:web:strata.latha.org", 363 + tid, 364 + JSON.stringify(citation), 365 + Date.now() * 1000, 366 + ) 367 + .run(); 368 + 369 + return c.json({ citation, tid }); 370 + }); 371 + 372 + // OAuth client metadata 373 + app.get("/oauth-client-metadata.json", (c) => { 374 + const host = new URL(c.req.url).host; 375 + return c.json({ 376 + client_id: `https://${host}/oauth-client-metadata.json`, 377 + client_name: "Stigmergic", 378 + client_uri: `https://${host}`, 379 + redirect_uris: [`https://${host}/`], 380 + scope: "atproto transition:generic", 381 + grant_types: ["authorization_code", "refresh_token"], 382 + response_types: ["code"], 383 + token_endpoint_auth_method: "none", 384 + application_type: "web", 385 + dpop_bound_access_tokens: true, 386 + }); 387 + }); 388 + 389 + // All other routes pass through to contrail 390 + app.all("*", async (c) => { 391 + const response = await contrailWorker.fetch( 392 + c.req.raw, 393 + c.env as unknown as Record<string, unknown>, 394 + ); 395 + return response; 396 + }); 397 + 398 + return app; 399 + } 400 + 401 + export default { 402 + fetch(request: Request, env: Env): Response | Promise<Response> { 403 + app ??= buildApp(env); 404 + return app.fetch(request, env); 405 + }, 406 + async scheduled(event: ScheduledEvent, env: Env, ctx: ExecutionContext) { 407 + const contrailPromise = contrailWorker.scheduled( 408 + event, 409 + env as unknown as Record<string, unknown>, 410 + ctx, 411 + ); 412 + 413 + const analysisPromise = contrailPromise.then(() => analyzeNewCards(env.DB)); 414 + 415 + ctx.waitUntil(analysisPromise); 416 + return contrailPromise; 417 + }, 418 + };
+20
tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "target": "ES2022", 4 + "module": "ES2022", 5 + "moduleResolution": "bundler", 6 + "lib": ["ES2022", "DOM"], 7 + "types": ["@cloudflare/workers-types"], 8 + "strict": true, 9 + "esModuleInterop": true, 10 + "skipLibCheck": true, 11 + "forceConsistentCasingInFileNames": true, 12 + "resolveJsonModule": true, 13 + "isolatedModules": true, 14 + "noEmit": true, 15 + "jsx": "react-jsx", 16 + "jsxImportSource": "hono/jsx" 17 + }, 18 + "include": ["src/**/*.ts", "lexicons/generated/**/*.ts"], 19 + "exclude": ["node_modules", "public"] 20 + }
+27
wrangler.jsonc
··· 1 + { 2 + "name": "stigmergic", 3 + "main": "src/worker.ts", 4 + "compatibility_date": "2026-05-12", 5 + "compatibility_flags": ["nodejs_compat"], 6 + 7 + // D1 for Contrail indexing 8 + "d1_databases": [ 9 + { 10 + "binding": "DB", 11 + "database_name": "stigmergic", 12 + "database_id": "ed893bdb-b8ba-4d15-a9d6-29f5e7c7916f" 13 + } 14 + ], 15 + 16 + "triggers": { 17 + "crons": ["*/1 * * * *"] 18 + }, 19 + 20 + "routes": [ 21 + { "pattern": "stigmergic.latha.org", "custom_domain": true } 22 + ], 23 + 24 + "assets": { 25 + "directory": "public" 26 + } 27 + }