xyz.quasigod.lab.letta.message
Schema Diff
+95 -36
Compatibility Analysis
Breaking Changes Detected
22 breaking changes, 19 non-breaking changes.
Breaking Changes (22)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.message:body", src: "xyz.quasigod.lab.letta.message:body", tgt: "xyz.quasigod.lab.letta.message:body.seq", kind: "prop", name: Some("seq") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.message:body", src: "xyz.quasigod.lab.letta.message:body", tgt: "xyz.quasigod.lab.letta.message:body.agent", kind: "prop", name: Some("agent") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.message:body", src: "xyz.quasigod.lab.letta.message:body", tgt: "xyz.quasigod.lab.letta.message:body.message", kind: "prop", name: Some("message") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.message:body", src: "xyz.quasigod.lab.letta.message:body", tgt: "xyz.quasigod.lab.letta.message:body.role", kind: "prop", name: Some("role") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.message:body", src: "xyz.quasigod.lab.letta.message:body", tgt: "xyz.quasigod.lab.letta.message:body.conversation", kind: "prop", name: Some("conversation") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.message:body", src: "xyz.quasigod.lab.letta.message:body", tgt: "xyz.quasigod.lab.letta.message:body.createdAt", kind: "prop", name: Some("createdAt") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.message:body.message", src: "xyz.quasigod.lab.letta.message:body.message", tgt: "xyz.quasigod.lab.letta.message:body.message.format", kind: "prop", name: Some("format") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.message:body.message", src: "xyz.quasigod.lab.letta.message:body.message", tgt: "xyz.quasigod.lab.letta.message:body.message.version", kind: "prop", name: Some("version") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.message:body.message", src: "xyz.quasigod.lab.letta.message:body.message", tgt: "xyz.quasigod.lab.letta.message:body.message.data", kind: "prop", name: Some("data") }
- RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "xyz.quasigod.lab.letta.message", src: "xyz.quasigod.lab.letta.message", tgt: "xyz.quasigod.lab.letta.message.seq", kind: "prop", name: Some("seq") }
- RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "xyz.quasigod.lab.letta.message", src: "xyz.quasigod.lab.letta.message", tgt: "xyz.quasigod.lab.letta.message.agentId", kind: "prop", name: Some("agentId") }
- RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "xyz.quasigod.lab.letta.message", src: "xyz.quasigod.lab.letta.message", tgt: "xyz.quasigod.lab.letta.message.id", kind: "prop", name: Some("id") }
- RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "xyz.quasigod.lab.letta.message", src: "xyz.quasigod.lab.letta.message", tgt: "xyz.quasigod.lab.letta.message.localMessage", kind: "prop", name: Some("localMessage") }
- RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "xyz.quasigod.lab.letta.message", src: "xyz.quasigod.lab.letta.message", tgt: "xyz.quasigod.lab.letta.message.conversationId", kind: "prop", name: Some("conversationId") }
- RemovedVertex RemovedVertex { vertex_id: "xyz.quasigod.lab.letta.message.agentId" }
- RemovedVertex RemovedVertex { vertex_id: "xyz.quasigod.lab.letta.message.conversationId" }
- RemovedVertex RemovedVertex { vertex_id: "xyz.quasigod.lab.letta.message.deleted" }
- RemovedVertex RemovedVertex { vertex_id: "xyz.quasigod.lab.letta.message.id" }
- RemovedVertex RemovedVertex { vertex_id: "xyz.quasigod.lab.letta.message.localMessage" }
- RemovedVertex RemovedVertex { vertex_id: "xyz.quasigod.lab.letta.message.seq" }
- RemovedEdge RemovedEdge { src: "xyz.quasigod.lab.letta.message", tgt: "xyz.quasigod.lab.letta.message.deleted", kind: "prop", name: Some("deleted") }
- KindChanged KindChanged { vertex_id: "xyz.quasigod.lab.letta.message", old_kind: "object", new_kind: "record" }
Non-Breaking Changes (19)
- AddedVertex AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body" }
- AddedVertex AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.agent" }
- AddedVertex AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.compactedMessageIds" }
- AddedVertex AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.compactedMessageIds:items" }
- AddedVertex AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.conversation" }
- AddedVertex AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.createdAt" }
- AddedVertex AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.message" }
- AddedVertex AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.message.data" }
- AddedVertex AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.message.format" }
- AddedVertex AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.message.version" }
- AddedVertex AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.role" }
- AddedVertex AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.seq" }
- AddedVertex AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.status" }
- AddedVertex AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.updatedAt" }
- AddedEdge AddedEdge { src: "xyz.quasigod.lab.letta.message", tgt: "xyz.quasigod.lab.letta.message:body", kind: "record-schema", name: None }
- AddedEdge AddedEdge { src: "xyz.quasigod.lab.letta.message:body", tgt: "xyz.quasigod.lab.letta.message:body.compactedMessageIds", kind: "prop", name: Some("compactedMessageIds") }
- AddedEdge AddedEdge { src: "xyz.quasigod.lab.letta.message:body", tgt: "xyz.quasigod.lab.letta.message:body.status", kind: "prop", name: Some("status") }
- AddedEdge AddedEdge { src: "xyz.quasigod.lab.letta.message:body", tgt: "xyz.quasigod.lab.letta.message:body.updatedAt", kind: "prop", name: Some("updatedAt") }
- AddedEdge AddedEdge { src: "xyz.quasigod.lab.letta.message:body.compactedMessageIds", tgt: "xyz.quasigod.lab.letta.message:body.compactedMessageIds:items", kind: "items", name: None }
Migration Guidance
Removed Elements
RemovedVertex { vertex_id: "xyz.quasigod.lab.letta.message.agentId" }RemovedVertex { vertex_id: "xyz.quasigod.lab.letta.message.conversationId" }RemovedVertex { vertex_id: "xyz.quasigod.lab.letta.message.deleted" }RemovedVertex { vertex_id: "xyz.quasigod.lab.letta.message.id" }RemovedVertex { vertex_id: "xyz.quasigod.lab.letta.message.localMessage" }RemovedVertex { vertex_id: "xyz.quasigod.lab.letta.message.seq" }
Added Elements
AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body" }AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.agent" }AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.compactedMessageIds" }AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.compactedMessageIds:items" }AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.conversation" }AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.createdAt" }AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.message" }AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.message.data" }AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.message.format" }AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.message.version" }AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.role" }AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.seq" }AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.status" }AddedVertex { vertex_id: "xyz.quasigod.lab.letta.message:body.updatedAt" }
Additional Notes
- Breaking: RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.message:body", src: "xyz.quasigod.lab.letta.message:body", tgt: "xyz.quasigod.lab.letta.message:body.seq", kind: "prop", name: Some("seq") }
- Breaking: RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.message:body", src: "xyz.quasigod.lab.letta.message:body", tgt: "xyz.quasigod.lab.letta.message:body.agent", kind: "prop", name: Some("agent") }
- Breaking: RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.message:body", src: "xyz.quasigod.lab.letta.message:body", tgt: "xyz.quasigod.lab.letta.message:body.message", kind: "prop", name: Some("message") }
- Breaking: RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.message:body", src: "xyz.quasigod.lab.letta.message:body", tgt: "xyz.quasigod.lab.letta.message:body.role", kind: "prop", name: Some("role") }
- Breaking: RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.message:body", src: "xyz.quasigod.lab.letta.message:body", tgt: "xyz.quasigod.lab.letta.message:body.conversation", kind: "prop", name: Some("conversation") }
- Breaking: RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.message:body", src: "xyz.quasigod.lab.letta.message:body", tgt: "xyz.quasigod.lab.letta.message:body.createdAt", kind: "prop", name: Some("createdAt") }
- Breaking: RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.message:body.message", src: "xyz.quasigod.lab.letta.message:body.message", tgt: "xyz.quasigod.lab.letta.message:body.message.format", kind: "prop", name: Some("format") }
- Breaking: RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.message:body.message", src: "xyz.quasigod.lab.letta.message:body.message", tgt: "xyz.quasigod.lab.letta.message:body.message.version", kind: "prop", name: Some("version") }
- Breaking: RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.message:body.message", src: "xyz.quasigod.lab.letta.message:body.message", tgt: "xyz.quasigod.lab.letta.message:body.message.data", kind: "prop", name: Some("data") }
- Breaking: RequiredEdgeRemoved { vertex_id: "xyz.quasigod.lab.letta.message", src: "xyz.quasigod.lab.letta.message", tgt: "xyz.quasigod.lab.letta.message.seq", kind: "prop", name: Some("seq") }
- Breaking: RequiredEdgeRemoved { vertex_id: "xyz.quasigod.lab.letta.message", src: "xyz.quasigod.lab.letta.message", tgt: "xyz.quasigod.lab.letta.message.agentId", kind: "prop", name: Some("agentId") }
- Breaking: RequiredEdgeRemoved { vertex_id: "xyz.quasigod.lab.letta.message", src: "xyz.quasigod.lab.letta.message", tgt: "xyz.quasigod.lab.letta.message.id", kind: "prop", name: Some("id") }
- Breaking: RequiredEdgeRemoved { vertex_id: "xyz.quasigod.lab.letta.message", src: "xyz.quasigod.lab.letta.message", tgt: "xyz.quasigod.lab.letta.message.localMessage", kind: "prop", name: Some("localMessage") }
- Breaking: RequiredEdgeRemoved { vertex_id: "xyz.quasigod.lab.letta.message", src: "xyz.quasigod.lab.letta.message", tgt: "xyz.quasigod.lab.letta.message.conversationId", kind: "prop", name: Some("conversationId") }
- Breaking: RemovedEdge { src: "xyz.quasigod.lab.letta.message", tgt: "xyz.quasigod.lab.letta.message.deleted", kind: "prop", name: Some("deleted") }
- Breaking: KindChanged { vertex_id: "xyz.quasigod.lab.letta.message", old_kind: "object", new_kind: "record" }
- Non-breaking: AddedEdge { src: "xyz.quasigod.lab.letta.message", tgt: "xyz.quasigod.lab.letta.message:body", kind: "record-schema", name: None }
- Non-breaking: AddedEdge { src: "xyz.quasigod.lab.letta.message:body", tgt: "xyz.quasigod.lab.letta.message:body.compactedMessageIds", kind: "prop", name: Some("compactedMessageIds") }
- Non-breaking: AddedEdge { src: "xyz.quasigod.lab.letta.message:body", tgt: "xyz.quasigod.lab.letta.message:body.status", kind: "prop", name: Some("status") }
- Non-breaking: AddedEdge { src: "xyz.quasigod.lab.letta.message:body", tgt: "xyz.quasigod.lab.letta.message:body.updatedAt", kind: "prop", name: Some("updatedAt") }
- Non-breaking: AddedEdge { src: "xyz.quasigod.lab.letta.message:body.compactedMessageIds", tgt: "xyz.quasigod.lab.letta.message:body.compactedMessageIds:items", kind: "items", name: None }
1
1
{
2
2
"id": "xyz.quasigod.lab.letta.message",
3
3
"defs": {
4
4
"main": {
5
-
"type": "object",
6
-
"required": [
7
-
"id",
8
-
"conversationId",
9
-
"agentId",
10
-
"seq",
11
-
"localMessage"
12
-
],
13
-
"properties": {
14
-
"id": {
15
-
"type": "string",
16
-
"maxLength": 256,
17
-
"description": "LocalMessage source id, before any :variant: suffix."
18
-
},
19
-
"seq": {
20
-
"type": "integer",
21
-
"minimum": 1,
22
-
"description": "Per-conversation monotonic sequence, assigned at write time."
23
-
},
24
-
"agentId": {
25
-
"type": "string",
26
-
"maxLength": 128
27
-
},
28
-
"deleted": {
29
-
"type": "boolean",
30
-
"description": "Compaction deletes records outright; this flag is unused in v1."
31
-
},
32
-
"localMessage": {
33
-
"type": "unknown",
34
-
"description": "Serialized LocalMessage (role, content, metadata)."
35
-
},
36
-
"conversationId": {
37
-
"type": "string",
38
-
"maxLength": 128
5
+
"key": "tid",
6
+
"type": "record",
7
+
"record": {
8
+
"type": "object",
9
+
"required": [
10
+
"conversation",
11
+
"agent",
12
+
"role",
13
+
"seq",
14
+
"message",
15
+
"createdAt"
16
+
],
17
+
"properties": {
18
+
"seq": {
19
+
"type": "integer",
20
+
"minimum": 1,
21
+
"description": "Monotonic per-conversation ordering. Unique within the conversation; minted from the conversation's seq counter (one more than the highest seq of any retained message). Never reused for a message that exists; retained (compacted) messages keep their seq."
22
+
},
23
+
"role": {
24
+
"type": "string",
25
+
"description": "Message role: the sender class. toolResult = an assistant tool call's result, returned as a message.",
26
+
"knownValues": [
27
+
"user",
28
+
"assistant",
29
+
"toolResult"
30
+
]
31
+
},
32
+
"agent": {
33
+
"type": "string",
34
+
"format": "at-uri",
35
+
"description": "The agent this message was produced by or addressed to."
36
+
},
37
+
"status": {
38
+
"type": "string",
39
+
"description": "active: part of the conversation's current context window. compacted: summarized out of the window — retained in the transcript but separated from the active conversation. Absent means active. The window is derived: active messages, in seq order, form the conversation's context; compaction re-marks messages compacted instead of deleting them.",
40
+
"knownValues": [
41
+
"active",
42
+
"compacted"
43
+
]
44
+
},
45
+
"message": {
46
+
"type": "object",
47
+
"required": [
48
+
"format",
49
+
"version",
50
+
"data"
51
+
],
52
+
"properties": {
53
+
"data": {
54
+
"type": "unknown",
55
+
"description": "The payload in the declared format. Kept unvalidated by the lexicon deliberately: it is the harness's internal, evolving wire format, and declaring it in the lexicon would freeze it under atproto's evolution rules."
56
+
},
57
+
"format": {
58
+
"type": "string",
59
+
"maxLength": 128,
60
+
"description": "Payload format namespace. letta.localMessage: letta's LocalMessage — a role-discriminated union (user/assistant/toolResult) of content parts (text, thinking, image, tool call), provider metadata, and usage. Specified by letta's TypeScript types (src/backend/local/local-message.ts), which letta's compiler enforces on every read and write.",
61
+
"knownValues": [
62
+
"letta.localMessage"
63
+
]
64
+
},
65
+
"version": {
66
+
"type": "integer",
67
+
"minimum": 1,
68
+
"description": "Payload format version the data conforms to. Bumped when the payload format changes incompatibly; readers branch on format + version."
69
+
}
70
+
},
71
+
"description": "The full message state, enveloped. format + version identify the payload spec; data is the payload in that format. The typed core plus this envelope is the complete interop contract; the data payload is harness-specific."
72
+
},
73
+
"createdAt": {
74
+
"type": "string",
75
+
"format": "datetime"
76
+
},
77
+
"updatedAt": {
78
+
"type": "string",
79
+
"format": "datetime",
80
+
"description": "Set when the message is rewritten in place (interrupted tool calls settled, or re-marked compacted by a compaction)."
81
+
},
82
+
"conversation": {
83
+
"type": "string",
84
+
"format": "at-uri",
85
+
"description": "The conversation this message belongs to."
86
+
},
87
+
"compactedMessageIds": {
88
+
"type": "array",
89
+
"items": {
90
+
"type": "string",
91
+
"format": "tid",
92
+
"maxLength": 13
93
+
},
94
+
"description": "Only on a compaction summary message: the TIDs of the messages summarized into this summary, in seq order. Following these (and any older summary among them) reconstructs the full pre-compaction transcript. Compaction never deletes; it re-marks messages compacted and records them here."
95
+
}
39
96
}
40
-
}
97
+
},
98
+
"description": "A letta message persisted in a permissioned space."
41
99
}
42
100
},
43
101
"$type": "com.atproto.lexicon.schema",
44
-
"lexicon": 1
102
+
"lexicon": 1,
103
+
"description": "A letta message within a conversation. Core fields are navigable atproto data; `message` carries the full letta message state."
45
104
}