@x12i/memorix-format 2.2.2 → 2.3.2

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 (57) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +36 -86
  3. package/dist/base-reexport.d.ts +8 -0
  4. package/dist/base-reexport.d.ts.map +1 -0
  5. package/dist/base-reexport.js +8 -0
  6. package/dist/base-reexport.js.map +1 -0
  7. package/dist/cli.js +179 -15
  8. package/dist/cli.js.map +1 -1
  9. package/dist/index.d.ts +3 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +2 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/v2/index.d.ts +7 -0
  14. package/dist/v2/index.d.ts.map +1 -0
  15. package/dist/v2/index.js +6 -0
  16. package/dist/v2/index.js.map +1 -0
  17. package/dist/v2/migrate-present.d.ts +47 -0
  18. package/dist/v2/migrate-present.d.ts.map +1 -0
  19. package/dist/v2/migrate-present.js +225 -0
  20. package/dist/v2/migrate-present.js.map +1 -0
  21. package/dist/v2/profiles.d.ts +9 -0
  22. package/dist/v2/profiles.d.ts.map +1 -0
  23. package/dist/v2/profiles.js +63 -0
  24. package/dist/v2/profiles.js.map +1 -0
  25. package/dist/v2/revision.d.ts +24 -0
  26. package/dist/v2/revision.d.ts.map +1 -0
  27. package/dist/v2/revision.js +44 -0
  28. package/dist/v2/revision.js.map +1 -0
  29. package/dist/v2/types.d.ts +94 -0
  30. package/dist/v2/types.d.ts.map +1 -0
  31. package/dist/v2/types.js +3 -0
  32. package/dist/v2/types.js.map +1 -0
  33. package/dist/v2/validate.d.ts +8 -0
  34. package/dist/v2/validate.d.ts.map +1 -0
  35. package/dist/v2/validate.js +225 -0
  36. package/dist/v2/validate.js.map +1 -0
  37. package/docs/association-format.md +26 -445
  38. package/docs/memorix-format.md +24 -186
  39. package/docs/memorix-record-v2.md +101 -0
  40. package/docs/memorix-workflow-format.md +13 -1
  41. package/docs/migrate-present-to-v2.md +49 -0
  42. package/examples/v2/activity-events-snapshots.json +31 -0
  43. package/examples/v2/employees-discovery.json +26 -0
  44. package/examples/v2/employees-snapshots.json +27 -0
  45. package/examples/v2/procedures-knowledge.json +27 -0
  46. package/examples/v2/work-items-analysis.json +26 -0
  47. package/examples/v2/work-items-context.json +32 -0
  48. package/examples/v2/work-items-decisions.json +26 -0
  49. package/examples/v2/work-items-raw.json +37 -0
  50. package/examples/v2/work-items-relationships-candidate.json +38 -0
  51. package/examples/v2/work-items-snapshots-lifecycle.json +31 -0
  52. package/examples/v2/work-items-snapshots-lightweight-refs.json +34 -0
  53. package/examples/v2/work-items-snapshots.json +28 -0
  54. package/examples/v2/work-items-workflow.json +28 -0
  55. package/package.json +7 -2
  56. package/docs/memorix-format-additions.md +0 -956
  57. package/docs/memorix-format-for-dummies-association-corrections.md +0 -113
@@ -0,0 +1,47 @@
1
+ import { type MemorixRecordV2 } from "./types.js";
2
+ export type MigratePresentToV2Options = {
3
+ objectType: string;
4
+ contentType: string;
5
+ dataCategory: "entity" | "event" | "knowledge";
6
+ /** Defaults to 1 when absent on present records. */
7
+ revision?: number;
8
+ /** ISO timestamps fallback when _system lacks them. */
9
+ now?: string;
10
+ /**
11
+ * Strip associated* from the V2 record (default true).
12
+ * Extracted relationship candidates are always produced regardless.
13
+ */
14
+ dropAssociated?: boolean;
15
+ /** Issuer for primary identifier when not inferable. */
16
+ defaultIssuer?: string;
17
+ /**
18
+ * Optional map of legacy associated* property → relationshipDefinitionId.
19
+ * Unmapped properties stay pending-metadata-resolution.
20
+ */
21
+ associatedPropertyMap?: Record<string, string>;
22
+ };
23
+ export type ExtractedRelationship = {
24
+ sourceRecordId: string;
25
+ legacyProperty: string;
26
+ targetRecordId: string | null;
27
+ relationshipDefinitionId: string | null;
28
+ status: "mapped" | "pending-metadata-resolution" | "quarantined-missing-recordId";
29
+ /** Business payload keys dropped from the association item (never copied into V2). */
30
+ droppedPayloadKeys?: string[];
31
+ };
32
+ export type MigratePresentToV2Result = {
33
+ /** True when a V2 envelope was produced (may still need validateMemorixRecordV2). */
34
+ ok: boolean;
35
+ v2: MemorixRecordV2;
36
+ extractedRelationships: ExtractedRelationship[];
37
+ warnings: string[];
38
+ };
39
+ /**
40
+ * Convert a present (or legacy→present) record into memorix-record/2 plus
41
+ * out-of-band extracted relationship candidates.
42
+ */
43
+ export declare function migratePresentToV2(input: unknown, options: MigratePresentToV2Options): MigratePresentToV2Result;
44
+ /** Convenience: return only the V2 record (relationships discarded — prefer migratePresentToV2). */
45
+ export declare function migratePresentToV2Record(input: unknown, options: MigratePresentToV2Options): MemorixRecordV2;
46
+ export declare function migratePresentRecordsToV2(inputs: unknown[], options: MigratePresentToV2Options): MigratePresentToV2Result[];
47
+ //# sourceMappingURL=migrate-present.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-present.d.ts","sourceRoot":"","sources":["../../src/v2/migrate-present.ts"],"names":[],"mappings":"AAQA,OAAO,EAA4B,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAE5E,MAAM,MAAM,yBAAyB,GAAG;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,QAAQ,GAAG,OAAO,GAAG,WAAW,CAAC;IAC/C,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,MAAM,EACF,QAAQ,GACR,6BAA6B,GAC7B,8BAA8B,CAAC;IACnC,sFAAsF;IACtF,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,qFAAqF;IACrF,EAAE,EAAE,OAAO,CAAC;IACZ,EAAE,EAAE,eAAe,CAAC;IACpB,sBAAsB,EAAE,qBAAqB,EAAE,CAAC;IAChD,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AA2HF;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,yBAAyB,GACjC,wBAAwB,CAsH1B;AAED,oGAAoG;AACpG,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,yBAAyB,GACjC,eAAe,CAEjB;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,OAAO,EAAE,EACjB,OAAO,EAAE,yBAAyB,GACjC,wBAAwB,EAAE,CAE5B"}
@@ -0,0 +1,225 @@
1
+ /**
2
+ * Migrate present Memorix envelopes → memorix-record/2.
3
+ *
4
+ * Copied associated* payloads are stripped from the V2 record, but every
5
+ * resolvable target recordId is preserved out-of-band in extractedRelationships.
6
+ * Physical relationship storage is NOT written here (Gate G4).
7
+ */
8
+ import { migrateMemorixRecord } from "../migrate.js";
9
+ import { MEMORIX_RECORD_FORMAT_V2 } from "./types.js";
10
+ function isPlainObject(v) {
11
+ return v !== null && typeof v === "object" && !Array.isArray(v);
12
+ }
13
+ function asObject(v) {
14
+ return isPlainObject(v) ? { ...v } : {};
15
+ }
16
+ function stringify(v) {
17
+ if (typeof v === "string" && v.trim())
18
+ return v.trim();
19
+ if (typeof v === "number" || typeof v === "boolean")
20
+ return String(v);
21
+ return undefined;
22
+ }
23
+ const LIGHTWEIGHT_REF_KEYS = new Set([
24
+ "recordId",
25
+ "relationshipId",
26
+ "relationshipDefinitionId",
27
+ ]);
28
+ function primaryFromExtIdentifier(ext, recordId, defaultIssuer, warnings) {
29
+ const kind = stringify(ext.kind) ?? "recordId";
30
+ const kindNamed = stringify(ext[kind]);
31
+ const value = kindNamed ??
32
+ stringify(ext.value) ??
33
+ stringify(ext.key)?.split(":").slice(1).join(":") ??
34
+ recordId;
35
+ if (!kindNamed && !stringify(ext.value) && warnings) {
36
+ warnings.push(`Primary identifier kind '${kind}' had no kind-named value; fell back to '${value}'.`);
37
+ }
38
+ const primary = {
39
+ kind,
40
+ value,
41
+ };
42
+ const issuer = stringify(ext.issuer) ?? defaultIssuer;
43
+ if (issuer)
44
+ primary.issuer = issuer;
45
+ const normalized = stringify(ext.normalizedValue);
46
+ if (normalized)
47
+ primary.normalizedValue = normalized;
48
+ return primary;
49
+ }
50
+ function extractTargetRecordId(item) {
51
+ return (stringify(item.recordId) ??
52
+ stringify(item.targetRecordId) ??
53
+ stringify(item.id) ??
54
+ null);
55
+ }
56
+ function extractRelationshipsFromPresent(present, sourceRecordId, associatedPropertyMap) {
57
+ const extracted = [];
58
+ const warnings = [];
59
+ for (const [key, value] of Object.entries(present)) {
60
+ if (!key.startsWith("associated"))
61
+ continue;
62
+ if (!Array.isArray(value)) {
63
+ warnings.push(`Legacy property ${key} is not an array; skipped extraction.`);
64
+ continue;
65
+ }
66
+ const defId = associatedPropertyMap?.[key] ?? null;
67
+ for (const raw of value) {
68
+ if (!isPlainObject(raw)) {
69
+ extracted.push({
70
+ sourceRecordId,
71
+ legacyProperty: key,
72
+ targetRecordId: null,
73
+ relationshipDefinitionId: defId,
74
+ status: "quarantined-missing-recordId",
75
+ });
76
+ warnings.push(`Non-object item under ${key}; quarantined.`);
77
+ continue;
78
+ }
79
+ const targetRecordId = extractTargetRecordId(raw);
80
+ const droppedPayloadKeys = Object.keys(raw).filter((k) => !LIGHTWEIGHT_REF_KEYS.has(k));
81
+ if (!targetRecordId) {
82
+ extracted.push({
83
+ sourceRecordId,
84
+ legacyProperty: key,
85
+ targetRecordId: null,
86
+ relationshipDefinitionId: defId,
87
+ status: "quarantined-missing-recordId",
88
+ droppedPayloadKeys: droppedPayloadKeys.length ? droppedPayloadKeys : undefined,
89
+ });
90
+ warnings.push(`Association under ${key} lacks target recordId; quarantined for metadata-assisted migration.`);
91
+ continue;
92
+ }
93
+ extracted.push({
94
+ sourceRecordId,
95
+ legacyProperty: key,
96
+ targetRecordId,
97
+ relationshipDefinitionId: defId,
98
+ status: defId ? "mapped" : "pending-metadata-resolution",
99
+ droppedPayloadKeys: droppedPayloadKeys.length ? droppedPayloadKeys : undefined,
100
+ });
101
+ }
102
+ }
103
+ if (extracted.length > 0) {
104
+ warnings.push("Relationship storage authoritative model is Gate G4 Candidate C (central per-category collections); extracted relationships were not persisted on the V2 record. Option A lightweight roots remain format-valid but are not authoritative storage.");
105
+ }
106
+ return { extracted, warnings };
107
+ }
108
+ /**
109
+ * Convert a present (or legacy→present) record into memorix-record/2 plus
110
+ * out-of-band extracted relationship candidates.
111
+ */
112
+ export function migratePresentToV2(input, options) {
113
+ const warnings = [];
114
+ const present = migrateMemorixRecord(input);
115
+ const now = options.now ?? new Date().toISOString();
116
+ const recordId = stringify(present.recordId) ?? "unknown";
117
+ if (!stringify(present.recordId)) {
118
+ warnings.push("recordId missing on input; used 'unknown'.");
119
+ }
120
+ const conceptIn = asObject(present.concept);
121
+ const ext = asObject(conceptIn._extIdentifier);
122
+ const title = stringify(conceptIn.title) ?? recordId;
123
+ const sysIn = asObject(present._system);
124
+ if (!stringify(sysIn.createdAt)) {
125
+ warnings.push(`createdAt missing; defaulted to ${now}.`);
126
+ }
127
+ if (!stringify(sysIn.modifiedAt) && !stringify(sysIn.createdAt)) {
128
+ warnings.push(`modifiedAt missing; defaulted to createdAt/now.`);
129
+ }
130
+ const createdAt = stringify(sysIn.createdAt) ?? now;
131
+ const modifiedAt = stringify(sysIn.modifiedAt) ?? createdAt;
132
+ const observedAt = stringify(sysIn.observedAt);
133
+ const state = stringify(sysIn.state) === "archived" ||
134
+ stringify(sysIn.state) === "superseded" ||
135
+ stringify(sysIn.state) === "active"
136
+ ? stringify(sysIn.state)
137
+ : "active";
138
+ const lifecycle = Array.isArray(sysIn.lifecycle) ? sysIn.lifecycle : undefined;
139
+ const provenance = isPlainObject(sysIn.provenance) ? sysIn.provenance : undefined;
140
+ const { extracted, warnings: relWarnings } = extractRelationshipsFromPresent(present, recordId, options.associatedPropertyMap);
141
+ warnings.push(...relWarnings);
142
+ const dropAssociated = options.dropAssociated !== false;
143
+ if (dropAssociated) {
144
+ for (const key of Object.keys(present)) {
145
+ if (key.startsWith("associated"))
146
+ delete present[key];
147
+ }
148
+ }
149
+ const allowBuckets = options.contentType === "snapshots" || options.contentType === "knowledge";
150
+ // Capture unrecognized non-associated open roots that are not snapshot buckets / core.
151
+ const known = new Set([
152
+ "recordId",
153
+ "concept",
154
+ "data",
155
+ "_system",
156
+ "_id",
157
+ "analytics",
158
+ "enrichment",
159
+ "insights",
160
+ "format",
161
+ "revision",
162
+ "objectType",
163
+ "contentType",
164
+ "dataCategory",
165
+ ]);
166
+ for (const key of Object.keys(present)) {
167
+ if (key.startsWith("associated"))
168
+ continue;
169
+ if (key.startsWith("_") && key !== "_system" && key !== "_id") {
170
+ warnings.push(`Unrecognized machine root '${key}' was dropped (not migrated onto subject).`);
171
+ delete present[key];
172
+ }
173
+ else if (!known.has(key) && !key.startsWith("_")) {
174
+ warnings.push(`Unrecognized root '${key}' was dropped from V2 migration.`);
175
+ delete present[key];
176
+ }
177
+ }
178
+ const out = {
179
+ format: MEMORIX_RECORD_FORMAT_V2,
180
+ recordId,
181
+ revision: options.revision ?? 1,
182
+ objectType: options.objectType,
183
+ contentType: options.contentType,
184
+ dataCategory: options.dataCategory,
185
+ concept: {
186
+ title,
187
+ identifiers: {
188
+ primary: primaryFromExtIdentifier(ext, recordId, options.defaultIssuer, warnings),
189
+ },
190
+ },
191
+ data: asObject(present.data),
192
+ _system: {
193
+ state,
194
+ createdAt,
195
+ modifiedAt,
196
+ ...(observedAt ? { observedAt } : {}),
197
+ ...(lifecycle && lifecycle.length > 0
198
+ ? { lifecycle: lifecycle }
199
+ : {}),
200
+ ...(provenance && Object.keys(provenance).length > 0 ? { provenance } : {}),
201
+ },
202
+ };
203
+ if (allowBuckets) {
204
+ for (const bucket of ["analytics", "enrichment", "insights"]) {
205
+ const val = present[bucket];
206
+ if (isPlainObject(val) && Object.keys(val).length > 0) {
207
+ out[bucket] = val;
208
+ }
209
+ }
210
+ }
211
+ return {
212
+ ok: true,
213
+ v2: out,
214
+ extractedRelationships: extracted,
215
+ warnings,
216
+ };
217
+ }
218
+ /** Convenience: return only the V2 record (relationships discarded — prefer migratePresentToV2). */
219
+ export function migratePresentToV2Record(input, options) {
220
+ return migratePresentToV2(input, options).v2;
221
+ }
222
+ export function migratePresentRecordsToV2(inputs, options) {
223
+ return inputs.map((input) => migratePresentToV2(input, options));
224
+ }
225
+ //# sourceMappingURL=migrate-present.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-present.js","sourceRoot":"","sources":["../../src/v2/migrate-present.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ContentTypeProfileV2 } from "./types.js";
2
+ export declare const DATA_CATEGORIES: readonly ["entity", "event", "knowledge"];
3
+ export declare const RECORD_STATES: readonly ["active", "archived", "superseded"];
4
+ /** Fixed envelope roots for memorix-record/2. */
5
+ export declare const V2_FIXED_ROOTS: readonly ["format", "recordId", "revision", "objectType", "contentType", "dataCategory", "concept", "data", "_system", "_id"];
6
+ export declare const V2_SNAPSHOT_BUCKETS: readonly ["analytics", "enrichment", "insights"];
7
+ export declare const BUILTIN_CONTENT_PROFILES: Record<string, ContentTypeProfileV2>;
8
+ export declare function resolveContentProfile(contentType: string | undefined, override?: ContentTypeProfileV2): ContentTypeProfileV2;
9
+ //# sourceMappingURL=profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/v2/profiles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,eAAO,MAAM,eAAe,2CAA4C,CAAC;AACzE,eAAO,MAAM,aAAa,+CAAgD,CAAC;AAE3E,iDAAiD;AACjD,eAAO,MAAM,cAAc,+HAWjB,CAAC;AAEX,eAAO,MAAM,mBAAmB,kDAAmD,CAAC;AAEpF,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAoCzE,CAAC;AAEF,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,oBAAoB,CAStB"}
@@ -0,0 +1,63 @@
1
+ export const DATA_CATEGORIES = ["entity", "event", "knowledge"];
2
+ export const RECORD_STATES = ["active", "archived", "superseded"];
3
+ /** Fixed envelope roots for memorix-record/2. */
4
+ export const V2_FIXED_ROOTS = [
5
+ "format",
6
+ "recordId",
7
+ "revision",
8
+ "objectType",
9
+ "contentType",
10
+ "dataCategory",
11
+ "concept",
12
+ "data",
13
+ "_system",
14
+ "_id",
15
+ ];
16
+ export const V2_SNAPSHOT_BUCKETS = ["analytics", "enrichment", "insights"];
17
+ export const BUILTIN_CONTENT_PROFILES = {
18
+ raw: { contentType: "raw", allowSnapshotBuckets: false },
19
+ snapshots: { contentType: "snapshots", allowSnapshotBuckets: true },
20
+ discovery: {
21
+ contentType: "discovery",
22
+ allowSnapshotBuckets: false,
23
+ discriminator: {
24
+ path: "data.discoveryType",
25
+ required: false,
26
+ defaultValue: "default",
27
+ },
28
+ },
29
+ analysis: {
30
+ contentType: "analysis",
31
+ allowSnapshotBuckets: false,
32
+ discriminator: {
33
+ path: "data.analysisType",
34
+ required: false,
35
+ defaultValue: "default",
36
+ },
37
+ },
38
+ decisions: {
39
+ contentType: "decisions",
40
+ allowSnapshotBuckets: false,
41
+ discriminator: {
42
+ path: "data.decisionType",
43
+ required: false,
44
+ defaultValue: "default",
45
+ },
46
+ },
47
+ workflow: { contentType: "workflow", allowSnapshotBuckets: false },
48
+ context: { contentType: "context", allowSnapshotBuckets: false },
49
+ /** Relationships sibling content — format-valid; authoritative storage is G4 Candidate C (central collections). */
50
+ relationships: { contentType: "relationships", allowSnapshotBuckets: false },
51
+ events: { contentType: "events", allowSnapshotBuckets: false },
52
+ knowledge: { contentType: "knowledge", allowSnapshotBuckets: true },
53
+ };
54
+ export function resolveContentProfile(contentType, override) {
55
+ if (override)
56
+ return override;
57
+ const ct = contentType?.trim() || "snapshots";
58
+ return (BUILTIN_CONTENT_PROFILES[ct] ?? {
59
+ contentType: ct,
60
+ allowSnapshotBuckets: ct === "snapshots",
61
+ });
62
+ }
63
+ //# sourceMappingURL=profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/v2/profiles.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAU,CAAC;AACzE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,YAAY,CAAU,CAAC;AAE3E,iDAAiD;AACjD,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,QAAQ;IACR,UAAU;IACV,UAAU;IACV,YAAY;IACZ,aAAa;IACb,cAAc;IACd,SAAS;IACT,MAAM;IACN,SAAS;IACT,KAAK;CACG,CAAC;AAEX,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,UAAU,CAAU,CAAC;AAEpF,MAAM,CAAC,MAAM,wBAAwB,GAAyC;IAC5E,GAAG,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE;IACxD,SAAS,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,oBAAoB,EAAE,IAAI,EAAE;IACnE,SAAS,EAAE;QACT,WAAW,EAAE,WAAW;QACxB,oBAAoB,EAAE,KAAK;QAC3B,aAAa,EAAE;YACb,IAAI,EAAE,oBAAoB;YAC1B,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,SAAS;SACxB;KACF;IACD,QAAQ,EAAE;QACR,WAAW,EAAE,UAAU;QACvB,oBAAoB,EAAE,KAAK;QAC3B,aAAa,EAAE;YACb,IAAI,EAAE,mBAAmB;YACzB,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,SAAS;SACxB;KACF;IACD,SAAS,EAAE;QACT,WAAW,EAAE,WAAW;QACxB,oBAAoB,EAAE,KAAK;QAC3B,aAAa,EAAE;YACb,IAAI,EAAE,mBAAmB;YACzB,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,SAAS;SACxB;KACF;IACD,QAAQ,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,oBAAoB,EAAE,KAAK,EAAE;IAClE,OAAO,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,oBAAoB,EAAE,KAAK,EAAE;IAChE,mHAAmH;IACnH,aAAa,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,oBAAoB,EAAE,KAAK,EAAE;IAC5E,MAAM,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,oBAAoB,EAAE,KAAK,EAAE;IAC9D,SAAS,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,oBAAoB,EAAE,IAAI,EAAE;CACpE,CAAC;AAEF,MAAM,UAAU,qBAAqB,CACnC,WAA+B,EAC/B,QAA+B;IAE/B,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,EAAE,GAAG,WAAW,EAAE,IAAI,EAAE,IAAI,WAAW,CAAC;IAC9C,OAAO,CACL,wBAAwB,CAAC,EAAE,CAAC,IAAI;QAC9B,WAAW,EAAE,EAAE;QACf,oBAAoB,EAAE,EAAE,KAAK,WAAW;KACzC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { MemorixLifecycleEvent, MemorixRecordV2 } from "./types.js";
2
+ /**
3
+ * Revision vs lifecycle contract helpers (Gate G2 evidence).
4
+ * Writers own persistence; these pure helpers document expected mutation rules.
5
+ */
6
+ export type RevisionCheckResult = {
7
+ ok: boolean;
8
+ reason?: string;
9
+ };
10
+ /** Reject stale expected revision (optimistic concurrency). */
11
+ export declare function checkExpectedRevision(current: Pick<MemorixRecordV2, "revision">, expectedRevision: number): RevisionCheckResult;
12
+ /** Next revision after a successful mutation. */
13
+ export declare function nextRevision(current: number): number;
14
+ /**
15
+ * Apply a successful mutation: always bumps revision; appends lifecycle only when provided.
16
+ * A revision may change with no lifecycle entry.
17
+ */
18
+ export declare function applySuccessfulMutation(record: MemorixRecordV2, args: {
19
+ expectedRevision: number;
20
+ modifiedAt: string;
21
+ lifecycleEvent?: MemorixLifecycleEvent;
22
+ data?: Record<string, unknown>;
23
+ }): MemorixRecordV2;
24
+ //# sourceMappingURL=revision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revision.d.ts","sourceRoot":"","sources":["../../src/v2/revision.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEzE;;;GAGG;AAEH,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,+DAA+D;AAC/D,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,EAC1C,gBAAgB,EAAE,MAAM,GACvB,mBAAmB,CAWrB;AAED,iDAAiD;AACjD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE;IACJ,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,GACA,eAAe,CAkBjB"}
@@ -0,0 +1,44 @@
1
+ /** Reject stale expected revision (optimistic concurrency). */
2
+ export function checkExpectedRevision(current, expectedRevision) {
3
+ if (!Number.isInteger(expectedRevision) || expectedRevision < 1) {
4
+ return { ok: false, reason: "expectedRevision must be an integer >= 1" };
5
+ }
6
+ if (current.revision !== expectedRevision) {
7
+ return {
8
+ ok: false,
9
+ reason: `stale revision: expected ${expectedRevision}, current ${current.revision}`,
10
+ };
11
+ }
12
+ return { ok: true };
13
+ }
14
+ /** Next revision after a successful mutation. */
15
+ export function nextRevision(current) {
16
+ if (!Number.isInteger(current) || current < 1) {
17
+ throw new Error("current revision must be an integer >= 1");
18
+ }
19
+ return current + 1;
20
+ }
21
+ /**
22
+ * Apply a successful mutation: always bumps revision; appends lifecycle only when provided.
23
+ * A revision may change with no lifecycle entry.
24
+ */
25
+ export function applySuccessfulMutation(record, args) {
26
+ const check = checkExpectedRevision(record, args.expectedRevision);
27
+ if (!check.ok) {
28
+ throw new Error(check.reason);
29
+ }
30
+ const lifecycle = args.lifecycleEvent
31
+ ? [...(record._system.lifecycle ?? []), args.lifecycleEvent]
32
+ : record._system.lifecycle;
33
+ return {
34
+ ...record,
35
+ revision: nextRevision(record.revision),
36
+ ...(args.data ? { data: args.data } : {}),
37
+ _system: {
38
+ ...record._system,
39
+ modifiedAt: args.modifiedAt,
40
+ ...(lifecycle && lifecycle.length > 0 ? { lifecycle } : { lifecycle: undefined }),
41
+ },
42
+ };
43
+ }
44
+ //# sourceMappingURL=revision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revision.js","sourceRoot":"","sources":["../../src/v2/revision.ts"],"names":[],"mappings":"AAYA,+DAA+D;AAC/D,MAAM,UAAU,qBAAqB,CACnC,OAA0C,EAC1C,gBAAwB;IAExB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;QAChE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,0CAA0C,EAAE,CAAC;IAC3E,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,gBAAgB,EAAE,CAAC;QAC1C,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,4BAA4B,gBAAgB,aAAa,OAAO,CAAC,QAAQ,EAAE;SACpF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,OAAO,GAAG,CAAC,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAuB,EACvB,IAKC;IAED,MAAM,KAAK,GAAG,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACnE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc;QACnC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC;QAC5D,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;IAC7B,OAAO;QACL,GAAG,MAAM;QACT,QAAQ,EAAE,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC;QACvC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE;YACP,GAAG,MAAM,CAAC,OAAO;YACjB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;SAClF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,94 @@
1
+ /** memorix-record/2 — canonical contract (Gate G2). */
2
+ export declare const MEMORIX_RECORD_FORMAT_V2: "memorix-record/2";
3
+ export type MemorixRecordFormatV2 = typeof MEMORIX_RECORD_FORMAT_V2;
4
+ export type MemorixDataCategory = "entity" | "event" | "knowledge";
5
+ export type MemorixRecordState = "active" | "archived" | "superseded";
6
+ export type MemorixIdentifier = {
7
+ kind: string;
8
+ value: string;
9
+ issuer?: string;
10
+ normalizedValue?: string;
11
+ };
12
+ export type MemorixConceptV2 = {
13
+ title: string;
14
+ identifiers: {
15
+ primary: MemorixIdentifier;
16
+ alternates?: MemorixIdentifier[];
17
+ };
18
+ };
19
+ export type MemorixLifecycleEvent = {
20
+ process: string;
21
+ processedAt: string;
22
+ };
23
+ export type MemorixSystemBlockV2 = {
24
+ state: MemorixRecordState;
25
+ createdAt: string;
26
+ modifiedAt: string;
27
+ observedAt?: string;
28
+ lifecycle?: MemorixLifecycleEvent[];
29
+ provenance?: Record<string, unknown>;
30
+ };
31
+ /**
32
+ * Snapshot-only optional buckets. Omit when unused — never emit empty `{}`.
33
+ * Not allowed on non-snapshot content types.
34
+ */
35
+ export type MemorixSnapshotBuckets = {
36
+ analytics?: Record<string, unknown>;
37
+ enrichment?: Record<string, unknown>;
38
+ insights?: Record<string, unknown>;
39
+ };
40
+ export type MemorixRecordV2 = {
41
+ format: MemorixRecordFormatV2;
42
+ recordId: string;
43
+ revision: number;
44
+ objectType: string;
45
+ contentType: string;
46
+ dataCategory: MemorixDataCategory;
47
+ concept: MemorixConceptV2;
48
+ data: Record<string, unknown>;
49
+ analytics?: Record<string, unknown>;
50
+ enrichment?: Record<string, unknown>;
51
+ insights?: Record<string, unknown>;
52
+ _system: MemorixSystemBlockV2;
53
+ /** Storage-only; ignored by format law. */
54
+ _id?: string;
55
+ };
56
+ export type ContentDiscriminator = {
57
+ path: string;
58
+ required: boolean;
59
+ defaultValue?: string;
60
+ allowedValues?: string[];
61
+ };
62
+ export type ContentTypeProfileV2 = {
63
+ contentType: string;
64
+ /** When true, analytics/enrichment/insights may appear (if non-empty). */
65
+ allowSnapshotBuckets: boolean;
66
+ discriminator?: ContentDiscriminator;
67
+ /** Extra allowed root keys beyond the fixed envelope (rare). */
68
+ allowedExtraRoots?: string[];
69
+ };
70
+ export type ValidateV2Options = {
71
+ /** Expected objectType (warn/error if mismatch when set). */
72
+ objectType?: string;
73
+ /** Expected contentType. */
74
+ contentType?: string;
75
+ /** Profile overrides built-in content-type rules. */
76
+ profile?: ContentTypeProfileV2;
77
+ /** When true, unknown roots are errors (default true). */
78
+ rejectUnknownRoots?: boolean;
79
+ /** Require discriminator when profile declares one. */
80
+ enforceDiscriminator?: boolean;
81
+ };
82
+ export type ValidationSeverity = "error" | "warning";
83
+ export type ValidationIssue = {
84
+ path: string;
85
+ code: string;
86
+ message: string;
87
+ severity: ValidationSeverity;
88
+ };
89
+ export type ValidateV2Result = {
90
+ ok: boolean;
91
+ issues: ValidationIssue[];
92
+ record?: MemorixRecordV2;
93
+ };
94
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/v2/types.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,eAAO,MAAM,wBAAwB,EAAG,kBAA2B,CAAC;AAEpE,MAAM,MAAM,qBAAqB,GAAG,OAAO,wBAAwB,CAAC;AAEpE,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,CAAC;AAEnE,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,UAAU,GAAG,YAAY,CAAC;AAEtE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE;QACX,OAAO,EAAE,iBAAiB,CAAC;QAC3B,UAAU,CAAC,EAAE,iBAAiB,EAAE,CAAC;KAClC,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,mBAAmB,CAAC;IAClC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,2CAA2C;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,oBAAoB,EAAE,OAAO,CAAC;IAC9B,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,gEAAgE;IAChE,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,0DAA0D;IAC1D,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,uDAAuD;IACvD,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,SAAS,CAAC;AAErD,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,kBAAkB,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** memorix-record/2 — canonical contract (Gate G2). */
2
+ export const MEMORIX_RECORD_FORMAT_V2 = "memorix-record/2";
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/v2/types.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,MAAM,CAAC,MAAM,wBAAwB,GAAG,kBAA2B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type ValidateV2Options, type ValidateV2Result } from "./types.js";
2
+ /**
3
+ * Validate a memorix-record/2 document.
4
+ * Empty optional snapshot buckets must be omitted (not `{}`).
5
+ */
6
+ export declare function validateMemorixRecordV2(input: unknown, options?: ValidateV2Options): ValidateV2Result;
7
+ export declare function validateMemorixRecordsV2(inputs: unknown[], options?: ValidateV2Options): ValidateV2Result[];
8
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/v2/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EAEtB,MAAM,YAAY,CAAC;AAoCpB;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB,CAkSlB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,OAAO,EAAE,EACjB,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB,EAAE,CAEpB"}