@x12i/memorix-metadata 3.0.3 → 3.2.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.
Files changed (56) hide show
  1. package/README.md +4 -0
  2. package/dist/abstracts.d.ts +9 -3
  3. package/dist/abstracts.d.ts.map +1 -1
  4. package/dist/abstracts.js +70 -66
  5. package/dist/abstracts.js.map +1 -1
  6. package/dist/fold-bindings.d.ts +19 -0
  7. package/dist/fold-bindings.d.ts.map +1 -0
  8. package/dist/fold-bindings.js +103 -0
  9. package/dist/fold-bindings.js.map +1 -0
  10. package/dist/index.d.ts +3 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +3 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/kind-fields.d.ts.map +1 -1
  15. package/dist/kind-fields.js +0 -1
  16. package/dist/kind-fields.js.map +1 -1
  17. package/dist/kinds.d.ts +2 -2
  18. package/dist/kinds.d.ts.map +1 -1
  19. package/dist/kinds.js +9 -11
  20. package/dist/kinds.js.map +1 -1
  21. package/dist/normalize.d.ts +1 -0
  22. package/dist/normalize.d.ts.map +1 -1
  23. package/dist/normalize.js +5 -1
  24. package/dist/normalize.js.map +1 -1
  25. package/dist/resolve.d.ts.map +1 -1
  26. package/dist/resolve.js +14 -3
  27. package/dist/resolve.js.map +1 -1
  28. package/dist/topology.d.ts +52 -0
  29. package/dist/topology.d.ts.map +1 -0
  30. package/dist/topology.js +376 -0
  31. package/dist/topology.js.map +1 -0
  32. package/dist/types.d.ts +146 -16
  33. package/dist/types.d.ts.map +1 -1
  34. package/dist/validate.d.ts.map +1 -1
  35. package/dist/validate.js +179 -64
  36. package/dist/validate.js.map +1 -1
  37. package/examples/invalid/agent-classification.json +31 -31
  38. package/examples/invalid/broken-binding.json +27 -27
  39. package/examples/invalid/completion-mapping-with-exec-policy.json +31 -31
  40. package/examples/invalid/missing-parent.json +31 -31
  41. package/examples/invalid/operational-kind-root.json +31 -31
  42. package/examples/invalid/pipeline-unknown-service.json +31 -31
  43. package/examples/invalid/relationship-missing-rules.json +24 -24
  44. package/examples/invalid/relationship-with-storage.json +24 -24
  45. package/examples/invalid/service-with-secrets.json +27 -27
  46. package/examples/knowx/normalized/pack.json +1133 -173
  47. package/examples/opx/normalized/pack.json +309 -291
  48. package/examples/opx/raw/abstract-types.json +223 -7
  49. package/examples/opx/raw/object-types.json +26 -95
  50. package/examples/opx/raw/pipelines-and-sources.json +66 -18
  51. package/examples/opx/raw/relationship-definitions.json +17 -47
  52. package/examples/opx/raw/view-definitions.json +6 -20
  53. package/examples/opx/raw/write-and-source-mappings.json +135 -20
  54. package/examples/project-opx/normalized/pack.json +355 -263
  55. package/package.json +1 -1
  56. package/examples/opx/raw/abstract-bindings.json +0 -38
@@ -3,26 +3,242 @@
3
3
  {
4
4
  "id": "People",
5
5
  "name": "People",
6
- "meaning": "Employees and contractors who perform operational work",
7
- "category": "entity"
6
+ "meaning": "People who perform operational work \u2014 inside the org (employeeId) or outside (externalPersonId), distinguished by identity kind",
7
+ "category": "entity",
8
+ "properties": [
9
+ {
10
+ "id": "title",
11
+ "valueType": "string",
12
+ "required": true
13
+ },
14
+ {
15
+ "id": "role",
16
+ "valueType": "string",
17
+ "required": true
18
+ },
19
+ {
20
+ "id": "lens",
21
+ "valueType": "string",
22
+ "required": false
23
+ },
24
+ {
25
+ "id": "email",
26
+ "valueType": "string",
27
+ "required": false
28
+ },
29
+ {
30
+ "id": "organization",
31
+ "valueType": "string",
32
+ "required": false
33
+ }
34
+ ],
35
+ "members": [
36
+ {
37
+ "objectType": "people",
38
+ "contentType": "snapshots",
39
+ "properties": [
40
+ {
41
+ "abstractProperty": "title",
42
+ "contentType": "snapshots",
43
+ "mappingId": "opx-people-abstract"
44
+ },
45
+ {
46
+ "abstractProperty": "role",
47
+ "contentType": "snapshots",
48
+ "mappingId": "opx-people-abstract"
49
+ },
50
+ {
51
+ "abstractProperty": "lens",
52
+ "contentType": "snapshots",
53
+ "mappingId": "opx-people-abstract"
54
+ },
55
+ {
56
+ "abstractProperty": "email",
57
+ "contentType": "snapshots",
58
+ "mappingId": "opx-people-abstract"
59
+ },
60
+ {
61
+ "abstractProperty": "organization",
62
+ "contentType": "snapshots",
63
+ "mappingId": "opx-people-abstract"
64
+ }
65
+ ]
66
+ }
67
+ ],
68
+ "union": false,
69
+ "notes": "People abstract \u2194 people OT 1:1. Inside/outside org is concept.identifiers.primary.kind (employeeId | externalPersonId), not a second OT."
8
70
  },
9
71
  {
10
72
  "id": "WorkItems",
11
73
  "name": "Work Items",
12
74
  "meaning": "Units of operational work",
13
- "category": "entity"
75
+ "category": "entity",
76
+ "properties": [
77
+ {
78
+ "id": "title",
79
+ "valueType": "string",
80
+ "required": true
81
+ },
82
+ {
83
+ "id": "status",
84
+ "valueType": "string",
85
+ "required": true
86
+ },
87
+ {
88
+ "id": "priority",
89
+ "valueType": "string",
90
+ "required": false
91
+ }
92
+ ],
93
+ "members": [
94
+ {
95
+ "objectType": "work-items",
96
+ "contentType": "snapshots",
97
+ "properties": [
98
+ {
99
+ "abstractProperty": "title",
100
+ "contentType": "snapshots",
101
+ "propertyPath": "data.title",
102
+ "concreteValueType": "string"
103
+ },
104
+ {
105
+ "abstractProperty": "status",
106
+ "contentType": "snapshots",
107
+ "propertyPath": "data.status",
108
+ "concreteValueType": "string"
109
+ },
110
+ {
111
+ "abstractProperty": "priority",
112
+ "contentType": "snapshots",
113
+ "propertyPath": "data.priority",
114
+ "concreteValueType": "string"
115
+ }
116
+ ]
117
+ }
118
+ ],
119
+ "union": false
14
120
  },
15
121
  {
16
- "id": "Procedures",
17
- "name": "Procedures",
122
+ "id": "Playbooks",
123
+ "name": "Playbooks",
18
124
  "meaning": "Reusable operational knowledge / playbooks",
19
- "category": "knowledge"
125
+ "category": "knowledge",
126
+ "properties": [
127
+ {
128
+ "id": "title",
129
+ "valueType": "string",
130
+ "required": true
131
+ },
132
+ {
133
+ "id": "body",
134
+ "valueType": "string",
135
+ "required": true
136
+ },
137
+ {
138
+ "id": "contentHash",
139
+ "valueType": "string",
140
+ "required": false
141
+ }
142
+ ],
143
+ "members": [
144
+ {
145
+ "objectType": "playbooks",
146
+ "contentType": "snapshots",
147
+ "properties": [
148
+ {
149
+ "abstractProperty": "title",
150
+ "contentType": "snapshots",
151
+ "propertyPath": "data.name",
152
+ "concreteValueType": "string"
153
+ },
154
+ {
155
+ "abstractProperty": "body",
156
+ "contentType": "snapshots",
157
+ "propertyPath": "data.body",
158
+ "concreteValueType": "string"
159
+ },
160
+ {
161
+ "abstractProperty": "contentHash",
162
+ "contentType": "snapshots",
163
+ "propertyPath": "data.contentHash",
164
+ "concreteValueType": "string"
165
+ }
166
+ ]
167
+ }
168
+ ],
169
+ "union": false
20
170
  },
21
171
  {
22
172
  "id": "ActivityEvents",
23
173
  "name": "Activity Events",
24
174
  "meaning": "Progress and activity reports about work items",
25
- "category": "event"
175
+ "category": "event",
176
+ "properties": [
177
+ {
178
+ "id": "type",
179
+ "valueType": "string",
180
+ "required": true
181
+ },
182
+ {
183
+ "id": "message",
184
+ "valueType": "string",
185
+ "required": true
186
+ },
187
+ {
188
+ "id": "workItemId",
189
+ "valueType": "recordId",
190
+ "required": true
191
+ },
192
+ {
193
+ "id": "actorId",
194
+ "valueType": "recordId",
195
+ "required": false
196
+ },
197
+ {
198
+ "id": "occurredAt",
199
+ "valueType": "datetime",
200
+ "required": false
201
+ }
202
+ ],
203
+ "members": [
204
+ {
205
+ "objectType": "activity-events",
206
+ "contentType": "snapshots",
207
+ "properties": [
208
+ {
209
+ "abstractProperty": "type",
210
+ "contentType": "snapshots",
211
+ "propertyPath": "data.type",
212
+ "concreteValueType": "string"
213
+ },
214
+ {
215
+ "abstractProperty": "message",
216
+ "contentType": "snapshots",
217
+ "propertyPath": "data.message",
218
+ "concreteValueType": "string"
219
+ },
220
+ {
221
+ "abstractProperty": "workItemId",
222
+ "contentType": "snapshots",
223
+ "propertyPath": "data.workItemId",
224
+ "concreteValueType": "recordId"
225
+ },
226
+ {
227
+ "abstractProperty": "actorId",
228
+ "contentType": "snapshots",
229
+ "propertyPath": "data.actorId",
230
+ "concreteValueType": "recordId"
231
+ },
232
+ {
233
+ "abstractProperty": "occurredAt",
234
+ "contentType": "snapshots",
235
+ "propertyPath": "data.occurredAt",
236
+ "concreteValueType": "datetime"
237
+ }
238
+ ]
239
+ }
240
+ ],
241
+ "union": false
26
242
  }
27
243
  ]
28
244
  }
@@ -1,20 +1,21 @@
1
1
  {
2
2
  "objectTypes": [
3
3
  {
4
- "id": "employees",
5
- "name": "Employees",
4
+ "id": "people",
5
+ "name": "People",
6
6
  "dataCategory": "entity",
7
- "abstractTypes": [
8
- "People"
9
- ],
7
+ "abstractTypes": ["People"],
8
+ "notes": "Single people OT. Inside vs outside org is identity kind (concept.identifiers.primary.kind): employeeId | externalPersonId — not separate object types.",
10
9
  "contentTypes": [
11
10
  {
12
11
  "id": "raw",
13
- "required": true
12
+ "required": true,
13
+ "requiredReason": "Landed provider-native payload; identity and lineage depend on it."
14
14
  },
15
15
  {
16
16
  "id": "snapshots",
17
- "required": true
17
+ "required": true,
18
+ "requiredReason": "Canonical composed person view used by queries and abstracts."
18
19
  },
19
20
  {
20
21
  "id": "discovery",
@@ -32,65 +33,20 @@
32
33
  "defaultValue": "default"
33
34
  }
34
35
  },
35
- {
36
- "id": "relationships",
37
- "notes": "Candidate store shape until Gate G4"
38
- }
39
- ]
40
- },
41
- {
42
- "id": "contractors",
43
- "name": "Contractors",
44
- "dataCategory": "entity",
45
- "abstractTypes": [
46
- "People"
47
- ],
48
- "contentTypes": [
49
- {
50
- "id": "raw"
51
- },
52
- {
53
- "id": "snapshots"
54
- },
55
- {
56
- "id": "discovery",
57
- "discriminator": {
58
- "path": "data.discoveryType",
59
- "required": false
60
- }
61
- },
62
- {
63
- "id": "analysis",
64
- "discriminator": {
65
- "path": "data.analysisType",
66
- "required": false
67
- }
68
- },
69
- {
70
- "id": "relationships"
71
- }
36
+ { "id": "relationships", "notes": "Candidate store shape until Gate G4" }
72
37
  ]
73
38
  },
74
39
  {
75
40
  "id": "work-items",
76
41
  "name": "Work Items",
77
42
  "dataCategory": "entity",
78
- "abstractTypes": [
79
- "WorkItems"
80
- ],
43
+ "abstractTypes": ["WorkItems"],
81
44
  "contentTypes": [
82
- {
83
- "id": "raw"
84
- },
85
- {
86
- "id": "snapshots"
87
- },
45
+ { "id": "raw" },
46
+ { "id": "snapshots" },
88
47
  {
89
48
  "id": "discovery",
90
- "discriminator": {
91
- "path": "data.discoveryType",
92
- "required": false
93
- }
49
+ "discriminator": { "path": "data.discoveryType", "required": false }
94
50
  },
95
51
  {
96
52
  "id": "analysis",
@@ -108,16 +64,9 @@
108
64
  "defaultValue": "priority"
109
65
  }
110
66
  },
111
- {
112
- "id": "workflow"
113
- },
114
- {
115
- "id": "context",
116
- "retention": "work-scoped-ttl"
117
- },
118
- {
119
- "id": "relationships"
120
- }
67
+ { "id": "workflow" },
68
+ { "id": "context", "retention": "work-scoped-ttl" },
69
+ { "id": "relationships" }
121
70
  ],
122
71
  "snapshotBuckets": {
123
72
  "analytics": "optional",
@@ -126,23 +75,14 @@
126
75
  }
127
76
  },
128
77
  {
129
- "id": "procedures",
130
- "name": "Procedures",
78
+ "id": "playbooks",
79
+ "name": "Playbooks",
131
80
  "dataCategory": "knowledge",
132
- "abstractTypes": [
133
- "Procedures"
134
- ],
81
+ "abstractTypes": ["Playbooks"],
135
82
  "contentTypes": [
136
- {
137
- "id": "raw"
138
- },
139
- {
140
- "id": "snapshots",
141
- "notes": "Persistent knowledge content"
142
- },
143
- {
144
- "id": "relationships"
145
- }
83
+ { "id": "raw" },
84
+ { "id": "snapshots", "notes": "Persistent knowledge content" },
85
+ { "id": "relationships" }
146
86
  ],
147
87
  "retention": "persistent-knowledge"
148
88
  },
@@ -150,20 +90,11 @@
150
90
  "id": "activity-events",
151
91
  "name": "Activity Events",
152
92
  "dataCategory": "event",
153
- "abstractTypes": [
154
- "ActivityEvents"
155
- ],
93
+ "abstractTypes": ["ActivityEvents"],
156
94
  "contentTypes": [
157
- {
158
- "id": "raw"
159
- },
160
- {
161
- "id": "snapshots",
162
- "notes": "Normalized event content"
163
- },
164
- {
165
- "id": "relationships"
166
- }
95
+ { "id": "raw" },
96
+ { "id": "snapshots", "notes": "Normalized event content" },
97
+ { "id": "relationships" }
167
98
  ]
168
99
  }
169
100
  ]
@@ -100,23 +100,41 @@
100
100
  "contentType": "workflow"
101
101
  }
102
102
  ]
103
+ },
104
+ {
105
+ "id": "opx-enrich-priority",
106
+ "name": "Enrich WI priority (draft then write)",
107
+ "trigger": "explicit",
108
+ "description": "Capture snapshot → enrich service (opx-enrich-priority) → write-record. Runtime v2 uses stepKind enrich + serviceId.",
109
+ "steps": [
110
+ {
111
+ "id": "enrich",
112
+ "kind": "enrich",
113
+ "serviceId": "opx-enrich-priority"
114
+ },
115
+ {
116
+ "id": "write",
117
+ "kind": "write-record",
118
+ "contentType": "snapshots"
119
+ }
120
+ ]
103
121
  }
104
122
  ],
105
123
  "sources": [
106
124
  {
107
125
  "id": "opx-source",
108
126
  "name": "Opx-service",
109
- "kind": "rest-fixture",
127
+ "kind": "rest",
110
128
  "baseUrlEnv": "OPX_SOURCE_URL",
111
129
  "defaultBaseUrl": "http://127.0.0.1:5102",
112
130
  "credentialRef": "opx-source-local",
113
- "connectorRef": "opx-fixture",
131
+ "connectorRef": "opx-rest",
114
132
  "endpoints": [
115
133
  "/employees",
116
- "/contractors",
134
+ "/external-people",
117
135
  "/work-items",
118
136
  "/activity-events",
119
- "/procedures",
137
+ "/playbooks",
120
138
  "/work-items/:id/context"
121
139
  ],
122
140
  "pagination": {
@@ -131,13 +149,18 @@
131
149
  },
132
150
  "routes": [
133
151
  {
134
- "endpoint": "/procedures",
135
- "objectType": "procedures",
152
+ "endpoint": "/playbooks",
153
+ "objectType": "playbooks",
136
154
  "dataCategory": "knowledge",
137
155
  "identityPath": "id",
138
- "primaryKind": "procedureId",
139
- "modes": ["knowledge"],
140
- "pageSize": 2
156
+ "primaryKind": "playbookId",
157
+ "modes": [
158
+ "knowledge"
159
+ ],
160
+ "pageSize": 2,
161
+ "checkpoint": {
162
+ "method": "cursor"
163
+ }
141
164
  },
142
165
  {
143
166
  "endpoint": "/work-items/:id/context",
@@ -145,7 +168,12 @@
145
168
  "dataCategory": "entity",
146
169
  "identityPath": "workItemId",
147
170
  "primaryKind": "workItemId",
148
- "modes": ["context"]
171
+ "modes": [
172
+ "context"
173
+ ],
174
+ "checkpoint": {
175
+ "method": "cursor"
176
+ }
149
177
  },
150
178
  {
151
179
  "endpoint": "/work-items",
@@ -153,23 +181,38 @@
153
181
  "dataCategory": "entity",
154
182
  "identityPath": "id",
155
183
  "primaryKind": "workItemId",
156
- "modes": ["knowledge"]
184
+ "modes": [
185
+ "knowledge"
186
+ ],
187
+ "checkpoint": {
188
+ "method": "cursor"
189
+ }
157
190
  },
158
191
  {
159
192
  "endpoint": "/employees",
160
- "objectType": "employees",
193
+ "objectType": "people",
161
194
  "dataCategory": "entity",
162
195
  "identityPath": "id",
163
196
  "primaryKind": "employeeId",
164
- "modes": ["knowledge"]
197
+ "modes": [
198
+ "knowledge"
199
+ ],
200
+ "checkpoint": {
201
+ "method": "cursor"
202
+ }
165
203
  },
166
204
  {
167
- "endpoint": "/contractors",
168
- "objectType": "contractors",
205
+ "endpoint": "/external-people",
206
+ "objectType": "people",
169
207
  "dataCategory": "entity",
170
208
  "identityPath": "id",
171
- "primaryKind": "contractorId",
172
- "modes": ["knowledge"]
209
+ "primaryKind": "externalPersonId",
210
+ "modes": [
211
+ "knowledge"
212
+ ],
213
+ "checkpoint": {
214
+ "method": "cursor"
215
+ }
173
216
  },
174
217
  {
175
218
  "endpoint": "/activity-events",
@@ -177,7 +220,12 @@
177
220
  "dataCategory": "event",
178
221
  "identityPath": "id",
179
222
  "primaryKind": "activityEventId",
180
- "modes": ["knowledge"]
223
+ "modes": [
224
+ "knowledge"
225
+ ],
226
+ "checkpoint": {
227
+ "method": "cursor"
228
+ }
181
229
  }
182
230
  ]
183
231
  }
@@ -3,43 +3,31 @@
3
3
  {
4
4
  "id": "people-assigned-to-work-items",
5
5
  "name": "People assigned to work items",
6
- "meaning": "A person (employee or contractor) is assigned to perform a work item",
6
+ "meaning": "A person is assigned to perform a work item",
7
7
  "directionality": "directed",
8
- "from": {
9
- "abstractType": "People",
10
- "property": "assignedWorkItems"
11
- },
12
- "to": {
13
- "abstractType": "WorkItems",
14
- "property": "assignedPeople"
15
- },
8
+ "from": { "abstractType": "People", "property": "assignedWorkItems" },
9
+ "to": { "abstractType": "WorkItems", "property": "assignedPeople" },
16
10
  "discoveryRules": [
17
11
  {
18
12
  "id": "from-source-assignee",
19
13
  "kind": "source-field",
20
14
  "sourcePath": "assigneeId",
21
- "notes": "opx-source work-items.assigneeId resolves across employees and contractors"
15
+ "notes": "opx-source work-items.assigneeId resolves to people OT (any identity kind)"
22
16
  }
23
17
  ]
24
18
  },
25
19
  {
26
- "id": "work-items-use-procedures",
27
- "name": "Work items use procedures",
28
- "meaning": "A work item follows one or more reusable procedures",
20
+ "id": "work-items-use-playbooks",
21
+ "name": "Work items use playbooks",
22
+ "meaning": "A work item follows one or more reusable playbooks",
29
23
  "directionality": "directed",
30
- "from": {
31
- "abstractType": "WorkItems",
32
- "property": "usedProcedures"
33
- },
34
- "to": {
35
- "abstractType": "Procedures",
36
- "property": "usedByWorkItems"
37
- },
24
+ "from": { "abstractType": "WorkItems", "property": "usedPlaybooks" },
25
+ "to": { "abstractType": "Playbooks", "property": "usedByWorkItems" },
38
26
  "discoveryRules": [
39
27
  {
40
- "id": "from-source-procedure-ids",
28
+ "id": "from-source-playbook-ids",
41
29
  "kind": "source-field",
42
- "sourcePath": "procedureIds"
30
+ "sourcePath": "playbookIds"
43
31
  }
44
32
  ]
45
33
  },
@@ -48,14 +36,8 @@
48
36
  "name": "Activity events about work items",
49
37
  "meaning": "An activity event reports progress on a work item",
50
38
  "directionality": "directed",
51
- "from": {
52
- "abstractType": "ActivityEvents",
53
- "property": "aboutWorkItems"
54
- },
55
- "to": {
56
- "abstractType": "WorkItems",
57
- "property": "activityEvents"
58
- },
39
+ "from": { "abstractType": "ActivityEvents", "property": "aboutWorkItems" },
40
+ "to": { "abstractType": "WorkItems", "property": "activityEvents" },
59
41
  "discoveryRules": [
60
42
  {
61
43
  "id": "from-source-work-item-id",
@@ -69,14 +51,8 @@
69
51
  "name": "Work items depend on work items",
70
52
  "meaning": "A work item cannot complete until another work item completes",
71
53
  "directionality": "directed",
72
- "from": {
73
- "abstractType": "WorkItems",
74
- "property": "dependsOn"
75
- },
76
- "to": {
77
- "abstractType": "WorkItems",
78
- "property": "dependedOnBy"
79
- },
54
+ "from": { "abstractType": "WorkItems", "property": "dependsOn" },
55
+ "to": { "abstractType": "WorkItems", "property": "dependedOnBy" },
80
56
  "discoveryRules": [
81
57
  {
82
58
  "id": "from-source-depends-on",
@@ -90,14 +66,8 @@
90
66
  "name": "People collaborate with people",
91
67
  "meaning": "Two people collaborate on operational work",
92
68
  "directionality": "undirected",
93
- "from": {
94
- "abstractType": "People",
95
- "property": "collaborators"
96
- },
97
- "to": {
98
- "abstractType": "People",
99
- "property": "collaborators"
100
- },
69
+ "from": { "abstractType": "People", "property": "collaborators" },
70
+ "to": { "abstractType": "People", "property": "collaborators" },
101
71
  "discoveryRules": [
102
72
  {
103
73
  "id": "from-source-collaborator-ids",