@nodes-dev/core 0.0.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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +33 -0
  3. package/dist/corpus.d.ts +61 -0
  4. package/dist/corpus.d.ts.map +1 -0
  5. package/dist/corpus.js +383 -0
  6. package/dist/corpus.js.map +1 -0
  7. package/dist/errors.d.ts +20 -0
  8. package/dist/errors.d.ts.map +1 -0
  9. package/dist/errors.js +23 -0
  10. package/dist/errors.js.map +1 -0
  11. package/dist/frontmatter.d.ts +5 -0
  12. package/dist/frontmatter.d.ts.map +1 -0
  13. package/dist/frontmatter.js +103 -0
  14. package/dist/frontmatter.js.map +1 -0
  15. package/dist/ids.d.ts +11 -0
  16. package/dist/ids.d.ts.map +1 -0
  17. package/dist/ids.js +36 -0
  18. package/dist/ids.js.map +1 -0
  19. package/dist/index.d.ts +16 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +15 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/node.d.ts +106 -0
  24. package/dist/node.d.ts.map +1 -0
  25. package/dist/node.js +66 -0
  26. package/dist/node.js.map +1 -0
  27. package/dist/ranking.d.ts +7 -0
  28. package/dist/ranking.d.ts.map +1 -0
  29. package/dist/ranking.js +9 -0
  30. package/dist/ranking.js.map +1 -0
  31. package/dist/registry.d.ts +36 -0
  32. package/dist/registry.d.ts.map +1 -0
  33. package/dist/registry.js +123 -0
  34. package/dist/registry.js.map +1 -0
  35. package/dist/relations.d.ts +30 -0
  36. package/dist/relations.d.ts.map +1 -0
  37. package/dist/relations.js +44 -0
  38. package/dist/relations.js.map +1 -0
  39. package/dist/search.d.ts +46 -0
  40. package/dist/search.d.ts.map +1 -0
  41. package/dist/search.js +280 -0
  42. package/dist/search.js.map +1 -0
  43. package/dist/shapes.d.ts +86 -0
  44. package/dist/shapes.d.ts.map +1 -0
  45. package/dist/shapes.js +138 -0
  46. package/dist/shapes.js.map +1 -0
  47. package/dist/similarity.d.ts +68 -0
  48. package/dist/similarity.d.ts.map +1 -0
  49. package/dist/similarity.js +305 -0
  50. package/dist/similarity.js.map +1 -0
  51. package/dist/snapshot.d.ts +56 -0
  52. package/dist/snapshot.d.ts.map +1 -0
  53. package/dist/snapshot.js +252 -0
  54. package/dist/snapshot.js.map +1 -0
  55. package/dist/store.d.ts +15 -0
  56. package/dist/store.d.ts.map +1 -0
  57. package/dist/store.js +44 -0
  58. package/dist/store.js.map +1 -0
  59. package/dist/structural-index.d.ts +72 -0
  60. package/dist/structural-index.d.ts.map +1 -0
  61. package/dist/structural-index.js +434 -0
  62. package/dist/structural-index.js.map +1 -0
  63. package/package.json +50 -0
@@ -0,0 +1,103 @@
1
+ import { parseDocument, stringify } from "yaml";
2
+ import { z } from "zod";
3
+ import { ValidationError } from "./errors.js";
4
+ import { makeNode } from "./node.js";
5
+ import { RELATES_TO, fromSerialized, relatesTo, toSerialized } from "./relations.js";
6
+ export function splitFrontmatter(text) {
7
+ let nl;
8
+ if (text.startsWith("---\r\n"))
9
+ nl = "\r\n";
10
+ else if (text.startsWith("---\n"))
11
+ nl = "\n";
12
+ else
13
+ return [{}, text];
14
+ const rest = text.slice(3 + nl.length);
15
+ const sep = `${nl}---${nl}`;
16
+ const idx = rest.indexOf(sep);
17
+ if (idx === -1)
18
+ return [{}, text];
19
+ const doc = parseDocument(rest.slice(0, idx));
20
+ if (doc.errors.length > 0) {
21
+ throw new ValidationError(`invalid frontmatter YAML: ${doc.errors[0].message}`);
22
+ }
23
+ const fm = (doc.toJS() ?? {});
24
+ return [fm, rest.slice(idx + sep.length)];
25
+ }
26
+ export function nodeFromMarkdown(text) {
27
+ const [fm, body] = splitFrontmatter(text);
28
+ const missing = ["id", "uid", "kind", "title"].filter((k) => !(k in fm));
29
+ if (missing.length > 0) {
30
+ throw new ValidationError(`frontmatter missing required field(s): ${JSON.stringify(missing)}`);
31
+ }
32
+ const nodeId = fm.id;
33
+ // `nodeFromMarkdown` is a boundary parser: every malformed-input path leaves as a typed
34
+ // kernel error (spec §7), never a raw ZodError or a raw TypeError. Collection fields must be
35
+ // lists — a scalar or mapping is a ValidationError, not a "not iterable" TypeError. (Python's
36
+ // node_from_markdown leaks a raw TypeError here; the TS boundary deliberately tightens that.)
37
+ if (fm.related !== undefined && !Array.isArray(fm.related)) {
38
+ throw new ValidationError(`'related' must be a list in ${JSON.stringify(nodeId)}`);
39
+ }
40
+ if (fm.relations !== undefined && !Array.isArray(fm.relations)) {
41
+ throw new ValidationError(`'relations' must be a list in ${JSON.stringify(nodeId)}`);
42
+ }
43
+ const relations = [];
44
+ try {
45
+ for (const ref of fm.related ?? []) {
46
+ relations.push(relatesTo(nodeId, ref));
47
+ }
48
+ for (const raw of fm.relations ?? []) {
49
+ relations.push(fromSerialized(raw, nodeId));
50
+ }
51
+ }
52
+ catch (e) {
53
+ if (e instanceof z.ZodError) {
54
+ throw new ValidationError(`invalid relation in ${JSON.stringify(nodeId)}: ${e.issues.map((i) => i.message).join("; ")}`);
55
+ }
56
+ throw e;
57
+ }
58
+ const metadata = {};
59
+ for (const k of ["created", "updated", "version"]) {
60
+ if (k in fm)
61
+ metadata[k] = fm[k];
62
+ }
63
+ return makeNode({
64
+ id: nodeId,
65
+ uid: fm.uid,
66
+ kind: fm.kind,
67
+ title: fm.title,
68
+ body,
69
+ metadata,
70
+ relations,
71
+ facets: fm.facets ?? {},
72
+ deprecatedIds: fm.deprecated_ids ?? [],
73
+ });
74
+ }
75
+ function isPlainRelatesTo(rel, nodeId) {
76
+ return (rel.predicate === RELATES_TO &&
77
+ rel.source === nodeId &&
78
+ rel.directed === true &&
79
+ rel.weight === null &&
80
+ Object.keys(rel.attrs).length === 0);
81
+ }
82
+ export function nodeToMarkdown(node) {
83
+ const fm = { id: node.id, uid: node.uid, kind: node.kind, title: node.title };
84
+ if (node.metadata.created !== null)
85
+ fm.created = node.metadata.created;
86
+ if (node.metadata.updated !== null)
87
+ fm.updated = node.metadata.updated;
88
+ if (node.metadata.version !== 1)
89
+ fm.version = node.metadata.version;
90
+ const related = node.relations.filter((r) => isPlainRelatesTo(r, node.id)).map((r) => r.target);
91
+ const typed = node.relations.filter((r) => !isPlainRelatesTo(r, node.id)).map((r) => toSerialized(r, node.id));
92
+ if (related.length > 0)
93
+ fm.related = related;
94
+ if (typed.length > 0)
95
+ fm.relations = typed;
96
+ if (Object.keys(node.facets).length > 0)
97
+ fm.facets = node.facets;
98
+ if (node.deprecatedIds.length > 0)
99
+ fm.deprecated_ids = node.deprecatedIds;
100
+ const yamlText = stringify(fm, { sortMapEntries: false }).trimEnd();
101
+ return `---\n${yamlText}\n---\n${node.body}`;
102
+ }
103
+ //# sourceMappingURL=frontmatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../src/frontmatter.ts"],"names":[],"mappings":"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"}
package/dist/ids.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ export type Ref = string;
2
+ export declare class NodeId {
3
+ readonly kind: string;
4
+ readonly slug: string;
5
+ constructor(kind: string, slug: string);
6
+ static isValidKind(kind: string): boolean;
7
+ static isValidSlug(slug: string): boolean;
8
+ static parse(raw: string): NodeId;
9
+ toString(): string;
10
+ }
11
+ //# sourceMappingURL=ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.d.ts","sourceRoot":"","sources":["../src/ids.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC;AAKzB,qBAAa,MAAM;IAEf,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM;gBADZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM;IAGvB,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIzC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIzC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAgBjC,QAAQ,IAAI,MAAM;CAGnB"}
package/dist/ids.js ADDED
@@ -0,0 +1,36 @@
1
+ import { IdError } from "./errors.js";
2
+ const KIND_RE = /^[a-z][a-z0-9-]*$/;
3
+ const SLUG_RE = /^[A-Za-z0-9][A-Za-z0-9:_.-]*$/;
4
+ export class NodeId {
5
+ kind;
6
+ slug;
7
+ constructor(kind, slug) {
8
+ this.kind = kind;
9
+ this.slug = slug;
10
+ }
11
+ static isValidKind(kind) {
12
+ return KIND_RE.test(kind);
13
+ }
14
+ static isValidSlug(slug) {
15
+ return SLUG_RE.test(slug);
16
+ }
17
+ static parse(raw) {
18
+ const idx = raw.indexOf(":");
19
+ if (idx === -1) {
20
+ throw new IdError(`id must be 'kind:slug', got ${JSON.stringify(raw)}`);
21
+ }
22
+ const kind = raw.slice(0, idx);
23
+ const slug = raw.slice(idx + 1);
24
+ if (!NodeId.isValidKind(kind)) {
25
+ throw new IdError(`invalid kind ${JSON.stringify(kind)} in id ${JSON.stringify(raw)}`);
26
+ }
27
+ if (!NodeId.isValidSlug(slug)) {
28
+ throw new IdError(`invalid slug ${JSON.stringify(slug)} in id ${JSON.stringify(raw)}`);
29
+ }
30
+ return new NodeId(kind, slug);
31
+ }
32
+ toString() {
33
+ return `${this.kind}:${this.slug}`;
34
+ }
35
+ }
36
+ //# sourceMappingURL=ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.js","sourceRoot":"","sources":["../src/ids.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAItC,MAAM,OAAO,GAAG,mBAAmB,CAAC;AACpC,MAAM,OAAO,GAAG,+BAA+B,CAAC;AAEhD,MAAM,OAAO,MAAM;IAEN;IACA;IAFX,YACW,IAAY,EACZ,IAAY;QADZ,SAAI,GAAJ,IAAI,CAAQ;QACZ,SAAI,GAAJ,IAAI,CAAQ;IACpB,CAAC;IAEJ,MAAM,CAAC,WAAW,CAAC,IAAY;QAC7B,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAAY;QAC7B,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,GAAW;QACtB,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,MAAM,IAAI,OAAO,CAAC,+BAA+B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,OAAO,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,OAAO,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,QAAQ;QACN,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IACrC,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ export { CollisionError, EmbedderRequiredError, FacetError, IdError, InvariantError, NodesError, RefError, UnknownKindError, ValidationError, } from "./errors.js";
2
+ export { NodeId, type Ref } from "./ids.js";
3
+ export { RELATES_TO, RelationSchema, type Relation, fromSerialized, relatesTo, tagToRelation, toSerialized, } from "./relations.js";
4
+ export { NodeMetadataSchema, NodeSchema, type Node, type NodeInput, type NodeMetadata, makeNode, newUid, } from "./node.js";
5
+ export { nodeFromMarkdown, nodeToMarkdown, splitFrontmatter } from "./frontmatter.js";
6
+ export { type Invariant, type KindSpec, type ShapeSpec, type Violation, Registry } from "./registry.js";
7
+ export { EDGES, EdgesSchema, KEYS, KeysSchema, MEMBERSHIP, MembershipSchema, ORDER, OrderSchema, edgesOf, keysOf, membershipOf, orderOf, registerBuiltinShapes, requireAcyclic, requireEdgeEndpointsAreMembers, requireKeyValuesAreMembers, requireOrderIsPermutation, requireSingleParent, requireUniqueMembers, } from "./shapes.js";
8
+ export type { Edges, Keys, Membership, Order } from "./shapes.js";
9
+ export { Store } from "./store.js";
10
+ export { Corpus, type Finding } from "./corpus.js";
11
+ export { type CorpusFile, type CorpusFileStat, type CorpusFingerprint, type ManifestEntry, type Snapshot, SNAPSHOT_LANG, SNAPSHOT_SCHEMA_VERSION, hashBytes, iterCorpusFiles, listCorpusFileStats, loadSnapshot, pathForNodeId, readCorpusFingerprint, readJson, sameCorpusFingerprint, snapshotPath, writeJsonAtomic, writeSnapshot, } from "./snapshot.js";
12
+ export { Index, type InRef, type IndexEntry, type OutRef, type ResolvedEdge, type Role, } from "./structural-index.js";
13
+ export { scoreKey } from "./ranking.js";
14
+ export { SearchIndex, type SearchHit, type SearchSnapshot, tokenize } from "./search.js";
15
+ export { type Embedder, type SimilarHit, type Vector, type VectorSnapshot, VectorCache, VectorIndex, embedText, textHash, validateNamespace, validateTextHash, } from "./similarity.js";
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,UAAU,EACV,OAAO,EACP,cAAc,EACd,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,MAAM,EAAE,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EACL,UAAU,EACV,cAAc,EACd,KAAK,QAAQ,EACb,cAAc,EACd,SAAS,EACT,aAAa,EACb,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,KAAK,IAAI,EACT,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,QAAQ,EACR,MAAM,GACP,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACxG,OAAO,EACL,KAAK,EACL,WAAW,EACX,IAAI,EACJ,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,KAAK,EACL,WAAW,EACX,OAAO,EACP,MAAM,EACN,YAAY,EACZ,OAAO,EACP,qBAAqB,EACrB,cAAc,EACd,8BAA8B,EAC9B,0BAA0B,EAC1B,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EACL,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,aAAa,EACb,uBAAuB,EACvB,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,qBAAqB,EACrB,QAAQ,EACR,qBAAqB,EACrB,YAAY,EACZ,eAAe,EACf,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,KAAK,EACL,KAAK,KAAK,EACV,KAAK,UAAU,EACf,KAAK,MAAM,EACX,KAAK,YAAY,EACjB,KAAK,IAAI,GACV,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,MAAM,EACX,KAAK,cAAc,EACnB,WAAW,EACX,WAAW,EACX,SAAS,EACT,QAAQ,EACR,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ export { CollisionError, EmbedderRequiredError, FacetError, IdError, InvariantError, NodesError, RefError, UnknownKindError, ValidationError, } from "./errors.js";
2
+ export { NodeId } from "./ids.js";
3
+ export { RELATES_TO, RelationSchema, fromSerialized, relatesTo, tagToRelation, toSerialized, } from "./relations.js";
4
+ export { NodeMetadataSchema, NodeSchema, makeNode, newUid, } from "./node.js";
5
+ export { nodeFromMarkdown, nodeToMarkdown, splitFrontmatter } from "./frontmatter.js";
6
+ export { Registry } from "./registry.js";
7
+ export { EDGES, EdgesSchema, KEYS, KeysSchema, MEMBERSHIP, MembershipSchema, ORDER, OrderSchema, edgesOf, keysOf, membershipOf, orderOf, registerBuiltinShapes, requireAcyclic, requireEdgeEndpointsAreMembers, requireKeyValuesAreMembers, requireOrderIsPermutation, requireSingleParent, requireUniqueMembers, } from "./shapes.js";
8
+ export { Store } from "./store.js";
9
+ export { Corpus } from "./corpus.js";
10
+ export { SNAPSHOT_LANG, SNAPSHOT_SCHEMA_VERSION, hashBytes, iterCorpusFiles, listCorpusFileStats, loadSnapshot, pathForNodeId, readCorpusFingerprint, readJson, sameCorpusFingerprint, snapshotPath, writeJsonAtomic, writeSnapshot, } from "./snapshot.js";
11
+ export { Index, } from "./structural-index.js";
12
+ export { scoreKey } from "./ranking.js";
13
+ export { SearchIndex, tokenize } from "./search.js";
14
+ export { VectorCache, VectorIndex, embedText, textHash, validateNamespace, validateTextHash, } from "./similarity.js";
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,UAAU,EACV,OAAO,EACP,cAAc,EACd,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,MAAM,EAAY,MAAM,UAAU,CAAC;AAC5C,OAAO,EACL,UAAU,EACV,cAAc,EAEd,cAAc,EACd,SAAS,EACT,aAAa,EACb,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,kBAAkB,EAClB,UAAU,EAIV,QAAQ,EACR,MAAM,GACP,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,EAAiE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACxG,OAAO,EACL,KAAK,EACL,WAAW,EACX,IAAI,EACJ,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,KAAK,EACL,WAAW,EACX,OAAO,EACP,MAAM,EACN,YAAY,EACZ,OAAO,EACP,qBAAqB,EACrB,cAAc,EACd,8BAA8B,EAC9B,0BAA0B,EAC1B,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAgB,MAAM,aAAa,CAAC;AACnD,OAAO,EAML,aAAa,EACb,uBAAuB,EACvB,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,qBAAqB,EACrB,QAAQ,EACR,qBAAqB,EACrB,YAAY,EACZ,eAAe,EACf,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,KAAK,GAMN,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,WAAW,EAAuC,QAAQ,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EAKL,WAAW,EACX,WAAW,EACX,SAAS,EACT,QAAQ,EACR,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC"}
package/dist/node.d.ts ADDED
@@ -0,0 +1,106 @@
1
+ import { z } from "zod";
2
+ export declare function newUid(): string;
3
+ export declare const NodeMetadataSchema: z.ZodObject<{
4
+ created: z.ZodDefault<z.ZodNullable<z.ZodEffects<z.ZodString, string, string>>>;
5
+ updated: z.ZodDefault<z.ZodNullable<z.ZodEffects<z.ZodString, string, string>>>;
6
+ version: z.ZodDefault<z.ZodNumber>;
7
+ }, "strip", z.ZodTypeAny, {
8
+ created: string | null;
9
+ updated: string | null;
10
+ version: number;
11
+ }, {
12
+ created?: string | null | undefined;
13
+ updated?: string | null | undefined;
14
+ version?: number | undefined;
15
+ }>;
16
+ export type NodeMetadata = z.infer<typeof NodeMetadataSchema>;
17
+ export declare const NodeSchema: z.ZodObject<{
18
+ id: z.ZodString;
19
+ uid: z.ZodDefault<z.ZodString>;
20
+ kind: z.ZodString;
21
+ title: z.ZodString;
22
+ body: z.ZodDefault<z.ZodString>;
23
+ metadata: z.ZodEffects<z.ZodObject<{
24
+ created: z.ZodDefault<z.ZodNullable<z.ZodEffects<z.ZodString, string, string>>>;
25
+ updated: z.ZodDefault<z.ZodNullable<z.ZodEffects<z.ZodString, string, string>>>;
26
+ version: z.ZodDefault<z.ZodNumber>;
27
+ }, "strip", z.ZodTypeAny, {
28
+ created: string | null;
29
+ updated: string | null;
30
+ version: number;
31
+ }, {
32
+ created?: string | null | undefined;
33
+ updated?: string | null | undefined;
34
+ version?: number | undefined;
35
+ }>, {
36
+ created: string | null;
37
+ updated: string | null;
38
+ version: number;
39
+ }, unknown>;
40
+ relations: z.ZodDefault<z.ZodArray<z.ZodObject<{
41
+ source: z.ZodString;
42
+ predicate: z.ZodString;
43
+ target: z.ZodString;
44
+ directed: z.ZodDefault<z.ZodBoolean>;
45
+ weight: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
46
+ attrs: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
47
+ }, "strip", z.ZodTypeAny, {
48
+ source: string;
49
+ predicate: string;
50
+ target: string;
51
+ directed: boolean;
52
+ weight: number | null;
53
+ attrs: Record<string, unknown>;
54
+ }, {
55
+ source: string;
56
+ predicate: string;
57
+ target: string;
58
+ directed?: boolean | undefined;
59
+ weight?: number | null | undefined;
60
+ attrs?: Record<string, unknown> | undefined;
61
+ }>, "many">>;
62
+ facets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
63
+ deprecatedIds: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
64
+ }, "strip", z.ZodTypeAny, {
65
+ id: string;
66
+ uid: string;
67
+ kind: string;
68
+ title: string;
69
+ body: string;
70
+ metadata: {
71
+ created: string | null;
72
+ updated: string | null;
73
+ version: number;
74
+ };
75
+ relations: {
76
+ source: string;
77
+ predicate: string;
78
+ target: string;
79
+ directed: boolean;
80
+ weight: number | null;
81
+ attrs: Record<string, unknown>;
82
+ }[];
83
+ facets: Record<string, Record<string, unknown>>;
84
+ deprecatedIds: string[];
85
+ }, {
86
+ id: string;
87
+ kind: string;
88
+ title: string;
89
+ uid?: string | undefined;
90
+ body?: string | undefined;
91
+ metadata?: unknown;
92
+ relations?: {
93
+ source: string;
94
+ predicate: string;
95
+ target: string;
96
+ directed?: boolean | undefined;
97
+ weight?: number | null | undefined;
98
+ attrs?: Record<string, unknown> | undefined;
99
+ }[] | undefined;
100
+ facets?: Record<string, Record<string, unknown>> | undefined;
101
+ deprecatedIds?: string[] | undefined;
102
+ }>;
103
+ export type Node = z.infer<typeof NodeSchema>;
104
+ export type NodeInput = z.input<typeof NodeSchema>;
105
+ export declare function makeNode(input: NodeInput): Node;
106
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,wBAAgB,MAAM,IAAI,MAAM,CAE/B;AAkBD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAI7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUrB,CAAC;AAEH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAC9C,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEnD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAqB/C"}
package/dist/node.js ADDED
@@ -0,0 +1,66 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { z } from "zod";
3
+ import { IdError, ValidationError } from "./errors.js";
4
+ import { NodeId } from "./ids.js";
5
+ import { RelationSchema } from "./relations.js";
6
+ export function newUid() {
7
+ return randomUUID().replace(/-/g, "");
8
+ }
9
+ const DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
10
+ const DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
11
+ const dateStr = z
12
+ .string()
13
+ .regex(DATE_RE, "expected a YYYY-MM-DD date string")
14
+ .refine((s) => {
15
+ // Real-calendar validity via explicit arithmetic — full parity with Python's `date`
16
+ // (MINYEAR=1, rejects 2026-99-99 / 2026-02-30 / non-leap 02-29, accepts 0001-0099).
17
+ // Deliberately avoids JS `Date`, which maps years 0-99 onto 1900-1999.
18
+ const [y, m, d] = s.split("-").map(Number);
19
+ if (y < 1 || m < 1 || m > 12 || d < 1)
20
+ return false;
21
+ const leap = (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0;
22
+ const maxDay = m === 2 && leap ? 29 : DAYS_IN_MONTH[m - 1];
23
+ return d <= maxDay;
24
+ }, "not a valid calendar date");
25
+ export const NodeMetadataSchema = z.object({
26
+ created: dateStr.nullable().default(null),
27
+ updated: dateStr.nullable().default(null),
28
+ version: z.number().int().default(1),
29
+ });
30
+ export const NodeSchema = z.object({
31
+ id: z.string(),
32
+ uid: z.string().default(() => newUid()),
33
+ kind: z.string(),
34
+ title: z.string(),
35
+ body: z.string().default(""),
36
+ metadata: z.preprocess((v) => v ?? {}, NodeMetadataSchema),
37
+ relations: z.array(RelationSchema).default([]),
38
+ facets: z.record(z.record(z.unknown())).default({}),
39
+ deprecatedIds: z.array(z.string()).default([]),
40
+ });
41
+ export function makeNode(input) {
42
+ let node;
43
+ try {
44
+ node = NodeSchema.parse(input);
45
+ }
46
+ catch (e) {
47
+ if (e instanceof z.ZodError) {
48
+ throw new ValidationError(e.issues.map((i) => i.message).join("; "));
49
+ }
50
+ throw e;
51
+ }
52
+ let parsed;
53
+ try {
54
+ parsed = NodeId.parse(node.id);
55
+ }
56
+ catch (e) {
57
+ if (e instanceof IdError)
58
+ throw new ValidationError(e.message);
59
+ throw e;
60
+ }
61
+ if (parsed.kind !== node.kind) {
62
+ throw new ValidationError(`id kind ${JSON.stringify(parsed.kind)} != kind field ${JSON.stringify(node.kind)}`);
63
+ }
64
+ return node;
65
+ }
66
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** Half-up rounding to 6 decimal places — the shared ranking/parity key. Used by both the
2
+ * full-text search index and the similarity index, so it lives here rather than in either
3
+ * (neither derived-index facet imports the other). Floor-based half-up is identical in
4
+ * TypeScript and Python (`Math.floor` / `math.floor` agree on negative operands), so it is
5
+ * correct over BM25 (non-negative) and cosine (`[-1, 1]`) scores alike. */
6
+ export declare function scoreKey(score: number): number;
7
+ //# sourceMappingURL=ranking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ranking.d.ts","sourceRoot":"","sources":["../src/ranking.ts"],"names":[],"mappings":"AAAA;;;;2EAI2E;AAC3E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9C"}
@@ -0,0 +1,9 @@
1
+ /** Half-up rounding to 6 decimal places — the shared ranking/parity key. Used by both the
2
+ * full-text search index and the similarity index, so it lives here rather than in either
3
+ * (neither derived-index facet imports the other). Floor-based half-up is identical in
4
+ * TypeScript and Python (`Math.floor` / `math.floor` agree on negative operands), so it is
5
+ * correct over BM25 (non-negative) and cosine (`[-1, 1]`) scores alike. */
6
+ export function scoreKey(score) {
7
+ return Math.floor(score * 1_000_000 + 0.5) / 1_000_000;
8
+ }
9
+ //# sourceMappingURL=ranking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ranking.js","sourceRoot":"","sources":["../src/ranking.ts"],"names":[],"mappings":"AAAA;;;;2EAI2E;AAC3E,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC;AACzD,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { Node } from "./node.js";
2
+ export type Invariant = (node: Node) => void;
3
+ export interface ShapeSpec {
4
+ name: string;
5
+ requiredFacets?: Set<string>;
6
+ optionalFacets?: Set<string>;
7
+ invariants?: Invariant[];
8
+ }
9
+ export interface KindSpec {
10
+ name: string;
11
+ shape?: string;
12
+ requiredFacets?: Set<string>;
13
+ optionalFacets?: Set<string>;
14
+ invariants?: Invariant[];
15
+ }
16
+ /** One structured validation finding from `Registry.check` (never thrown). */
17
+ export interface Violation {
18
+ readonly code: string;
19
+ readonly detail: string;
20
+ readonly message: string;
21
+ }
22
+ export declare class Registry {
23
+ private specs;
24
+ private shapes;
25
+ registerShape(spec: ShapeSpec): void;
26
+ isShape(name: string): boolean;
27
+ register(spec: KindSpec): void;
28
+ isRegistered(kind: string): boolean;
29
+ get(kind: string): KindSpec;
30
+ private compose;
31
+ validate(node: Node): void;
32
+ /** Collect ALL violations of `node` with machine-stable codes; never throws on
33
+ * content. Non-kernel exceptions from invariants are programmer bugs and propagate. */
34
+ check(node: Node): Violation[];
35
+ }
36
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGtC,MAAM,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;AAE7C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;CAC1B;AAED,8EAA8E;AAC9E,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,MAAM,CAAgC;IAE9C,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAOpC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI9B,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAY9B,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAInC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ;IAQ3B,OAAO,CAAC,OAAO;IAoBf,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAgB1B;2FACuF;IACvF,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,EAAE;CA8C/B"}
@@ -0,0 +1,123 @@
1
+ import { FacetError, InvariantError, UnknownKindError, ValidationError } from "./errors.js";
2
+ import { compareCodepoints } from "./search.js";
3
+ export class Registry {
4
+ specs = new Map();
5
+ shapes = new Map();
6
+ registerShape(spec) {
7
+ if (this.shapes.has(spec.name)) {
8
+ throw new ValidationError(`shape ${JSON.stringify(spec.name)} is already registered`);
9
+ }
10
+ this.shapes.set(spec.name, spec);
11
+ }
12
+ isShape(name) {
13
+ return this.shapes.has(name);
14
+ }
15
+ register(spec) {
16
+ if (this.specs.has(spec.name)) {
17
+ throw new ValidationError(`kind ${JSON.stringify(spec.name)} is already registered`);
18
+ }
19
+ if (spec.shape !== undefined && !this.shapes.has(spec.shape)) {
20
+ throw new UnknownKindError(`kind ${JSON.stringify(spec.name)} adopts unknown shape ${JSON.stringify(spec.shape)}`);
21
+ }
22
+ this.specs.set(spec.name, spec);
23
+ }
24
+ isRegistered(kind) {
25
+ return this.specs.has(kind);
26
+ }
27
+ get(kind) {
28
+ const spec = this.specs.get(kind);
29
+ if (spec === undefined) {
30
+ throw new UnknownKindError(`kind ${JSON.stringify(kind)} is not registered`);
31
+ }
32
+ return spec;
33
+ }
34
+ compose(spec, kind) {
35
+ const required = new Set(spec.requiredFacets ?? []);
36
+ const optional = new Set(spec.optionalFacets ?? []);
37
+ const invariants = [];
38
+ if (spec.shape !== undefined) {
39
+ const shape = this.shapes.get(spec.shape);
40
+ if (shape === undefined) {
41
+ throw new UnknownKindError(`kind ${JSON.stringify(kind)} adopts unknown shape ${JSON.stringify(spec.shape)}`);
42
+ }
43
+ for (const f of shape.requiredFacets ?? [])
44
+ required.add(f);
45
+ for (const f of shape.optionalFacets ?? [])
46
+ optional.add(f);
47
+ for (const inv of shape.invariants ?? [])
48
+ invariants.push(inv);
49
+ }
50
+ for (const inv of spec.invariants ?? [])
51
+ invariants.push(inv);
52
+ return { required, optional, invariants };
53
+ }
54
+ validate(node) {
55
+ const spec = this.get(node.kind);
56
+ const { required, optional, invariants } = this.compose(spec, node.kind);
57
+ const present = new Set(Object.keys(node.facets));
58
+ const missing = [...required].filter((f) => !present.has(f)).sort();
59
+ if (missing.length > 0) {
60
+ throw new FacetError(`${node.id}: missing required facets ${JSON.stringify(missing)}`);
61
+ }
62
+ const allowed = new Set([...required, ...optional]);
63
+ const unexpected = [...present].filter((f) => !allowed.has(f)).sort();
64
+ if (unexpected.length > 0) {
65
+ throw new FacetError(`${node.id}: unexpected facets ${JSON.stringify(unexpected)}`);
66
+ }
67
+ for (const invariant of invariants)
68
+ invariant(node);
69
+ }
70
+ /** Collect ALL violations of `node` with machine-stable codes; never throws on
71
+ * content. Non-kernel exceptions from invariants are programmer bugs and propagate. */
72
+ check(node) {
73
+ const spec = this.specs.get(node.kind);
74
+ if (spec === undefined) {
75
+ return [
76
+ {
77
+ code: "unknown-kind",
78
+ detail: node.kind,
79
+ message: `${node.id}: kind ${JSON.stringify(node.kind)} is not registered`,
80
+ },
81
+ ];
82
+ }
83
+ const { required, optional, invariants } = this.compose(spec, node.kind);
84
+ const present = new Set(Object.keys(node.facets));
85
+ const violations = [];
86
+ for (const name of [...required].filter((f) => !present.has(f)).sort(compareCodepoints)) {
87
+ violations.push({
88
+ code: "facet-missing",
89
+ detail: name,
90
+ message: `${node.id}: missing required facet ${JSON.stringify(name)}`,
91
+ });
92
+ }
93
+ const allowed = new Set([...required, ...optional]);
94
+ for (const name of [...present].filter((f) => !allowed.has(f)).sort(compareCodepoints)) {
95
+ violations.push({
96
+ code: "facet-unexpected",
97
+ detail: name,
98
+ message: `${node.id}: unexpected facet ${JSON.stringify(name)}`,
99
+ });
100
+ }
101
+ // Invariants presuppose their facets; running them anyway would duplicate reports.
102
+ if (violations.length > 0)
103
+ return violations;
104
+ for (const invariant of invariants) {
105
+ try {
106
+ invariant(node);
107
+ }
108
+ catch (exc) {
109
+ if (exc instanceof FacetError) {
110
+ violations.push({ code: "facet-invalid", detail: "", message: exc.message });
111
+ }
112
+ else if (exc instanceof InvariantError) {
113
+ violations.push({ code: "invariant-violated", detail: "", message: exc.message });
114
+ }
115
+ else {
116
+ throw exc;
117
+ }
118
+ }
119
+ }
120
+ return violations;
121
+ }
122
+ }
123
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { z } from "zod";
2
+ export declare const RELATES_TO = "relatesTo";
3
+ export declare const RelationSchema: z.ZodObject<{
4
+ source: z.ZodString;
5
+ predicate: z.ZodString;
6
+ target: z.ZodString;
7
+ directed: z.ZodDefault<z.ZodBoolean>;
8
+ weight: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
9
+ attrs: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ source: string;
12
+ predicate: string;
13
+ target: string;
14
+ directed: boolean;
15
+ weight: number | null;
16
+ attrs: Record<string, unknown>;
17
+ }, {
18
+ source: string;
19
+ predicate: string;
20
+ target: string;
21
+ directed?: boolean | undefined;
22
+ weight?: number | null | undefined;
23
+ attrs?: Record<string, unknown> | undefined;
24
+ }>;
25
+ export type Relation = z.infer<typeof RelationSchema>;
26
+ export declare function fromSerialized(data: Record<string, unknown>, containerId: string): Relation;
27
+ export declare function toSerialized(rel: Relation, containerId: string): Record<string, unknown>;
28
+ export declare function relatesTo(source: string, target: string): Relation;
29
+ export declare function tagToRelation(source: string, tag: string, aliasMap: Record<string, string>): Relation;
30
+ //# sourceMappingURL=relations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations.d.ts","sourceRoot":"","sources":["../src/relations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,UAAU,cAAc,CAAC;AAEtC,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;EAOzB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAKtD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,MAAM,GAAG,QAAQ,CAG3F;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASxF;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,CAElE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,QAAQ,CAOrG"}