@ixo/topic-protocol 0.2.0 → 0.3.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 +8 -2
- package/dist/schemas/topic-capsule.schema.json +2 -1
- package/dist/schemas/topic-file-attachment.schema.json +23 -0
- package/dist/schemas/topic-operation.schema.json +1 -1
- package/dist/schemas/topic-root.schema.json +13 -1
- package/dist/schemas/topic-state.schema.json +10 -1
- package/dist/src/contracts/schemas.d.ts +86 -1
- package/dist/src/contracts/schemas.js +2 -0
- package/dist/src/contracts/schemas.js.map +1 -1
- package/dist/src/errors.d.ts +1 -1
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/matrix/content.d.ts +1 -1
- package/dist/src/matrix/content.js +8 -0
- package/dist/src/matrix/content.js.map +1 -1
- package/dist/src/projector/payload.d.ts +7 -1
- package/dist/src/projector/payload.js +86 -2
- package/dist/src/projector/payload.js.map +1 -1
- package/dist/src/projector/state.js +41 -0
- package/dist/src/projector/state.js.map +1 -1
- package/dist/src/projector/types.d.ts +32 -1
- package/dist/src/projector/types.js +18 -0
- package/dist/src/projector/types.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@ identity of a discussion.
|
|
|
9
9
|
|
|
10
10
|
## Status
|
|
11
11
|
|
|
12
|
-
**Version:** 0.
|
|
12
|
+
**Version:** 0.3.0
|
|
13
13
|
|
|
14
14
|
**Maturity:** Draft implementation candidate
|
|
15
15
|
**Execution source of truth:** [Linear Topic Protocol project](https://linear.app/ixo-world/project/topic-protocol-4ea58bc7910d)
|
|
@@ -39,7 +39,7 @@ key-value adapter at its integration boundary.
|
|
|
39
39
|
|
|
40
40
|
The package includes:
|
|
41
41
|
|
|
42
|
-
- strict Draft 2020-12 validation for all
|
|
42
|
+
- strict Draft 2020-12 validation for all 16 contracts;
|
|
43
43
|
- deterministic Topic projection from a root and authorised operations;
|
|
44
44
|
- singular accepted Overview projection with deterministic conflict handling;
|
|
45
45
|
- relation-free Matrix root and canonical native `m.thread` event builders;
|
|
@@ -49,6 +49,12 @@ The package includes:
|
|
|
49
49
|
- explicit conflict, duplicate-delivery, unauthorised, and unreachable handling;
|
|
50
50
|
- immutable caller inputs and typed protocol errors.
|
|
51
51
|
|
|
52
|
+
Topics retain a singular conversational `kind` while linking any number of
|
|
53
|
+
typed subject contexts. They also project pinned VFS file references without
|
|
54
|
+
copying bytes into Matrix or granting VFS access. A CID, content hash, and
|
|
55
|
+
snapshot metadata are visible to Topic members; the VFS grant remains the
|
|
56
|
+
authority for the file bytes.
|
|
57
|
+
|
|
52
58
|
Install it in a client:
|
|
53
59
|
|
|
54
60
|
```bash
|
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
"$id": "https://topic-protocol.ixo.world/schemas/topic-capsule.schema.json",
|
|
4
4
|
"title": "Topic Capsule",
|
|
5
5
|
"type": "object",
|
|
6
|
-
"required": ["topicId", "anchor", "stateRevision", "participants", "acceptedMemory", "capabilities", "runtimePolicy"],
|
|
6
|
+
"required": ["topicId", "anchor", "stateRevision", "participants", "attachments", "acceptedMemory", "capabilities", "runtimePolicy"],
|
|
7
7
|
"properties": {
|
|
8
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
9
|
"anchor": { "type": "object", "required": ["roomId", "rootEventId"], "properties": { "roomId": { "type": "string" }, "rootEventId": { "type": "string", "pattern": "^\\$" } } },
|
|
10
10
|
"stateRevision": { "type": "string", "minLength": 1 },
|
|
11
11
|
"participants": { "type": "array", "items": { "type": "object" } },
|
|
12
12
|
"linkedContext": { "type": "array", "items": { "type": "object" } },
|
|
13
|
+
"attachments": { "type": "array", "items": { "$ref": "https://topic-protocol.ixo.world/schemas/topic-file-attachment.schema.json" } },
|
|
13
14
|
"acceptedMemory": { "type": "array", "items": { "type": "object" } },
|
|
14
15
|
"relevantEvents": { "type": "array", "items": { "type": "object" } },
|
|
15
16
|
"capabilities": { "type": "array", "items": { "type": "object" } },
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://topic-protocol.ixo.world/schemas/topic-file-attachment.schema.json",
|
|
4
|
+
"title": "Pinned Topic VFS file reference",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["provider", "resource", "fileId", "version", "cid", "contentHash", "path", "name", "mimeType", "size"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"provider": { "const": "ixo.vfs" },
|
|
9
|
+
"resource": { "type": "string", "pattern": "^ixo:filesystem/.+" },
|
|
10
|
+
"fileId": { "type": "string", "minLength": 1 },
|
|
11
|
+
"version": { "type": "integer", "minimum": 1 },
|
|
12
|
+
"cid": { "type": "string", "minLength": 1 },
|
|
13
|
+
"contentHash": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
|
|
14
|
+
"path": { "type": "string", "pattern": "^/(?!.*(?:^|/)\\.\\.(?:/|$)).+" },
|
|
15
|
+
"name": { "type": "string", "minLength": 1 },
|
|
16
|
+
"mimeType": { "type": "string", "minLength": 1 },
|
|
17
|
+
"size": { "type": "integer", "minimum": 0 },
|
|
18
|
+
"attachedBy": { "type": "string", "minLength": 1 },
|
|
19
|
+
"attachedAt": { "type": "string", "format": "date-time" },
|
|
20
|
+
"operationId": { "type": "string", "minLength": 1 }
|
|
21
|
+
},
|
|
22
|
+
"additionalProperties": false
|
|
23
|
+
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"version": { "const": 1 },
|
|
9
9
|
"operationId": { "type": "string", "minLength": 1 },
|
|
10
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", "update-overview", "link-context", "unlink-context", "record-decision", "redirect", "branch", "merge", "resolve-conflict"] },
|
|
11
|
+
"type": { "type": "string", "enum": ["rename", "change-status", "update-overview", "link-context", "unlink-context", "attach-files", "detach-files", "record-decision", "redirect", "branch", "merge", "resolve-conflict"] },
|
|
12
12
|
"previousRevision": { "type": "string", "minLength": 1 },
|
|
13
13
|
"actor": { "type": "string", "minLength": 1 },
|
|
14
14
|
"createdAt": { "type": "string", "format": "date-time" },
|
|
@@ -12,7 +12,19 @@
|
|
|
12
12
|
"status": { "type": "string", "enum": ["draft", "active", "waiting", "blocked", "resolved", "archived", "redirected"] },
|
|
13
13
|
"createdBy": { "type": "string", "minLength": 1 },
|
|
14
14
|
"createdAt": { "type": "string", "format": "date-time" },
|
|
15
|
-
"context": {
|
|
15
|
+
"context": {
|
|
16
|
+
"type": "array",
|
|
17
|
+
"uniqueItems": true,
|
|
18
|
+
"items": {
|
|
19
|
+
"type": "object",
|
|
20
|
+
"required": ["type", "id"],
|
|
21
|
+
"properties": {
|
|
22
|
+
"type": { "type": "string", "minLength": 1 },
|
|
23
|
+
"id": { "type": "string", "minLength": 1 }
|
|
24
|
+
},
|
|
25
|
+
"additionalProperties": false
|
|
26
|
+
}
|
|
27
|
+
},
|
|
16
28
|
"overview": {
|
|
17
29
|
"type": "object",
|
|
18
30
|
"required": ["summary"],
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"$id": "https://topic-protocol.ixo.world/schemas/topic-state.schema.json",
|
|
4
4
|
"title": "Projected Topic state",
|
|
5
5
|
"type": "object",
|
|
6
|
-
"required": ["topicId", "revision", "status", "basedOnEvents", "conflicts"],
|
|
6
|
+
"required": ["topicId", "revision", "status", "attachments", "basedOnEvents", "conflicts"],
|
|
7
7
|
"properties": {
|
|
8
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
9
|
"revision": { "type": "string", "minLength": 1 },
|
|
@@ -24,6 +24,15 @@
|
|
|
24
24
|
"acceptedFacts": { "type": "array", "items": { "type": "object" } },
|
|
25
25
|
"decisions": { "type": "array", "items": { "type": "object" } },
|
|
26
26
|
"unresolvedQuestions": { "type": "array", "items": { "type": "object" } },
|
|
27
|
+
"attachments": {
|
|
28
|
+
"type": "array",
|
|
29
|
+
"items": {
|
|
30
|
+
"allOf": [
|
|
31
|
+
{ "$ref": "https://topic-protocol.ixo.world/schemas/topic-file-attachment.schema.json" },
|
|
32
|
+
{ "type": "object", "required": ["attachedBy", "attachedAt", "operationId"] }
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
},
|
|
27
36
|
"basedOnEvents": { "type": "array", "items": { "type": "string", "pattern": "^\\$" } },
|
|
28
37
|
"conflicts": { "type": "array", "items": { "type": "string" } }
|
|
29
38
|
},
|
|
@@ -197,6 +197,12 @@ export declare const SCHEMA_REGISTRY: Readonly<{
|
|
|
197
197
|
type: string;
|
|
198
198
|
};
|
|
199
199
|
};
|
|
200
|
+
attachments: {
|
|
201
|
+
type: string;
|
|
202
|
+
items: {
|
|
203
|
+
$ref: string;
|
|
204
|
+
};
|
|
205
|
+
};
|
|
200
206
|
acceptedMemory: {
|
|
201
207
|
type: string;
|
|
202
208
|
items: {
|
|
@@ -221,6 +227,67 @@ export declare const SCHEMA_REGISTRY: Readonly<{
|
|
|
221
227
|
};
|
|
222
228
|
additionalProperties: boolean;
|
|
223
229
|
};
|
|
230
|
+
"topic-file-attachment": {
|
|
231
|
+
$schema: string;
|
|
232
|
+
$id: string;
|
|
233
|
+
title: string;
|
|
234
|
+
type: string;
|
|
235
|
+
required: string[];
|
|
236
|
+
properties: {
|
|
237
|
+
provider: {
|
|
238
|
+
const: string;
|
|
239
|
+
};
|
|
240
|
+
resource: {
|
|
241
|
+
type: string;
|
|
242
|
+
pattern: string;
|
|
243
|
+
};
|
|
244
|
+
fileId: {
|
|
245
|
+
type: string;
|
|
246
|
+
minLength: number;
|
|
247
|
+
};
|
|
248
|
+
version: {
|
|
249
|
+
type: string;
|
|
250
|
+
minimum: number;
|
|
251
|
+
};
|
|
252
|
+
cid: {
|
|
253
|
+
type: string;
|
|
254
|
+
minLength: number;
|
|
255
|
+
};
|
|
256
|
+
contentHash: {
|
|
257
|
+
type: string;
|
|
258
|
+
pattern: string;
|
|
259
|
+
};
|
|
260
|
+
path: {
|
|
261
|
+
type: string;
|
|
262
|
+
pattern: string;
|
|
263
|
+
};
|
|
264
|
+
name: {
|
|
265
|
+
type: string;
|
|
266
|
+
minLength: number;
|
|
267
|
+
};
|
|
268
|
+
mimeType: {
|
|
269
|
+
type: string;
|
|
270
|
+
minLength: number;
|
|
271
|
+
};
|
|
272
|
+
size: {
|
|
273
|
+
type: string;
|
|
274
|
+
minimum: number;
|
|
275
|
+
};
|
|
276
|
+
attachedBy: {
|
|
277
|
+
type: string;
|
|
278
|
+
minLength: number;
|
|
279
|
+
};
|
|
280
|
+
attachedAt: {
|
|
281
|
+
type: string;
|
|
282
|
+
format: string;
|
|
283
|
+
};
|
|
284
|
+
operationId: {
|
|
285
|
+
type: string;
|
|
286
|
+
minLength: number;
|
|
287
|
+
};
|
|
288
|
+
};
|
|
289
|
+
additionalProperties: boolean;
|
|
290
|
+
};
|
|
224
291
|
"topic-index-entry": {
|
|
225
292
|
$schema: string;
|
|
226
293
|
$id: string;
|
|
@@ -529,17 +596,21 @@ export declare const SCHEMA_REGISTRY: Readonly<{
|
|
|
529
596
|
};
|
|
530
597
|
context: {
|
|
531
598
|
type: string;
|
|
599
|
+
uniqueItems: boolean;
|
|
532
600
|
items: {
|
|
533
601
|
type: string;
|
|
534
602
|
required: string[];
|
|
535
603
|
properties: {
|
|
536
604
|
type: {
|
|
537
605
|
type: string;
|
|
606
|
+
minLength: number;
|
|
538
607
|
};
|
|
539
608
|
id: {
|
|
540
609
|
type: string;
|
|
610
|
+
minLength: number;
|
|
541
611
|
};
|
|
542
612
|
};
|
|
613
|
+
additionalProperties: boolean;
|
|
543
614
|
};
|
|
544
615
|
};
|
|
545
616
|
overview: {
|
|
@@ -644,6 +715,20 @@ export declare const SCHEMA_REGISTRY: Readonly<{
|
|
|
644
715
|
type: string;
|
|
645
716
|
};
|
|
646
717
|
};
|
|
718
|
+
attachments: {
|
|
719
|
+
type: string;
|
|
720
|
+
items: {
|
|
721
|
+
allOf: ({
|
|
722
|
+
$ref: string;
|
|
723
|
+
type?: never;
|
|
724
|
+
required?: never;
|
|
725
|
+
} | {
|
|
726
|
+
type: string;
|
|
727
|
+
required: string[];
|
|
728
|
+
$ref?: never;
|
|
729
|
+
})[];
|
|
730
|
+
};
|
|
731
|
+
};
|
|
647
732
|
basedOnEvents: {
|
|
648
733
|
type: string;
|
|
649
734
|
items: {
|
|
@@ -782,4 +867,4 @@ export declare const SCHEMA_REGISTRY: Readonly<{
|
|
|
782
867
|
};
|
|
783
868
|
}>;
|
|
784
869
|
export type ContractName = keyof typeof SCHEMA_REGISTRY;
|
|
785
|
-
export declare const CONTRACT_NAMES: readonly ("action-receipt" | "agent-run" | "external-session-binding" | "room-policy" | "topic-capsule" | "topic-index-entry" | "topic-message" | "topic-operation" | "topic-preferences" | "topic-record" | "topic-record-message" | "topic-relation" | "topic-root" | "topic-state" | "topic-source-message")[];
|
|
870
|
+
export declare const CONTRACT_NAMES: readonly ("action-receipt" | "agent-run" | "external-session-binding" | "room-policy" | "topic-capsule" | "topic-file-attachment" | "topic-index-entry" | "topic-message" | "topic-operation" | "topic-preferences" | "topic-record" | "topic-record-message" | "topic-relation" | "topic-root" | "topic-state" | "topic-source-message")[];
|
|
@@ -3,6 +3,7 @@ import agentRun from "../../schemas/agent-run.schema.json" with { type: "json" }
|
|
|
3
3
|
import externalSessionBinding from "../../schemas/external-session-binding.schema.json" with { type: "json" };
|
|
4
4
|
import roomPolicy from "../../schemas/room-policy.schema.json" with { type: "json" };
|
|
5
5
|
import topicCapsule from "../../schemas/topic-capsule.schema.json" with { type: "json" };
|
|
6
|
+
import topicFileAttachment from "../../schemas/topic-file-attachment.schema.json" with { type: "json" };
|
|
6
7
|
import topicIndexEntry from "../../schemas/topic-index-entry.schema.json" with { type: "json" };
|
|
7
8
|
import topicMessage from "../../schemas/topic-message.schema.json" with { type: "json" };
|
|
8
9
|
import topicOperation from "../../schemas/topic-operation.schema.json" with { type: "json" };
|
|
@@ -19,6 +20,7 @@ export const SCHEMA_REGISTRY = Object.freeze({
|
|
|
19
20
|
"external-session-binding": externalSessionBinding,
|
|
20
21
|
"room-policy": roomPolicy,
|
|
21
22
|
"topic-capsule": topicCapsule,
|
|
23
|
+
"topic-file-attachment": topicFileAttachment,
|
|
22
24
|
"topic-index-entry": topicIndexEntry,
|
|
23
25
|
"topic-message": topicMessage,
|
|
24
26
|
"topic-operation": topicOperation,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/contracts/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,0CAA0C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC3F,OAAO,QAAQ,MAAM,qCAAqC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACjF,OAAO,sBAAsB,MAAM,oDAAoD,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC9G,OAAO,UAAU,MAAM,uCAAuC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACrF,OAAO,YAAY,MAAM,yCAAyC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACzF,OAAO,eAAe,MAAM,6CAA6C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAChG,OAAO,YAAY,MAAM,yCAAyC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACzF,OAAO,cAAc,MAAM,2CAA2C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC7F,OAAO,gBAAgB,MAAM,6CAA6C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACjG,OAAO,WAAW,MAAM,wCAAwC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACvF,OAAO,kBAAkB,MAAM,gDAAgD,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACtG,OAAO,aAAa,MAAM,0CAA0C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC3F,OAAO,SAAS,MAAM,sCAAsC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACnF,OAAO,UAAU,MAAM,uCAAuC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACrF,OAAO,kBAAkB,MAAM,gDAAgD,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAEtG,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3C,gBAAgB,EAAE,aAAa;IAC/B,WAAW,EAAE,QAAQ;IACrB,0BAA0B,EAAE,sBAAsB;IAClD,aAAa,EAAE,UAAU;IACzB,eAAe,EAAE,YAAY;IAC7B,mBAAmB,EAAE,eAAe;IACpC,eAAe,EAAE,YAAY;IAC7B,iBAAiB,EAAE,cAAc;IACjC,mBAAmB,EAAE,gBAAgB;IACrC,cAAc,EAAE,WAAW;IAC3B,sBAAsB,EAAE,kBAAkB;IAC1C,gBAAgB,EAAE,aAAa;IAC/B,YAAY,EAAE,SAAS;IACvB,aAAa,EAAE,UAAU;IACzB,sBAAsB,EAAE,kBAAkB;CAC3C,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CACzC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,EAAoB,CACtD,CAAC"}
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/contracts/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,0CAA0C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC3F,OAAO,QAAQ,MAAM,qCAAqC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACjF,OAAO,sBAAsB,MAAM,oDAAoD,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC9G,OAAO,UAAU,MAAM,uCAAuC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACrF,OAAO,YAAY,MAAM,yCAAyC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACzF,OAAO,mBAAmB,MAAM,iDAAiD,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACxG,OAAO,eAAe,MAAM,6CAA6C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAChG,OAAO,YAAY,MAAM,yCAAyC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACzF,OAAO,cAAc,MAAM,2CAA2C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC7F,OAAO,gBAAgB,MAAM,6CAA6C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACjG,OAAO,WAAW,MAAM,wCAAwC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACvF,OAAO,kBAAkB,MAAM,gDAAgD,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACtG,OAAO,aAAa,MAAM,0CAA0C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC3F,OAAO,SAAS,MAAM,sCAAsC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACnF,OAAO,UAAU,MAAM,uCAAuC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACrF,OAAO,kBAAkB,MAAM,gDAAgD,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAEtG,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3C,gBAAgB,EAAE,aAAa;IAC/B,WAAW,EAAE,QAAQ;IACrB,0BAA0B,EAAE,sBAAsB;IAClD,aAAa,EAAE,UAAU;IACzB,eAAe,EAAE,YAAY;IAC7B,uBAAuB,EAAE,mBAAmB;IAC5C,mBAAmB,EAAE,eAAe;IACpC,eAAe,EAAE,YAAY;IAC7B,iBAAiB,EAAE,cAAc;IACjC,mBAAmB,EAAE,gBAAgB;IACrC,cAAc,EAAE,WAAW;IAC3B,sBAAsB,EAAE,kBAAkB;IAC1C,gBAAgB,EAAE,aAAa;IAC/B,YAAY,EAAE,SAAS;IACvB,aAAa,EAAE,UAAU;IACzB,sBAAsB,EAAE,kBAAkB;CAC3C,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CACzC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,EAAoB,CACtD,CAAC"}
|
package/dist/src/errors.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type TopicProtocolErrorCode = "ANCHOR_CONFLICT" | "ANCHOR_CYCLE" | "AUTHORIZATION_FAILED" | "CONTRACT_VALIDATION_FAILED" | "DUPLICATE_OPERATION" | "FIRST_MESSAGE_FAILED" | "INVALID_ANCHOR" | "INVALID_MATRIX_EVENT" | "INVALID_OPERATION_PAYLOAD" | "INVALID_SERVER_EVENT_ID" | "NON_CANONICAL_CONFLICT_SELECTION" | "PENDING_ROOT_UNRESOLVED" | "ROOT_CREATION_FAILED" | "ROOT_DISCOVERY_FAILED" | "STORAGE_FAILED" | "TOPIC_ROOT_NOT_FOUND" | "TOPIC_MISMATCH" | "UNKNOWN_CONFLICT" | "UNKNOWN_CONTRACT";
|
|
1
|
+
export type TopicProtocolErrorCode = "ANCHOR_CONFLICT" | "ANCHOR_CYCLE" | "AUTHORIZATION_FAILED" | "CONTRACT_VALIDATION_FAILED" | "DUPLICATE_OPERATION" | "FIRST_MESSAGE_FAILED" | "INVALID_ANCHOR" | "INVALID_CONTEXT_TYPE" | "INVALID_MATRIX_EVENT" | "INVALID_OPERATION_PAYLOAD" | "INVALID_SERVER_EVENT_ID" | "NON_CANONICAL_CONFLICT_SELECTION" | "PENDING_ROOT_UNRESOLVED" | "ROOT_CREATION_FAILED" | "ROOT_DISCOVERY_FAILED" | "STORAGE_FAILED" | "TOPIC_ROOT_NOT_FOUND" | "TOPIC_MISMATCH" | "UNKNOWN_CONFLICT" | "UNKNOWN_CONTRACT";
|
|
2
2
|
export declare class TopicProtocolError extends Error {
|
|
3
3
|
readonly code: TopicProtocolErrorCode;
|
|
4
4
|
readonly details: Readonly<Record<string, unknown>>;
|
package/dist/src/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAsBA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,CAAyB;IAC7B,OAAO,CAAoC;IAEpD,YACE,IAA4B,EAC5B,OAAe,EACf,UAA6C,EAAE,EAC/C,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -9,5 +9,5 @@ export { isTopicInfrastructureEvent, parseTopicRootEvent, projectMatrixTopic, }
|
|
|
9
9
|
export { JsonPendingTopicStore, MemoryPendingTopicStore, type TopicKeyValueStore, } from "./matrix/pending.js";
|
|
10
10
|
export { TopicRuntime, type TopicRuntimeOptions } from "./matrix/runtime.js";
|
|
11
11
|
export { MATRIX_ROOM_MESSAGE, TOPIC_ANCHOR_KEY, TOPIC_METADATA_KEY, TOPIC_OPERATION_EVENT_TYPE, type CanonicalTopicAnchor, type MatrixEventContent, type MatrixSendRequest, type MatrixTopicProjection, type MatrixTopicProjectionInput, type ParsedTopicRoot, type PendingTopicCreation, type PendingTopicStore, type RejectedTopicEvent, type RejectedTopicEventReason, type TopicAnchorConflict, type TopicCreationInput, type TopicCreationResult, type TopicFirstMessageFactory, type TopicMatrixEvent, type TopicMatrixTransport, type TopicRootContentOptions, } from "./matrix/types.js";
|
|
12
|
-
export { TOPIC_KINDS, TOPIC_STATUSES, type IgnoredOperation, type IgnoredOperationReason, type MatrixAnchor, type ProjectedTopicRelation, type ProjectionInput, type TopicContext, type TopicDecision, type TopicKind, type TopicNextStep, type TopicOperation, type TopicOperationType, type TopicProjection, type ProjectedTopicOverview, type TopicOverview, type TopicProjectionConflict, type TopicRelationType, type TopicRoot, type TopicStatus, } from "./projector/types.js";
|
|
12
|
+
export { TOPIC_KINDS, TOPIC_CONTEXT_TYPES, TOPIC_STATUSES, TOPIC_VFS_FILE_PROVIDER, type IgnoredOperation, type IgnoredOperationReason, type MatrixAnchor, type ProjectedTopicRelation, type ProjectionInput, type TopicContext, type TopicContextType, type TopicFileAttachmentIdentity, type TopicDecision, type TopicKind, type TopicNextStep, type TopicOperation, type TopicOperationType, type TopicProjection, type ProjectedTopicAttachment, type ProjectedTopicOverview, type TopicOverview, type TopicProjectionConflict, type TopicRelationType, type TopicRoot, type TopicStatus, type TopicVfsFileReference, isCanonicalTopicContextType, } from "./projector/types.js";
|
|
13
13
|
export { TOPIC_RECORD_KINDS, type TopicRecord, type TopicRecordKind, } from "./records/types.js";
|
package/dist/src/index.js
CHANGED
|
@@ -9,6 +9,6 @@ export { isTopicInfrastructureEvent, parseTopicRootEvent, projectMatrixTopic, }
|
|
|
9
9
|
export { JsonPendingTopicStore, MemoryPendingTopicStore, } from "./matrix/pending.js";
|
|
10
10
|
export { TopicRuntime } from "./matrix/runtime.js";
|
|
11
11
|
export { MATRIX_ROOM_MESSAGE, TOPIC_ANCHOR_KEY, TOPIC_METADATA_KEY, TOPIC_OPERATION_EVENT_TYPE, } from "./matrix/types.js";
|
|
12
|
-
export { TOPIC_KINDS, TOPIC_STATUSES, } from "./projector/types.js";
|
|
12
|
+
export { TOPIC_KINDS, TOPIC_CONTEXT_TYPES, TOPIC_STATUSES, TOPIC_VFS_FILE_PROVIDER, isCanonicalTopicContextType, } from "./projector/types.js";
|
|
13
13
|
export { TOPIC_RECORD_KINDS, } from "./records/types.js";
|
|
14
14
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAEf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,cAAc,EACd,gBAAgB,GAGjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,kBAAkB,GAEnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,EACxB,0BAA0B,EAC1B,qBAAqB,EACrB,aAAa,EACb,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,+BAA+B,EAC/B,+BAA+B,EAC/B,8BAA8B,EAC9B,8BAA8B,GAS/B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,qBAAqB,EACrB,uBAAuB,GAExB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAA4B,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,0BAA0B,GAkB3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,WAAW,EACX,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAEf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,cAAc,EACd,gBAAgB,GAGjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,kBAAkB,GAEnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,EACxB,0BAA0B,EAC1B,qBAAqB,EACrB,aAAa,EACb,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,+BAA+B,EAC/B,+BAA+B,EAC/B,8BAA8B,EAC9B,8BAA8B,GAS/B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,qBAAqB,EACrB,uBAAuB,GAExB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAA4B,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,0BAA0B,GAkB3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,uBAAuB,EAuBvB,2BAA2B,GAC5B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,kBAAkB,GAGnB,MAAM,oBAAoB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type MatrixAnchor, type TopicOperation, type TopicRoot } from "../projector/types.js";
|
|
2
2
|
import { MATRIX_ROOM_MESSAGE, TOPIC_OPERATION_EVENT_TYPE, type MatrixEventContent, type TopicRootContentOptions } from "./types.js";
|
|
3
3
|
export declare function createTopicId(): string;
|
|
4
4
|
export declare function createTopicOperationId(): string;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { v7 as uuidv7 } from "uuid";
|
|
2
2
|
import { assertContract } from "../contracts/validator.js";
|
|
3
3
|
import { TopicProtocolError } from "../errors.js";
|
|
4
|
+
import { parsePayload } from "../projector/payload.js";
|
|
5
|
+
import { isCanonicalTopicContextType, } from "../projector/types.js";
|
|
4
6
|
import { MATRIX_ROOM_MESSAGE, TOPIC_ANCHOR_KEY, TOPIC_METADATA_KEY, TOPIC_OPERATION_EVENT_TYPE, } from "./types.js";
|
|
5
7
|
export function createTopicId() {
|
|
6
8
|
return `ixo:topic:${uuidv7()}`;
|
|
@@ -29,6 +31,11 @@ export function assertTopicMessageContent(message) {
|
|
|
29
31
|
}
|
|
30
32
|
export function buildTopicRootContent(root, options = {}) {
|
|
31
33
|
assertContract("topic-root", root);
|
|
34
|
+
for (const context of root.context ?? []) {
|
|
35
|
+
if (isCanonicalTopicContextType(context.type))
|
|
36
|
+
continue;
|
|
37
|
+
throw new TopicProtocolError("INVALID_CONTEXT_TYPE", "New Topic roots require core or dotted vendor context types", { type: context.type });
|
|
38
|
+
}
|
|
32
39
|
if (options.replaces !== undefined)
|
|
33
40
|
assertMatrixAnchor(options.replaces);
|
|
34
41
|
return {
|
|
@@ -55,6 +62,7 @@ export function buildTopicMessageContent(anchor, message) {
|
|
|
55
62
|
export function buildTopicOperationContent(anchor, operation) {
|
|
56
63
|
assertMatrixAnchor(anchor);
|
|
57
64
|
assertContract("topic-operation", operation);
|
|
65
|
+
parsePayload(operation);
|
|
58
66
|
return {
|
|
59
67
|
operation,
|
|
60
68
|
"m.relates_to": {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../../src/matrix/content.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../../src/matrix/content.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type TopicContext, type TopicOperation, type TopicOverview, type TopicStatus } from "./types.js";
|
|
1
|
+
import { type TopicContext, type TopicFileAttachmentIdentity, type TopicOperation, type TopicOverview, type TopicStatus, type TopicVfsFileReference } from "./types.js";
|
|
2
2
|
interface DecisionPayload {
|
|
3
3
|
readonly id: string;
|
|
4
4
|
readonly summary: string;
|
|
@@ -16,6 +16,12 @@ export type ParsedPayload = {
|
|
|
16
16
|
} | {
|
|
17
17
|
readonly kind: "link-context" | "unlink-context";
|
|
18
18
|
readonly context: TopicContext;
|
|
19
|
+
} | {
|
|
20
|
+
readonly kind: "attach-files";
|
|
21
|
+
readonly files: readonly TopicVfsFileReference[];
|
|
22
|
+
} | {
|
|
23
|
+
readonly kind: "detach-files";
|
|
24
|
+
readonly files: readonly TopicFileAttachmentIdentity[];
|
|
19
25
|
} | {
|
|
20
26
|
readonly kind: "record-decision";
|
|
21
27
|
readonly decision: DecisionPayload;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TopicProtocolError } from "../errors.js";
|
|
2
2
|
import { isJsonDateTime } from "../contracts/validator.js";
|
|
3
|
-
import { TOPIC_STATUSES, } from "./types.js";
|
|
3
|
+
import { isCanonicalTopicContextType, TOPIC_STATUSES, TOPIC_VFS_FILE_PROVIDER, } from "./types.js";
|
|
4
4
|
function invalid(operation, message) {
|
|
5
5
|
throw new TopicProtocolError("INVALID_OPERATION_PAYLOAD", `${operation.type} ${operation.operationId}: ${message}`, { operationId: operation.operationId, operationType: operation.type });
|
|
6
6
|
}
|
|
@@ -11,6 +11,13 @@ function recordValue(operation, key) {
|
|
|
11
11
|
}
|
|
12
12
|
return value;
|
|
13
13
|
}
|
|
14
|
+
function arrayValue(operation, key) {
|
|
15
|
+
const value = operation.payload[key];
|
|
16
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
17
|
+
return invalid(operation, `${key} must be a non-empty array`);
|
|
18
|
+
}
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
14
21
|
function stringValue(operation, source, key) {
|
|
15
22
|
const value = source[key];
|
|
16
23
|
if (typeof value !== "string" || value.trim().length === 0) {
|
|
@@ -32,11 +39,84 @@ function topicIdValue(operation, key) {
|
|
|
32
39
|
}
|
|
33
40
|
function contextValue(operation) {
|
|
34
41
|
const context = recordValue(operation, "context");
|
|
42
|
+
const type = stringValue(operation, context, "type");
|
|
43
|
+
if (!isCanonicalTopicContextType(type)) {
|
|
44
|
+
return invalid(operation, "context.type must be a core or dotted vendor namespace");
|
|
45
|
+
}
|
|
35
46
|
return {
|
|
36
|
-
type
|
|
47
|
+
type,
|
|
37
48
|
id: stringValue(operation, context, "id"),
|
|
38
49
|
};
|
|
39
50
|
}
|
|
51
|
+
function positiveIntegerValue(operation, source, key) {
|
|
52
|
+
const value = source[key];
|
|
53
|
+
if (!Number.isSafeInteger(value) || value < 1) {
|
|
54
|
+
return invalid(operation, `${key} must be a positive integer`);
|
|
55
|
+
}
|
|
56
|
+
return value;
|
|
57
|
+
}
|
|
58
|
+
function nonNegativeIntegerValue(operation, source, key) {
|
|
59
|
+
const value = source[key];
|
|
60
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
61
|
+
return invalid(operation, `${key} must be a non-negative integer`);
|
|
62
|
+
}
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
65
|
+
function attachmentIdentityValue(operation, value) {
|
|
66
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
67
|
+
return invalid(operation, "files entries must be objects");
|
|
68
|
+
}
|
|
69
|
+
const source = value;
|
|
70
|
+
const provider = stringValue(operation, source, "provider");
|
|
71
|
+
if (provider !== TOPIC_VFS_FILE_PROVIDER)
|
|
72
|
+
return invalid(operation, "provider must be ixo.vfs");
|
|
73
|
+
return {
|
|
74
|
+
provider: TOPIC_VFS_FILE_PROVIDER,
|
|
75
|
+
resource: stringValue(operation, source, "resource"),
|
|
76
|
+
fileId: stringValue(operation, source, "fileId"),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function attachmentValue(operation, value) {
|
|
80
|
+
const identity = attachmentIdentityValue(operation, value);
|
|
81
|
+
const source = value;
|
|
82
|
+
const contentHash = stringValue(operation, source, "contentHash");
|
|
83
|
+
if (!/^[0-9a-f]{64}$/u.test(contentHash)) {
|
|
84
|
+
return invalid(operation, "contentHash must be a lowercase SHA-256 digest");
|
|
85
|
+
}
|
|
86
|
+
const path = stringValue(operation, source, "path");
|
|
87
|
+
if (!path.startsWith("/") || path.split("/").includes("..")) {
|
|
88
|
+
return invalid(operation, "path must be an absolute VFS path without traversal");
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
...identity,
|
|
92
|
+
version: positiveIntegerValue(operation, source, "version"),
|
|
93
|
+
cid: stringValue(operation, source, "cid"),
|
|
94
|
+
contentHash,
|
|
95
|
+
path,
|
|
96
|
+
name: stringValue(operation, source, "name"),
|
|
97
|
+
mimeType: stringValue(operation, source, "mimeType"),
|
|
98
|
+
size: nonNegativeIntegerValue(operation, source, "size"),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function attachmentKey(identity) {
|
|
102
|
+
return `${identity.provider}\u0000${identity.resource}\u0000${identity.fileId}`;
|
|
103
|
+
}
|
|
104
|
+
function uniqueFiles(operation, files) {
|
|
105
|
+
const keys = new Set();
|
|
106
|
+
for (const file of files) {
|
|
107
|
+
const key = attachmentKey(file);
|
|
108
|
+
if (keys.has(key))
|
|
109
|
+
return invalid(operation, "files must not contain duplicate VFS identities");
|
|
110
|
+
keys.add(key);
|
|
111
|
+
}
|
|
112
|
+
return files;
|
|
113
|
+
}
|
|
114
|
+
function attachmentsValue(operation) {
|
|
115
|
+
return uniqueFiles(operation, arrayValue(operation, "files").map((value) => attachmentValue(operation, value)));
|
|
116
|
+
}
|
|
117
|
+
function attachmentIdentitiesValue(operation) {
|
|
118
|
+
return uniqueFiles(operation, arrayValue(operation, "files").map((value) => attachmentIdentityValue(operation, value)));
|
|
119
|
+
}
|
|
40
120
|
function decisionValue(operation) {
|
|
41
121
|
const decision = recordValue(operation, "decision");
|
|
42
122
|
return {
|
|
@@ -112,6 +192,10 @@ export function parsePayload(operation) {
|
|
|
112
192
|
case "link-context":
|
|
113
193
|
case "unlink-context":
|
|
114
194
|
return { kind: operation.type, context: contextValue(operation) };
|
|
195
|
+
case "attach-files":
|
|
196
|
+
return { kind: operation.type, files: attachmentsValue(operation) };
|
|
197
|
+
case "detach-files":
|
|
198
|
+
return { kind: operation.type, files: attachmentIdentitiesValue(operation) };
|
|
115
199
|
case "record-decision":
|
|
116
200
|
return { kind: operation.type, decision: decisionValue(operation) };
|
|
117
201
|
case "redirect":
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payload.js","sourceRoot":"","sources":["../../../src/projector/payload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EACL,cAAc,
|
|
1
|
+
{"version":3,"file":"payload.js","sourceRoot":"","sources":["../../../src/projector/payload.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ export function initialState(root, anchor) {
|
|
|
9
9
|
title: root.title,
|
|
10
10
|
status: root.status,
|
|
11
11
|
context: uniqueContexts(root.context ?? []),
|
|
12
|
+
attachments: [],
|
|
12
13
|
decisions: [],
|
|
13
14
|
...(root.overview === undefined
|
|
14
15
|
? {}
|
|
@@ -50,6 +51,45 @@ function applyContext(state, payload) {
|
|
|
50
51
|
context: payload.kind === "link-context" ? uniqueContexts([...contexts, payload.context]) : contexts,
|
|
51
52
|
};
|
|
52
53
|
}
|
|
54
|
+
function attachmentKey(attachment) {
|
|
55
|
+
return `${attachment.provider}\u0000${attachment.resource}\u0000${attachment.fileId}`;
|
|
56
|
+
}
|
|
57
|
+
function sameReference(attachment, reference) {
|
|
58
|
+
return attachment.resource === reference.resource
|
|
59
|
+
&& attachment.fileId === reference.fileId
|
|
60
|
+
&& attachment.version === reference.version
|
|
61
|
+
&& attachment.cid === reference.cid
|
|
62
|
+
&& attachment.contentHash === reference.contentHash
|
|
63
|
+
&& attachment.path === reference.path
|
|
64
|
+
&& attachment.name === reference.name
|
|
65
|
+
&& attachment.mimeType === reference.mimeType
|
|
66
|
+
&& attachment.size === reference.size;
|
|
67
|
+
}
|
|
68
|
+
function sortedAttachments(attachments) {
|
|
69
|
+
return [...attachments].sort((left, right) => compareText(attachmentKey(left), attachmentKey(right)));
|
|
70
|
+
}
|
|
71
|
+
function applyAttachments(state, operation) {
|
|
72
|
+
const payload = operation.parsedPayload;
|
|
73
|
+
if (payload.kind === "detach-files") {
|
|
74
|
+
const removed = new Set(payload.files.map(attachmentKey));
|
|
75
|
+
return { ...state, attachments: state.attachments.filter((attachment) => !removed.has(attachmentKey(attachment))) };
|
|
76
|
+
}
|
|
77
|
+
if (payload.kind !== "attach-files")
|
|
78
|
+
return state;
|
|
79
|
+
const attachments = new Map(state.attachments.map((attachment) => [attachmentKey(attachment), attachment]));
|
|
80
|
+
for (const file of payload.files) {
|
|
81
|
+
const existing = attachments.get(attachmentKey(file));
|
|
82
|
+
if (existing !== undefined && sameReference(existing, file))
|
|
83
|
+
continue;
|
|
84
|
+
attachments.set(attachmentKey(file), {
|
|
85
|
+
...file,
|
|
86
|
+
attachedBy: operation.actor,
|
|
87
|
+
attachedAt: operation.createdAt,
|
|
88
|
+
operationId: operation.operationId,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return { ...state, attachments: sortedAttachments([...attachments.values()]) };
|
|
92
|
+
}
|
|
53
93
|
function applyDecision(state, operation) {
|
|
54
94
|
const payload = operation.parsedPayload;
|
|
55
95
|
if (payload.kind !== "record-decision")
|
|
@@ -96,6 +136,7 @@ export function applyOperation(state, operation) {
|
|
|
96
136
|
updated = { ...updated, status: payload.status };
|
|
97
137
|
updated = applyOverview(updated, operation);
|
|
98
138
|
updated = applyContext(updated, payload);
|
|
139
|
+
updated = applyAttachments(updated, operation);
|
|
99
140
|
updated = applyDecision(updated, operation);
|
|
100
141
|
updated = applyGraphRelation(updated, operation);
|
|
101
142
|
updated = applyRedirect(updated, operation);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/projector/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/projector/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,42 @@
|
|
|
1
1
|
export declare const TOPIC_STATUSES: readonly ["draft", "active", "waiting", "blocked", "resolved", "archived", "redirected"];
|
|
2
2
|
export declare const TOPIC_KINDS: readonly ["discussion", "question", "decision", "proposal", "task", "incident", "flow"];
|
|
3
|
+
export declare const TOPIC_CONTEXT_TYPES: readonly ["ixo.flow", "ixo.resource", "ixo.service", "ixo.authority", "ixo.domain", "ixo.account", "ixo.entity"];
|
|
4
|
+
export declare const TOPIC_VFS_FILE_PROVIDER = "ixo.vfs";
|
|
3
5
|
export type TopicStatus = (typeof TOPIC_STATUSES)[number];
|
|
4
6
|
export type TopicKind = (typeof TOPIC_KINDS)[number];
|
|
5
|
-
export type
|
|
7
|
+
export type TopicContextType = (typeof TOPIC_CONTEXT_TYPES)[number];
|
|
8
|
+
export type TopicOperationType = "rename" | "change-status" | "update-overview" | "link-context" | "unlink-context" | "attach-files" | "detach-files" | "record-decision" | "redirect" | "branch" | "merge" | "resolve-conflict";
|
|
6
9
|
export interface TopicContext {
|
|
7
10
|
readonly type: string;
|
|
8
11
|
readonly id: string;
|
|
9
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Returns whether a context type uses the Topic Protocol's current writer
|
|
15
|
+
* vocabulary. Readers intentionally retain support for legacy free-form types.
|
|
16
|
+
*/
|
|
17
|
+
export declare function isCanonicalTopicContextType(value: string): boolean;
|
|
18
|
+
export interface TopicVfsFileReference {
|
|
19
|
+
readonly provider: typeof TOPIC_VFS_FILE_PROVIDER;
|
|
20
|
+
readonly resource: string;
|
|
21
|
+
readonly fileId: string;
|
|
22
|
+
readonly version: number;
|
|
23
|
+
readonly cid: string;
|
|
24
|
+
readonly contentHash: string;
|
|
25
|
+
readonly path: string;
|
|
26
|
+
readonly name: string;
|
|
27
|
+
readonly mimeType: string;
|
|
28
|
+
readonly size: number;
|
|
29
|
+
}
|
|
30
|
+
export interface TopicFileAttachmentIdentity {
|
|
31
|
+
readonly provider: typeof TOPIC_VFS_FILE_PROVIDER;
|
|
32
|
+
readonly resource: string;
|
|
33
|
+
readonly fileId: string;
|
|
34
|
+
}
|
|
35
|
+
export interface ProjectedTopicAttachment extends TopicVfsFileReference {
|
|
36
|
+
readonly attachedBy: string;
|
|
37
|
+
readonly attachedAt: string;
|
|
38
|
+
readonly operationId: string;
|
|
39
|
+
}
|
|
10
40
|
export interface TopicNextStep {
|
|
11
41
|
readonly summary: string;
|
|
12
42
|
readonly assignee?: string;
|
|
@@ -76,6 +106,7 @@ export interface TopicProjection {
|
|
|
76
106
|
readonly title: string;
|
|
77
107
|
readonly status: TopicStatus;
|
|
78
108
|
readonly context: readonly TopicContext[];
|
|
109
|
+
readonly attachments: readonly ProjectedTopicAttachment[];
|
|
79
110
|
readonly decisions: readonly TopicDecision[];
|
|
80
111
|
readonly overview?: ProjectedTopicOverview;
|
|
81
112
|
readonly relations: readonly ProjectedTopicRelation[];
|
|
@@ -16,4 +16,22 @@ export const TOPIC_KINDS = [
|
|
|
16
16
|
"incident",
|
|
17
17
|
"flow",
|
|
18
18
|
];
|
|
19
|
+
export const TOPIC_CONTEXT_TYPES = [
|
|
20
|
+
"ixo.flow",
|
|
21
|
+
"ixo.resource",
|
|
22
|
+
"ixo.service",
|
|
23
|
+
"ixo.authority",
|
|
24
|
+
"ixo.domain",
|
|
25
|
+
"ixo.account",
|
|
26
|
+
"ixo.entity",
|
|
27
|
+
];
|
|
28
|
+
export const TOPIC_VFS_FILE_PROVIDER = "ixo.vfs";
|
|
29
|
+
/**
|
|
30
|
+
* Returns whether a context type uses the Topic Protocol's current writer
|
|
31
|
+
* vocabulary. Readers intentionally retain support for legacy free-form types.
|
|
32
|
+
*/
|
|
33
|
+
export function isCanonicalTopicContextType(value) {
|
|
34
|
+
return TOPIC_CONTEXT_TYPES.includes(value)
|
|
35
|
+
|| /^(?!ixo\.)[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/u.test(value);
|
|
36
|
+
}
|
|
19
37
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/projector/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,OAAO;IACP,QAAQ;IACR,SAAS;IACT,SAAS;IACT,UAAU;IACV,UAAU;IACV,YAAY;CACJ,CAAC;AACX,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,YAAY;IACZ,UAAU;IACV,UAAU;IACV,UAAU;IACV,MAAM;IACN,UAAU;IACV,MAAM;CACE,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/projector/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,OAAO;IACP,QAAQ;IACR,SAAS;IACT,SAAS;IACT,UAAU;IACV,UAAU;IACV,YAAY;CACJ,CAAC;AACX,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,YAAY;IACZ,UAAU;IACV,UAAU;IACV,UAAU;IACV,MAAM;IACN,UAAU;IACV,MAAM;CACE,CAAC;AACX,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,UAAU;IACV,cAAc;IACd,aAAa;IACb,eAAe;IACf,YAAY;IACZ,aAAa;IACb,YAAY;CACJ,CAAC;AACX,MAAM,CAAC,MAAM,uBAAuB,GAAG,SAAS,CAAC;AAwBjD;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CAAC,KAAa;IACvD,OAAO,mBAAmB,CAAC,QAAQ,CAAC,KAAyB,CAAC;WACzD,mDAAmD,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACvE,CAAC"}
|