@x12i/memorix-descriptors 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/README.md +96 -0
  2. package/dist/admin/create-admin.d.ts +74 -0
  3. package/dist/admin/create-admin.d.ts.map +1 -0
  4. package/dist/admin/create-admin.js +102 -0
  5. package/dist/admin/create-admin.js.map +1 -0
  6. package/dist/catalog/ids.d.ts +12 -0
  7. package/dist/catalog/ids.d.ts.map +1 -0
  8. package/dist/catalog/ids.js +32 -0
  9. package/dist/catalog/ids.js.map +1 -0
  10. package/dist/catalox/client.d.ts +19 -0
  11. package/dist/catalox/client.d.ts.map +1 -0
  12. package/dist/catalox/client.js +51 -0
  13. package/dist/catalox/client.js.map +1 -0
  14. package/dist/cli/index.d.ts +3 -0
  15. package/dist/cli/index.d.ts.map +1 -0
  16. package/dist/cli/index.js +191 -0
  17. package/dist/cli/index.js.map +1 -0
  18. package/dist/collections/env-bridge.d.ts +3 -0
  19. package/dist/collections/env-bridge.d.ts.map +1 -0
  20. package/dist/collections/env-bridge.js +8 -0
  21. package/dist/collections/env-bridge.js.map +1 -0
  22. package/dist/collections/resolve.d.ts +20 -0
  23. package/dist/collections/resolve.d.ts.map +1 -0
  24. package/dist/collections/resolve.js +49 -0
  25. package/dist/collections/resolve.js.map +1 -0
  26. package/dist/index.d.ts +11 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +9 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/integrity/graph.d.ts +19 -0
  31. package/dist/integrity/graph.d.ts.map +1 -0
  32. package/dist/integrity/graph.js +65 -0
  33. package/dist/integrity/graph.js.map +1 -0
  34. package/dist/integrity/validate.d.ts +4 -0
  35. package/dist/integrity/validate.d.ts.map +1 -0
  36. package/dist/integrity/validate.js +278 -0
  37. package/dist/integrity/validate.js.map +1 -0
  38. package/dist/mutations/common.d.ts +9 -0
  39. package/dist/mutations/common.d.ts.map +1 -0
  40. package/dist/mutations/common.js +108 -0
  41. package/dist/mutations/common.js.map +1 -0
  42. package/dist/mutations/content-type.d.ts +21 -0
  43. package/dist/mutations/content-type.d.ts.map +1 -0
  44. package/dist/mutations/content-type.js +278 -0
  45. package/dist/mutations/content-type.js.map +1 -0
  46. package/dist/mutations/entity.d.ts +21 -0
  47. package/dist/mutations/entity.d.ts.map +1 -0
  48. package/dist/mutations/entity.js +276 -0
  49. package/dist/mutations/entity.js.map +1 -0
  50. package/dist/mutations/item.d.ts +16 -0
  51. package/dist/mutations/item.d.ts.map +1 -0
  52. package/dist/mutations/item.js +131 -0
  53. package/dist/mutations/item.js.map +1 -0
  54. package/dist/mutations/list.d.ts +16 -0
  55. package/dist/mutations/list.d.ts.map +1 -0
  56. package/dist/mutations/list.js +143 -0
  57. package/dist/mutations/list.js.map +1 -0
  58. package/dist/mutations/mapping.d.ts +12 -0
  59. package/dist/mutations/mapping.d.ts.map +1 -0
  60. package/dist/mutations/mapping.js +104 -0
  61. package/dist/mutations/mapping.js.map +1 -0
  62. package/dist/mutations/property.d.ts +18 -0
  63. package/dist/mutations/property.d.ts.map +1 -0
  64. package/dist/mutations/property.js +256 -0
  65. package/dist/mutations/property.js.map +1 -0
  66. package/dist/mutations/relation.d.ts +31 -0
  67. package/dist/mutations/relation.d.ts.map +1 -0
  68. package/dist/mutations/relation.js +195 -0
  69. package/dist/mutations/relation.js.map +1 -0
  70. package/dist/reconcile/index.d.ts +29 -0
  71. package/dist/reconcile/index.d.ts.map +1 -0
  72. package/dist/reconcile/index.js +58 -0
  73. package/dist/reconcile/index.js.map +1 -0
  74. package/dist/seeds/index.d.ts +33 -0
  75. package/dist/seeds/index.d.ts.map +1 -0
  76. package/dist/seeds/index.js +186 -0
  77. package/dist/seeds/index.js.map +1 -0
  78. package/dist/store/snapshot.d.ts +6 -0
  79. package/dist/store/snapshot.d.ts.map +1 -0
  80. package/dist/store/snapshot.js +49 -0
  81. package/dist/store/snapshot.js.map +1 -0
  82. package/dist/tests/validation.test.d.ts +2 -0
  83. package/dist/tests/validation.test.d.ts.map +1 -0
  84. package/dist/tests/validation.test.js +114 -0
  85. package/dist/tests/validation.test.js.map +1 -0
  86. package/dist/types/index.d.ts +151 -0
  87. package/dist/types/index.d.ts.map +1 -0
  88. package/dist/types/index.js +2 -0
  89. package/dist/types/index.js.map +1 -0
  90. package/dist/validation/descriptor-validation.d.ts +20 -0
  91. package/dist/validation/descriptor-validation.d.ts.map +1 -0
  92. package/dist/validation/descriptor-validation.js +148 -0
  93. package/dist/validation/descriptor-validation.js.map +1 -0
  94. package/docs/MEMORIX-CATALOX-CONTRACTS.md +591 -0
  95. package/docs/MEMORIX-DATABASE-CONVENTIONS.md +338 -0
  96. package/package.json +43 -0
@@ -0,0 +1,151 @@
1
+ export type MemorixTarget = "entity" | "event" | "knowledge";
2
+ export type MemorixIdField = "entityId" | "eventId" | "knowledgeId";
3
+ export type MemorixSeedScope = {
4
+ domains: string[];
5
+ agents: string[];
6
+ };
7
+ export type DescriptorMutationOptions = {
8
+ dryRun?: boolean;
9
+ skipMongo?: boolean;
10
+ scope?: MemorixSeedScope;
11
+ reason?: string;
12
+ expectedVersion?: string;
13
+ allowCreateCollection?: boolean;
14
+ cascade?: boolean;
15
+ force?: boolean;
16
+ mode?: "soft" | "hard";
17
+ };
18
+ export type IntegrityIssue = {
19
+ code: string;
20
+ message: string;
21
+ path?: string;
22
+ severity: "error" | "warning";
23
+ };
24
+ export type DescriptorIntegrityReport = {
25
+ valid: boolean;
26
+ counts: {
27
+ entityDescriptors: number;
28
+ listDescriptors: number;
29
+ itemDescriptors: number;
30
+ completionMappings: number;
31
+ };
32
+ errors: IntegrityIssue[];
33
+ warnings: IntegrityIssue[];
34
+ orphans: {
35
+ collections: Array<{
36
+ database: string;
37
+ collection: string;
38
+ target: MemorixTarget;
39
+ }>;
40
+ danglingReferences: Array<{
41
+ from: string;
42
+ to: string;
43
+ kind: string;
44
+ }>;
45
+ };
46
+ };
47
+ export type CataloxWriteAction = {
48
+ catalogId: string;
49
+ itemId: string;
50
+ action: "create" | "update" | "delete";
51
+ };
52
+ export type MongoAction = {
53
+ action: string;
54
+ database: string;
55
+ collection: string;
56
+ };
57
+ export type DescriptorMutationError = {
58
+ code: string;
59
+ message: string;
60
+ path?: string;
61
+ };
62
+ export type DescriptorMutationResult<T = unknown> = {
63
+ ok: boolean;
64
+ dryRun: boolean;
65
+ data?: T;
66
+ warnings: string[];
67
+ errors: DescriptorMutationError[];
68
+ cataloxWrites: CataloxWriteAction[];
69
+ mongoActions?: MongoAction[];
70
+ integrity: DescriptorIntegrityReport;
71
+ rollbackPlan?: CataloxWriteAction[];
72
+ };
73
+ export type PropertyInput = {
74
+ label: string;
75
+ source: {
76
+ contentType: string;
77
+ path: string;
78
+ };
79
+ humanReadable: boolean;
80
+ sortable?: boolean;
81
+ filterable?: boolean;
82
+ list?: boolean;
83
+ item?: boolean;
84
+ valueType?: string;
85
+ format?: string;
86
+ metadata?: Record<string, unknown>;
87
+ };
88
+ export type RegisterEntityDescriptorInput = {
89
+ entityName: string;
90
+ target: MemorixTarget;
91
+ label?: string;
92
+ collectionPrefix: string;
93
+ canonicalContentType: {
94
+ key: string;
95
+ postfix: string;
96
+ collection?: string;
97
+ dataRoot?: string;
98
+ };
99
+ identity?: {
100
+ idField: MemorixIdField;
101
+ };
102
+ initialProperties?: Record<string, PropertyInput>;
103
+ scope?: MemorixSeedScope;
104
+ defaultListDescriptorId?: string;
105
+ defaultItemDescriptorId?: string;
106
+ };
107
+ export type ContentTypeInput = {
108
+ key: string;
109
+ postfix: string;
110
+ collection?: string;
111
+ dataRoot?: string;
112
+ isCanonical?: boolean;
113
+ effectiveDatePath?: string;
114
+ defaultMultiMatch?: {
115
+ extendFields?: "last" | "first" | "all" | "error" | "ignore";
116
+ array?: "last" | "first" | "all" | "error" | "ignore";
117
+ };
118
+ };
119
+ export type MemorixCompletionMapping = {
120
+ id: string;
121
+ name: string;
122
+ entityType: string;
123
+ target: MemorixTarget;
124
+ targetCollection: string;
125
+ targetSelector: {
126
+ sourceCollection: string;
127
+ idField: string;
128
+ };
129
+ source: {
130
+ databaseName: string;
131
+ collection: string;
132
+ };
133
+ match: {
134
+ targetPath: string;
135
+ sourcePath: string;
136
+ };
137
+ writeRoot: "data";
138
+ fields: Array<{
139
+ sourcePath: string;
140
+ targetPath: string;
141
+ }>;
142
+ onlyFillMissing?: boolean;
143
+ overwriteExisting?: boolean;
144
+ };
145
+ export type DescriptorSnapshot = {
146
+ entityDescriptors: Record<string, Record<string, unknown>>;
147
+ listDescriptors: Record<string, Record<string, unknown>>;
148
+ itemDescriptors: Record<string, Record<string, unknown>>;
149
+ completionMappings: Record<string, MemorixCompletionMapping>;
150
+ };
151
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import type { MemorixEntityDescriptor, MemorixEntityListDescriptor, MemorixItemDescriptor, MemorixListDescriptor, MemorixPropertyDescriptor, MemorixWorkspaceListDescriptor } from "@x12i/memorix-retrieval";
2
+ export declare class DescriptorValidationError extends Error {
3
+ readonly code: string;
4
+ constructor(code: string, message: string);
5
+ }
6
+ export declare function validateMemorixEntityDescriptor(raw: Record<string, unknown>): MemorixEntityDescriptor;
7
+ export declare function validatePropertyDescriptor(prop: MemorixPropertyDescriptor): void;
8
+ export declare function isMemorixWorkspaceListDescriptor(descriptor: MemorixListDescriptor): descriptor is MemorixWorkspaceListDescriptor;
9
+ export declare function validateMemorixWorkspaceListDescriptor(raw: Record<string, unknown>): MemorixWorkspaceListDescriptor;
10
+ export declare function validateBootstrapEntityListDescriptor(raw: Record<string, unknown>): MemorixEntityListDescriptor;
11
+ export declare function validateMemorixEntityListDescriptor(raw: Record<string, unknown>): MemorixEntityListDescriptor;
12
+ export declare function validateMemorixListDescriptor(raw: Record<string, unknown>): MemorixListDescriptor;
13
+ export declare function validateMemorixItemDescriptor(raw: Record<string, unknown>): MemorixItemDescriptor;
14
+ export declare function assertListFieldsHumanReadable(list: MemorixEntityListDescriptor, entity: MemorixEntityDescriptor): void;
15
+ export declare function parseDescriptorData(data: unknown): Record<string, unknown>;
16
+ export declare function isKebabCase(value: string): boolean;
17
+ export declare function singularizeEntityName(entityName: string): string;
18
+ export declare function defaultListDescriptorId(entityName: string): string;
19
+ export declare function defaultItemDescriptorId(entityName: string): string;
20
+ //# sourceMappingURL=descriptor-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"descriptor-validation.d.ts","sourceRoot":"","sources":["../../src/validation/descriptor-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,2BAA2B,EAC3B,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EACzB,8BAA8B,EAC/B,MAAM,yBAAyB,CAAC;AAajC,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAID,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,uBAAuB,CA0DzB;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,yBAAyB,GAAG,IAAI,CAahF;AAaD,wBAAgB,gCAAgC,CAC9C,UAAU,EAAE,qBAAqB,GAChC,UAAU,IAAI,8BAA8B,CAE9C;AAED,wBAAgB,sCAAsC,CACpD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,8BAA8B,CAgBhC;AAED,wBAAgB,qCAAqC,CACnD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,2BAA2B,CAgB7B;AAED,wBAAgB,mCAAmC,CACjD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,2BAA2B,CAS7B;AAED,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,qBAAqB,CAKvB;AAED,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,qBAAqB,CAqBvB;AAED,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,2BAA2B,EACjC,MAAM,EAAE,uBAAuB,GAC9B,IAAI,CAgBN;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE1E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAWhE;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAElE"}
@@ -0,0 +1,148 @@
1
+ function assertObject(value, label) {
2
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
3
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", `${label} must be an object`);
4
+ }
5
+ return value;
6
+ }
7
+ export class DescriptorValidationError extends Error {
8
+ code;
9
+ constructor(code, message) {
10
+ super(message);
11
+ this.name = "DescriptorValidationError";
12
+ this.code = code;
13
+ }
14
+ }
15
+ const VALID_TARGETS = ["entity", "event", "knowledge"];
16
+ export function validateMemorixEntityDescriptor(raw) {
17
+ const d = raw;
18
+ if (!d.id || !d.entityName || !d.collectionPrefix) {
19
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Entity descriptor requires id, entityName, collectionPrefix");
20
+ }
21
+ if (!d.defaultListDescriptorId?.trim() || !d.defaultItemDescriptorId?.trim()) {
22
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Entity descriptor requires defaultListDescriptorId and defaultItemDescriptorId");
23
+ }
24
+ if (d.target && !VALID_TARGETS.includes(d.target)) {
25
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", 'Entity descriptor target must be "entity", "event", or "knowledge"');
26
+ }
27
+ if (!d.defaults?.canonicalContentType || !d.defaults?.dataRoot) {
28
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Entity descriptor requires defaults.canonicalContentType and dataRoot");
29
+ }
30
+ if (!d.contentTypes || typeof d.contentTypes !== "object") {
31
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Entity descriptor requires contentTypes");
32
+ }
33
+ if (!d.properties || typeof d.properties !== "object") {
34
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Entity descriptor requires properties");
35
+ }
36
+ for (const prop of Object.values(d.properties)) {
37
+ validatePropertyDescriptor(prop);
38
+ }
39
+ const canonicalTypes = Object.entries(d.contentTypes).filter(([, ct]) => ct.isCanonical);
40
+ if (canonicalTypes.length !== 1) {
41
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Entity descriptor requires exactly one content type with isCanonical: true");
42
+ }
43
+ const [canonicalName] = canonicalTypes[0];
44
+ if (canonicalName !== d.defaults.canonicalContentType) {
45
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "defaults.canonicalContentType must match the isCanonical content type key");
46
+ }
47
+ return d;
48
+ }
49
+ export function validatePropertyDescriptor(prop) {
50
+ if (!prop.label || !prop.source?.contentType || !prop.source?.path) {
51
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Property descriptor requires label and source");
52
+ }
53
+ if (prop.humanReadable !== true && prop.humanReadable !== false) {
54
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Property descriptor requires humanReadable boolean");
55
+ }
56
+ }
57
+ function validateListPagination(pagination) {
58
+ if (!pagination?.defaultLimit || !pagination?.maxLimit) {
59
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "List descriptor requires pagination limits");
60
+ }
61
+ }
62
+ export function isMemorixWorkspaceListDescriptor(descriptor) {
63
+ return descriptor.kind === "workspace";
64
+ }
65
+ export function validateMemorixWorkspaceListDescriptor(raw) {
66
+ const d = raw;
67
+ if (!d.id || d.kind !== "workspace") {
68
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", 'Workspace list descriptor requires id and kind: "workspace"');
69
+ }
70
+ validateListPagination(d.pagination);
71
+ if (!Array.isArray(d.fields) || d.fields.length === 0) {
72
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "List descriptor requires fields");
73
+ }
74
+ return d;
75
+ }
76
+ export function validateBootstrapEntityListDescriptor(raw) {
77
+ const d = raw;
78
+ if (!d.id || !d.entity || !d.leadingContentType) {
79
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Entity list descriptor requires id, entity, leadingContentType");
80
+ }
81
+ validateListPagination(d.pagination);
82
+ if (!Array.isArray(d.fields)) {
83
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "List descriptor requires fields array");
84
+ }
85
+ return d;
86
+ }
87
+ export function validateMemorixEntityListDescriptor(raw) {
88
+ const d = validateBootstrapEntityListDescriptor(raw);
89
+ if (d.fields.length === 0) {
90
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "List descriptor requires fields");
91
+ }
92
+ return d;
93
+ }
94
+ export function validateMemorixListDescriptor(raw) {
95
+ if (raw.kind === "workspace") {
96
+ return validateMemorixWorkspaceListDescriptor(raw);
97
+ }
98
+ return validateMemorixEntityListDescriptor(raw);
99
+ }
100
+ export function validateMemorixItemDescriptor(raw) {
101
+ const d = raw;
102
+ if (!d.id || !d.entity || !d.identity?.idField) {
103
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Item descriptor requires id, entity, identity.idField");
104
+ }
105
+ if (!Array.isArray(d.contentTypes) || d.contentTypes.length === 0) {
106
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Item descriptor requires contentTypes");
107
+ }
108
+ if (!Array.isArray(d.sections) || d.sections.length === 0) {
109
+ throw new DescriptorValidationError("INVALID_DESCRIPTOR", "Item descriptor requires sections");
110
+ }
111
+ return d;
112
+ }
113
+ export function assertListFieldsHumanReadable(list, entity) {
114
+ for (const field of list.fields) {
115
+ const prop = entity.properties[field];
116
+ if (!prop) {
117
+ throw new DescriptorValidationError("UNKNOWN_FIELD", `List field "${field}" is not defined on entity "${entity.id}"`);
118
+ }
119
+ if (!prop.humanReadable) {
120
+ throw new DescriptorValidationError("NON_HUMAN_READABLE_LIST_FIELD", `List field "${field}" must have humanReadable=true`);
121
+ }
122
+ }
123
+ }
124
+ export function parseDescriptorData(data) {
125
+ return assertObject(data, "descriptor data");
126
+ }
127
+ export function isKebabCase(value) {
128
+ return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(value);
129
+ }
130
+ export function singularizeEntityName(entityName) {
131
+ if (entityName.endsWith("-stories")) {
132
+ return `${entityName.slice(0, -8)}-story`;
133
+ }
134
+ if (entityName.endsWith("ies")) {
135
+ return `${entityName.slice(0, -3)}y`;
136
+ }
137
+ if (entityName.endsWith("s") && !entityName.endsWith("ss")) {
138
+ return entityName.slice(0, -1);
139
+ }
140
+ return entityName;
141
+ }
142
+ export function defaultListDescriptorId(entityName) {
143
+ return `${entityName}-main-list`;
144
+ }
145
+ export function defaultItemDescriptorId(entityName) {
146
+ return `${singularizeEntityName(entityName)}-detail-item`;
147
+ }
148
+ //# sourceMappingURL=descriptor-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"descriptor-validation.js","sourceRoot":"","sources":["../../src/validation/descriptor-validation.ts"],"names":[],"mappings":"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"}