@ixo/topic-protocol 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +133 -0
- package/dist/schemas/action-receipt.schema.json +18 -0
- package/dist/schemas/agent-run.schema.json +18 -0
- package/dist/schemas/external-session-binding.schema.json +24 -0
- package/dist/schemas/room-policy.schema.json +15 -0
- package/dist/schemas/topic-capsule.schema.json +19 -0
- package/dist/schemas/topic-index-entry.schema.json +17 -0
- package/dist/schemas/topic-message.schema.json +18 -0
- package/dist/schemas/topic-operation.schema.json +19 -0
- package/dist/schemas/topic-preferences.schema.json +13 -0
- package/dist/schemas/topic-record.schema.json +18 -0
- package/dist/schemas/topic-relation.schema.json +16 -0
- package/dist/schemas/topic-root.schema.json +18 -0
- package/dist/schemas/topic-state.schema.json +19 -0
- package/dist/src/contracts/schemas.d.ts +569 -0
- package/dist/src/contracts/schemas.js +30 -0
- package/dist/src/contracts/schemas.js.map +1 -0
- package/dist/src/contracts/validator.d.ts +14 -0
- package/dist/src/contracts/validator.js +43 -0
- package/dist/src/contracts/validator.js.map +1 -0
- package/dist/src/errors.d.ts +6 -0
- package/dist/src/errors.js +11 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/index.d.ts +11 -0
- package/dist/src/index.js +12 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/matrix/anchors.d.ts +2 -0
- package/dist/src/matrix/anchors.js +55 -0
- package/dist/src/matrix/anchors.js.map +1 -0
- package/dist/src/matrix/content.d.ts +11 -0
- package/dist/src/matrix/content.js +64 -0
- package/dist/src/matrix/content.js.map +1 -0
- package/dist/src/matrix/events.d.ts +4 -0
- package/dist/src/matrix/events.js +94 -0
- package/dist/src/matrix/events.js.map +1 -0
- package/dist/src/matrix/pending.d.ts +22 -0
- package/dist/src/matrix/pending.js +83 -0
- package/dist/src/matrix/pending.js.map +1 -0
- package/dist/src/matrix/runtime.d.ts +18 -0
- package/dist/src/matrix/runtime.js +121 -0
- package/dist/src/matrix/runtime.js.map +1 -0
- package/dist/src/matrix/types.d.ts +84 -0
- package/dist/src/matrix/types.js +5 -0
- package/dist/src/matrix/types.js.map +1 -0
- package/dist/src/projector/payload.d.ts +27 -0
- package/dist/src/projector/payload.js +80 -0
- package/dist/src/projector/payload.js.map +1 -0
- package/dist/src/projector/prepare.d.ts +3 -0
- package/dist/src/projector/prepare.js +47 -0
- package/dist/src/projector/prepare.js.map +1 -0
- package/dist/src/projector/project.d.ts +2 -0
- package/dist/src/projector/project.js +89 -0
- package/dist/src/projector/project.js.map +1 -0
- package/dist/src/projector/state.d.ts +8 -0
- package/dist/src/projector/state.js +89 -0
- package/dist/src/projector/state.js.map +1 -0
- package/dist/src/projector/types.d.ts +76 -0
- package/dist/src/projector/types.js +19 -0
- package/dist/src/projector/types.js.map +1 -0
- package/dist/src/shared/compare.d.ts +2 -0
- package/dist/src/shared/compare.js +14 -0
- package/dist/src/shared/compare.js.map +1 -0
- package/package.json +61 -0
package/README.md
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Topic Protocol
|
|
2
|
+
|
|
3
|
+
The Topic Protocol defines a **Qi Topic** as the durable unit of context,
|
|
4
|
+
continuity, discovery, authority, collaboration, and outcome for IXO.
|
|
5
|
+
|
|
6
|
+
It uses native Matrix threads as a federated conversation transport without
|
|
7
|
+
making a Matrix event ID, a model session, or a chat transcript the canonical
|
|
8
|
+
identity of a discussion.
|
|
9
|
+
|
|
10
|
+
## Status
|
|
11
|
+
|
|
12
|
+
**Version:** 0.1.0
|
|
13
|
+
**Maturity:** Draft implementation candidate
|
|
14
|
+
**Execution source of truth:** [Linear Topic Protocol project](https://linear.app/ixo-world/project/topic-protocol-4ea58bc7910d)
|
|
15
|
+
|
|
16
|
+
This repository is a protocol baseline, not evidence that the M0 runtime and
|
|
17
|
+
security gates have passed. In particular, complete cold-cache thread discovery,
|
|
18
|
+
E2EE agent participation, encrypted index migration, UCAN replay protection,
|
|
19
|
+
and external action execution require their dedicated conformance evidence.
|
|
20
|
+
|
|
21
|
+
## Read this first
|
|
22
|
+
|
|
23
|
+
- [Architecture decisions](docs/adr/README.md)
|
|
24
|
+
- [Protocol chapters](docs/protocol/README.md)
|
|
25
|
+
- [Machine-readable contracts](contracts/README.md)
|
|
26
|
+
- [Reference implementation](docs/reference-implementation.md)
|
|
27
|
+
- [ixo-portal integration plan](docs/implementation/ixo-portal.md)
|
|
28
|
+
- [Conformance and release gates](docs/conformance.md)
|
|
29
|
+
- [Source recovery and provenance](docs/source-recovery.md)
|
|
30
|
+
- [Linear issue map](docs/tracking/linear-source-of-truth.md)
|
|
31
|
+
|
|
32
|
+
## npm runtime
|
|
33
|
+
|
|
34
|
+
`@ixo/topic-protocol` is the client-neutral runtime for Portal, mobile, Jambo,
|
|
35
|
+
MCP servers, and other Matrix clients. It has no dependency on
|
|
36
|
+
`matrix-js-sdk`; each client supplies a small transport and persistent
|
|
37
|
+
key-value adapter at its integration boundary.
|
|
38
|
+
|
|
39
|
+
The package includes:
|
|
40
|
+
|
|
41
|
+
- strict Draft 2020-12 validation for all 13 contracts;
|
|
42
|
+
- deterministic Topic projection from a root and authorised operations;
|
|
43
|
+
- relation-free Matrix root and canonical native `m.thread` event builders;
|
|
44
|
+
- restart-safe two-event Topic creation with duplicate suppression;
|
|
45
|
+
- append-only Matrix operation parsing and room-upgrade anchor selection;
|
|
46
|
+
- explicit conflict, duplicate-delivery, unauthorised, and unreachable handling;
|
|
47
|
+
- immutable caller inputs and typed protocol errors.
|
|
48
|
+
|
|
49
|
+
Install it in a client:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npm install @ixo/topic-protocol
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Create a Topic with a client-specific transport and durable pending store:
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
import {
|
|
59
|
+
JsonPendingTopicStore,
|
|
60
|
+
TopicRuntime,
|
|
61
|
+
createTopicId,
|
|
62
|
+
} from "@ixo/topic-protocol";
|
|
63
|
+
|
|
64
|
+
const runtime = new TopicRuntime({
|
|
65
|
+
transport: matrixTransport,
|
|
66
|
+
pendingStore: new JsonPendingTopicStore(keyValueStorage),
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
await runtime.createTopic({
|
|
70
|
+
roomId,
|
|
71
|
+
root: {
|
|
72
|
+
version: 1,
|
|
73
|
+
id: createTopicId(),
|
|
74
|
+
title: "Evidence policy",
|
|
75
|
+
status: "active",
|
|
76
|
+
createdBy: actorId,
|
|
77
|
+
createdAt: new Date().toISOString(),
|
|
78
|
+
},
|
|
79
|
+
firstMessage: { msgtype: "m.text", body: "Let’s decide the policy." },
|
|
80
|
+
});
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
The transport must return the server-assigned Matrix event ID. The runtime
|
|
84
|
+
never binds a Topic to a temporary local-echo ID. Pending storage contains only
|
|
85
|
+
the room ID, Topic ID, root event ID, and creation timestamp; clients must back
|
|
86
|
+
it with durable local storage to make restart recovery effective.
|
|
87
|
+
|
|
88
|
+
Install development dependencies and run the complete quality gate:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
npm install
|
|
92
|
+
npm run check
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
See the [reference implementation guide](docs/reference-implementation.md) for
|
|
96
|
+
the public API, trust boundary, and Portal integration notes.
|
|
97
|
+
|
|
98
|
+
## Validate protocol artifacts
|
|
99
|
+
|
|
100
|
+
The static artifact validator remains dependency-free:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
python3 scripts/validate_protocol.py
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
The validator checks the documented inventory, JSON syntax, schema/vector
|
|
107
|
+
pairing, required contract fields, unique API operation/tool names, local
|
|
108
|
+
Markdown links, and the checksum manifest.
|
|
109
|
+
|
|
110
|
+
## Core invariant
|
|
111
|
+
|
|
112
|
+
> Every human message, agent response, agent run, artifact, decision, and
|
|
113
|
+
> executable action occurs in the context of a Topic.
|
|
114
|
+
|
|
115
|
+
Matrix rooms remain the membership, confidentiality, federation, and encryption
|
|
116
|
+
boundary. A Topic can restrict action authority with UCANs, but it cannot claim
|
|
117
|
+
to hide content from members of its Matrix room. A smaller confidential audience
|
|
118
|
+
requires a separate encrypted room.
|
|
119
|
+
|
|
120
|
+
## Repository layout
|
|
121
|
+
|
|
122
|
+
```text
|
|
123
|
+
docs/adr/ Architecture decisions
|
|
124
|
+
docs/protocol/ Human-readable protocol chapters
|
|
125
|
+
docs/implementation/ ixo-portal integration plan
|
|
126
|
+
schemas/ JSON Schema Draft 2020-12 contracts
|
|
127
|
+
examples/ Valid reference vectors
|
|
128
|
+
api/ OpenAPI and MCP contract surfaces
|
|
129
|
+
scripts/ Dependency-free validation and integrity tooling
|
|
130
|
+
checksums/ Reproducible SHA-256 manifest
|
|
131
|
+
src/ TypeScript contract and projection reference library
|
|
132
|
+
test/ TDD contract, behavior, and edge-case tests
|
|
133
|
+
```
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://topic-protocol.ixo.world/schemas/action-receipt.schema.json",
|
|
4
|
+
"title": "Action receipt",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["receiptId", "topicId", "action", "actor", "status", "idempotencyKey", "createdAt"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"receiptId": { "type": "string", "minLength": 1 },
|
|
9
|
+
"topicId": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
|
|
10
|
+
"action": { "type": "string", "minLength": 1 },
|
|
11
|
+
"actor": { "type": "string", "minLength": 1 },
|
|
12
|
+
"status": { "type": "string", "enum": ["requested", "confirmed", "succeeded", "failed", "rejected"] },
|
|
13
|
+
"idempotencyKey": { "type": "string", "minLength": 1 },
|
|
14
|
+
"createdAt": { "type": "string", "format": "date-time" },
|
|
15
|
+
"capability": { "type": "string" }
|
|
16
|
+
},
|
|
17
|
+
"additionalProperties": true
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://topic-protocol.ixo.world/schemas/agent-run.schema.json",
|
|
4
|
+
"title": "Agent run",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["runId", "topicId", "agentId", "capsuleRevision", "status", "startedAt"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"runId": { "type": "string", "minLength": 1 },
|
|
9
|
+
"topicId": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
|
|
10
|
+
"agentId": { "type": "string", "minLength": 1 },
|
|
11
|
+
"capsuleRevision": { "type": "string", "minLength": 1 },
|
|
12
|
+
"status": { "type": "string", "enum": ["running", "completed", "failed", "cancelled"] },
|
|
13
|
+
"startedAt": { "type": "string", "format": "date-time" },
|
|
14
|
+
"finishedAt": { "type": "string", "format": "date-time" },
|
|
15
|
+
"outputs": { "type": "array", "items": { "type": "object" } }
|
|
16
|
+
},
|
|
17
|
+
"additionalProperties": true
|
|
18
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://topic-protocol.ixo.world/schemas/external-session-binding.schema.json",
|
|
4
|
+
"title": "External session binding",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["bindingId", "topicId", "provider", "sessionReference", "actor", "createdAt", "policy"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"bindingId": { "type": "string", "minLength": 1 },
|
|
9
|
+
"topicId": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
|
|
10
|
+
"provider": { "type": "string", "minLength": 1 },
|
|
11
|
+
"sessionReference": { "type": "string", "minLength": 1 },
|
|
12
|
+
"actor": { "type": "string", "minLength": 1 },
|
|
13
|
+
"createdAt": { "type": "string", "format": "date-time" },
|
|
14
|
+
"policy": {
|
|
15
|
+
"type": "object",
|
|
16
|
+
"required": ["privateByDefault"],
|
|
17
|
+
"properties": {
|
|
18
|
+
"privateByDefault": { "type": "boolean" }
|
|
19
|
+
},
|
|
20
|
+
"additionalProperties": true
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"additionalProperties": true
|
|
24
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://topic-protocol.ixo.world/schemas/room-policy.schema.json",
|
|
4
|
+
"title": "Topic room policy",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["version", "mode", "generalEnabled", "allowTopicsInDirectRooms"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"version": { "const": 1 },
|
|
9
|
+
"mode": { "type": "string", "enum": ["required", "optional", "general_only", "object_attached"] },
|
|
10
|
+
"generalEnabled": { "type": "boolean" },
|
|
11
|
+
"allowTopicsInDirectRooms": { "type": "boolean" },
|
|
12
|
+
"authorisedRoles": { "type": "array", "items": { "type": "string" } }
|
|
13
|
+
},
|
|
14
|
+
"additionalProperties": true
|
|
15
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://topic-protocol.ixo.world/schemas/topic-capsule.schema.json",
|
|
4
|
+
"title": "Topic Capsule",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["topicId", "anchor", "stateRevision", "participants", "acceptedMemory", "capabilities", "runtimePolicy"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"topicId": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
|
|
9
|
+
"anchor": { "type": "object", "required": ["roomId", "rootEventId"], "properties": { "roomId": { "type": "string" }, "rootEventId": { "type": "string", "pattern": "^\\$" } } },
|
|
10
|
+
"stateRevision": { "type": "string", "minLength": 1 },
|
|
11
|
+
"participants": { "type": "array", "items": { "type": "object" } },
|
|
12
|
+
"linkedContext": { "type": "array", "items": { "type": "object" } },
|
|
13
|
+
"acceptedMemory": { "type": "array", "items": { "type": "object" } },
|
|
14
|
+
"relevantEvents": { "type": "array", "items": { "type": "object" } },
|
|
15
|
+
"capabilities": { "type": "array", "items": { "type": "object" } },
|
|
16
|
+
"runtimePolicy": { "type": "object" }
|
|
17
|
+
},
|
|
18
|
+
"additionalProperties": true
|
|
19
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://topic-protocol.ixo.world/schemas/topic-index-entry.schema.json",
|
|
4
|
+
"title": "Topic index entry",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["topicId", "roomId", "rootEventId", "status", "latestActivityAt", "completeness"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"topicId": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
|
|
9
|
+
"roomId": { "type": "string", "minLength": 1 },
|
|
10
|
+
"rootEventId": { "type": "string", "pattern": "^\\$" },
|
|
11
|
+
"status": { "type": "string" },
|
|
12
|
+
"latestActivityAt": { "type": "string", "format": "date-time" },
|
|
13
|
+
"notificationMode": { "type": "string", "enum": ["follow", "default", "mute"] },
|
|
14
|
+
"completeness": { "type": "string", "enum": ["complete", "partial-history", "metadata-pending", "decryption-pending"] }
|
|
15
|
+
},
|
|
16
|
+
"additionalProperties": true
|
|
17
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://topic-protocol.ixo.world/schemas/topic-message.schema.json",
|
|
4
|
+
"title": "Topic message",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["topicId", "roomId", "rootEventId", "eventId", "sender", "body", "createdAt"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"topicId": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
|
|
9
|
+
"roomId": { "type": "string", "minLength": 1 },
|
|
10
|
+
"rootEventId": { "type": "string", "pattern": "^\\$" },
|
|
11
|
+
"eventId": { "type": "string", "pattern": "^\\$" },
|
|
12
|
+
"sender": { "type": "string", "minLength": 1 },
|
|
13
|
+
"body": { "type": "string" },
|
|
14
|
+
"createdAt": { "type": "string", "format": "date-time" },
|
|
15
|
+
"inReplyTo": { "type": "string", "pattern": "^\\$" }
|
|
16
|
+
},
|
|
17
|
+
"additionalProperties": true
|
|
18
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://topic-protocol.ixo.world/schemas/topic-operation.schema.json",
|
|
4
|
+
"title": "Topic operation",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["version", "operationId", "topicId", "type", "previousRevision", "actor", "createdAt", "payload"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"version": { "const": 1 },
|
|
9
|
+
"operationId": { "type": "string", "minLength": 1 },
|
|
10
|
+
"topicId": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
|
|
11
|
+
"type": { "type": "string", "enum": ["rename", "change-status", "link-context", "unlink-context", "record-decision", "redirect", "branch", "merge", "resolve-conflict"] },
|
|
12
|
+
"previousRevision": { "type": "string", "minLength": 1 },
|
|
13
|
+
"actor": { "type": "string", "minLength": 1 },
|
|
14
|
+
"createdAt": { "type": "string", "format": "date-time" },
|
|
15
|
+
"payload": { "type": "object" },
|
|
16
|
+
"capability": { "type": "string" }
|
|
17
|
+
},
|
|
18
|
+
"additionalProperties": true
|
|
19
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://topic-protocol.ixo.world/schemas/topic-preferences.schema.json",
|
|
4
|
+
"title": "Per-user Topic preferences",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["version", "topics", "autoFollow"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"version": { "const": 1 },
|
|
9
|
+
"topics": { "type": "object", "additionalProperties": { "type": "object", "required": ["notificationMode", "pinned"], "properties": { "notificationMode": { "type": "string", "enum": ["follow", "default", "mute"] }, "pinned": { "type": "boolean" }, "markedUnreadFrom": { "type": ["string", "null"] } } } },
|
|
10
|
+
"autoFollow": { "type": "string", "enum": ["none", "started", "started_or_participated"] }
|
|
11
|
+
},
|
|
12
|
+
"additionalProperties": false
|
|
13
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://topic-protocol.ixo.world/schemas/topic-record.schema.json",
|
|
4
|
+
"title": "Topic record",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["recordId", "topicId", "kind", "createdBy", "createdAt", "sourceEventIds"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"recordId": { "type": "string", "minLength": 1 },
|
|
9
|
+
"topicId": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
|
|
10
|
+
"kind": { "type": "string", "enum": ["fact", "decision", "assumption", "question", "task", "artifact", "outcome", "memory", "failure"] },
|
|
11
|
+
"createdBy": { "type": "string", "minLength": 1 },
|
|
12
|
+
"createdAt": { "type": "string", "format": "date-time" },
|
|
13
|
+
"sourceEventIds": { "type": "array", "items": { "type": "string", "pattern": "^\\$" } },
|
|
14
|
+
"content": { "type": "object" },
|
|
15
|
+
"accepted": { "type": "boolean" }
|
|
16
|
+
},
|
|
17
|
+
"additionalProperties": true
|
|
18
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://topic-protocol.ixo.world/schemas/topic-relation.schema.json",
|
|
4
|
+
"title": "Topic graph relation",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["relationId", "fromTopicId", "type", "toTopicId", "createdBy", "createdAt"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"relationId": { "type": "string", "minLength": 1 },
|
|
9
|
+
"fromTopicId": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
|
|
10
|
+
"type": { "type": "string", "enum": ["branches_from", "merged_into", "redirects_to", "references", "produced"] },
|
|
11
|
+
"toTopicId": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
|
|
12
|
+
"createdBy": { "type": "string", "minLength": 1 },
|
|
13
|
+
"createdAt": { "type": "string", "format": "date-time" }
|
|
14
|
+
},
|
|
15
|
+
"additionalProperties": true
|
|
16
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://topic-protocol.ixo.world/schemas/topic-root.schema.json",
|
|
4
|
+
"title": "Topic root envelope",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["version", "id", "title", "status", "createdBy", "createdAt"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"version": { "const": 1 },
|
|
9
|
+
"id": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
|
|
10
|
+
"title": { "type": "string", "minLength": 1, "maxLength": 280 },
|
|
11
|
+
"kind": { "type": "string", "enum": ["discussion", "question", "decision", "proposal", "task", "incident", "flow"] },
|
|
12
|
+
"status": { "type": "string", "enum": ["draft", "active", "waiting", "blocked", "resolved", "archived", "redirected"] },
|
|
13
|
+
"createdBy": { "type": "string", "minLength": 1 },
|
|
14
|
+
"createdAt": { "type": "string", "format": "date-time" },
|
|
15
|
+
"context": { "type": "array", "items": { "type": "object", "required": ["type", "id"], "properties": { "type": { "type": "string" }, "id": { "type": "string" } } } }
|
|
16
|
+
},
|
|
17
|
+
"additionalProperties": true
|
|
18
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://topic-protocol.ixo.world/schemas/topic-state.schema.json",
|
|
4
|
+
"title": "Projected Topic state",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["topicId", "revision", "status", "basedOnEvents", "conflicts"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"topicId": { "type": "string", "pattern": "^ixo:topic:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
|
|
9
|
+
"revision": { "type": "string", "minLength": 1 },
|
|
10
|
+
"status": { "type": "string", "enum": ["draft", "active", "waiting", "blocked", "resolved", "archived", "redirected"] },
|
|
11
|
+
"purpose": { "type": "string" },
|
|
12
|
+
"acceptedFacts": { "type": "array", "items": { "type": "object" } },
|
|
13
|
+
"decisions": { "type": "array", "items": { "type": "object" } },
|
|
14
|
+
"unresolvedQuestions": { "type": "array", "items": { "type": "object" } },
|
|
15
|
+
"basedOnEvents": { "type": "array", "items": { "type": "string", "pattern": "^\\$" } },
|
|
16
|
+
"conflicts": { "type": "array", "items": { "type": "string" } }
|
|
17
|
+
},
|
|
18
|
+
"additionalProperties": true
|
|
19
|
+
}
|