@inventarch/graph 0.0.0-stage → 1.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 (53) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +4 -0
  3. package/README.md +4 -2
  4. package/SPEC.md +53 -0
  5. package/dist/coordinate.d.ts +14 -0
  6. package/dist/coordinate.d.ts.map +1 -0
  7. package/dist/coordinate.js +48 -0
  8. package/dist/coordinate.js.map +1 -0
  9. package/dist/diagnostics.d.ts +12 -0
  10. package/dist/diagnostics.d.ts.map +1 -0
  11. package/dist/diagnostics.js +24 -0
  12. package/dist/diagnostics.js.map +1 -0
  13. package/dist/immutable.d.ts +6 -0
  14. package/dist/immutable.d.ts.map +1 -0
  15. package/dist/immutable.js +53 -0
  16. package/dist/immutable.js.map +1 -0
  17. package/dist/index.d.ts +18 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +10 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/load.d.ts +6 -0
  22. package/dist/load.d.ts.map +1 -0
  23. package/dist/load.js +320 -0
  24. package/dist/load.js.map +1 -0
  25. package/dist/paths.d.ts +5 -0
  26. package/dist/paths.d.ts.map +1 -0
  27. package/dist/paths.js +28 -0
  28. package/dist/paths.js.map +1 -0
  29. package/dist/queries.d.ts +19 -0
  30. package/dist/queries.d.ts.map +1 -0
  31. package/dist/queries.js +70 -0
  32. package/dist/queries.js.map +1 -0
  33. package/dist/resolve.d.ts +12 -0
  34. package/dist/resolve.d.ts.map +1 -0
  35. package/dist/resolve.js +17 -0
  36. package/dist/resolve.js.map +1 -0
  37. package/dist/revision.d.ts +16 -0
  38. package/dist/revision.d.ts.map +1 -0
  39. package/dist/revision.js +58 -0
  40. package/dist/revision.js.map +1 -0
  41. package/dist/text.d.ts +16 -0
  42. package/dist/text.d.ts.map +1 -0
  43. package/dist/text.js +99 -0
  44. package/dist/text.js.map +1 -0
  45. package/dist/traverse.d.ts +39 -0
  46. package/dist/traverse.d.ts.map +1 -0
  47. package/dist/traverse.js +107 -0
  48. package/dist/traverse.js.map +1 -0
  49. package/dist/types.d.ts +112 -0
  50. package/dist/types.d.ts.map +1 -0
  51. package/dist/types.js +2 -0
  52. package/dist/types.js.map +1 -0
  53. package/package.json +91 -3
package/dist/text.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ import type { CompiledRecord } from '@inventarch/language';
2
+ import type { Graph } from './types.js';
3
+ export declare function fold(text: string): string;
4
+ export declare function tokenize(text: string): readonly string[];
5
+ export interface TextIndex {
6
+ readonly postings: ReadonlyMap<string, ReadonlyMap<string, number>>;
7
+ readonly lengths: ReadonlyMap<string, number>;
8
+ }
9
+ export interface SearchHit {
10
+ readonly identity: string;
11
+ readonly score: number;
12
+ readonly terms: readonly string[];
13
+ }
14
+ export declare function buildTextIndex(records: Iterable<CompiledRecord>): TextIndex;
15
+ export declare function search(graph: Graph, query: string, scope?: ReadonlySet<string>): readonly SearchHit[];
16
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../src/text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,cAAc,EAAiB,MAAM,sBAAsB,CAAC;AAGzF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAQxC,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMzC;AACD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAQxD;AACD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpE,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/C;AACD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAyCD,wBAAgB,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,SAAS,CAa3E;AACD,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,SAAS,SAAS,EAAE,CA2BrG"}
package/dist/text.js ADDED
@@ -0,0 +1,99 @@
1
+ import { snapshot } from './immutable.js';
2
+ import { compare } from './revision.js';
3
+ // Donor store/text.ts normalization, stopwords and BM25 constants; no source lexer.
4
+ const STOPWORDS = new Set('the and for that this with was are has have had not but you your our its all any can did does how what when where which who why will would should could into about from they them then than there here still yet were been being just like make made need want'.split(' '));
5
+ export function fold(text) {
6
+ return text
7
+ .normalize('NFKC')
8
+ .toLowerCase()
9
+ .normalize('NFD')
10
+ .replace(/\p{M}+/gu, '');
11
+ }
12
+ export function tokenize(text) {
13
+ return Object.freeze(fold(text)
14
+ .split(/[^\p{L}\p{N}]+/u)
15
+ .filter((word) => word.length >= 2)
16
+ .map((word) => word.slice(0, 64))
17
+ .filter((word) => !STOPWORDS.has(word)));
18
+ }
19
+ function valueText(value) {
20
+ switch (value.kind) {
21
+ case 'scalar':
22
+ case 'string':
23
+ case 'prose':
24
+ return value.text;
25
+ case 'ref':
26
+ return `${value.discriminator} ${value.name} ${value.fragment ?? ''}`;
27
+ case 'list':
28
+ return value.items.map(valueText).join(' ');
29
+ case 'block':
30
+ case 'none':
31
+ return '';
32
+ }
33
+ }
34
+ function recordText(record) {
35
+ const parts = [record.displayName, record.discriminator], seen = new Set();
36
+ const collect = (children) => {
37
+ for (const child of children) {
38
+ const text = valueText('key' in child ? child.value : child.item);
39
+ if (text !== '') {
40
+ parts.push(text);
41
+ seen.add(child.span.line);
42
+ }
43
+ if ('key' in child && child.fields !== undefined)
44
+ collect(child.fields);
45
+ }
46
+ };
47
+ collect(record.head);
48
+ for (const section of record.sections)
49
+ collect(section.fields);
50
+ // Semantic products retain body spans. Count their text only if the structured
51
+ // field did not already carry it; never double the weight of a cognition cell.
52
+ for (const product of [...record.cells, ...record.variants, ...record.requirements]) {
53
+ if (seen.has(product.span.line))
54
+ continue;
55
+ parts.push('value' in product ? valueText(product.value) : product.text);
56
+ seen.add(product.span.line);
57
+ }
58
+ return parts.join(' ');
59
+ }
60
+ export function buildTextIndex(records) {
61
+ const postings = new Map(), lengths = new Map();
62
+ for (const record of records) {
63
+ const tokens = tokenize(recordText(record));
64
+ lengths.set(record.identity, tokens.length);
65
+ for (const token of tokens) {
66
+ const posting = postings.get(token) ?? new Map();
67
+ posting.set(record.identity, (posting.get(record.identity) ?? 0) + 1);
68
+ postings.set(token, posting);
69
+ }
70
+ }
71
+ return { postings, lengths }; // load snapshots this internal construction product
72
+ }
73
+ export function search(graph, query, scope) {
74
+ const terms = [...new Set(tokenize(query))];
75
+ const visible = [...graph.text.lengths.keys()].filter((id) => scope === undefined || scope.has(id));
76
+ if (terms.length === 0 || visible.length === 0)
77
+ return Object.freeze([]);
78
+ const allowed = new Set(visible), total = visible.length;
79
+ const average = visible.reduce((sum, id) => sum + graph.text.lengths.get(id), 0) / total || 1;
80
+ const scores = new Map(), matched = new Map();
81
+ for (const term of terms) {
82
+ const postings = [...(graph.text.postings.get(term) ?? [])].filter(([id]) => allowed.has(id));
83
+ if (postings.length === 0)
84
+ continue;
85
+ const idf = Math.log(1 + (total - postings.length + 0.5) / (postings.length + 0.5));
86
+ for (const [id, tf] of postings) {
87
+ const denominator = tf + 1.2 * (1 - 0.75 + (0.75 * graph.text.lengths.get(id)) / average);
88
+ scores.set(id, (scores.get(id) ?? 0) + (idf * tf * 2.2) / denominator);
89
+ const hits = matched.get(id) ?? [];
90
+ hits.push(term);
91
+ matched.set(id, hits);
92
+ }
93
+ }
94
+ return snapshot([...scores]
95
+ .filter(([, score]) => score > 0)
96
+ .map(([identity, score]) => ({ identity, score, terms: matched.get(identity) }))
97
+ .sort((a, b) => b.score - a.score || compare(a.identity, b.identity)));
98
+ }
99
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../src/text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { Kind, Predicate } from '@inventarch/language';
2
+ import type { Coordinate } from './coordinate.js';
3
+ import type { Edge, Graph } from './types.js';
4
+ export interface TraverseOptions {
5
+ readonly start: readonly string[];
6
+ readonly follow?: readonly string[];
7
+ readonly direction?: 'out' | 'in' | 'both';
8
+ readonly depth?: number;
9
+ readonly filter?: {
10
+ readonly kind?: Kind;
11
+ readonly discriminator?: string;
12
+ readonly system?: string;
13
+ };
14
+ readonly coordinate?: Coordinate;
15
+ readonly scope?: ReadonlySet<string>;
16
+ /** Optional work bounds; omission preserves the complete traversal contract. */
17
+ readonly maxNodes?: number;
18
+ readonly maxEdges?: number;
19
+ }
20
+ export interface Via {
21
+ readonly from: string;
22
+ readonly predicate: Predicate;
23
+ readonly direction: 'out' | 'in';
24
+ readonly target: string;
25
+ }
26
+ export interface WalkNode {
27
+ readonly identity: string;
28
+ readonly depth: number;
29
+ }
30
+ export interface Traversal {
31
+ readonly nodes: readonly WalkNode[];
32
+ readonly via: readonly Via[];
33
+ readonly edges: readonly Edge[];
34
+ readonly gated: readonly Edge[];
35
+ readonly dangling: readonly Edge[];
36
+ readonly truncated?: boolean;
37
+ }
38
+ export declare function traverse(graph: Graph, options: TraverseOptions): Traversal;
39
+ //# sourceMappingURL=traverse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traverse.d.ts","sourceRoot":"","sources":["../src/traverse.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAMlD,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;QAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtG,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AACD,MAAM,WAAW,GAAG;IAClB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AACD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AACD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IACpC,QAAQ,CAAC,GAAG,EAAE,SAAS,GAAG,EAAE,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,IAAI,EAAE,CAAC;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,GAAG,SAAS,CAiH1E"}
@@ -0,0 +1,107 @@
1
+ import { VERB_PHRASES, verbOf } from '@inventarch/language';
2
+ import { validateCoordinate } from './coordinate.js';
3
+ import { GraphUsageError } from './diagnostics.js';
4
+ import { snapshot } from './immutable.js';
5
+ import { edgeOrder } from './load.js';
6
+ import { conditionHolds } from './queries.js';
7
+ import { compare, stableSerialize } from './revision.js';
8
+ export function traverse(graph, options) {
9
+ for (const limit of [options.maxNodes, options.maxEdges])
10
+ if (limit !== undefined && (!Number.isSafeInteger(limit) || limit < 1))
11
+ throw new GraphUsageError('IA-GRAPH-TRAVERSAL-INVALID', 'Traversal limits must be positive integers');
12
+ let truncated = false, examined = 0;
13
+ const depth = options.depth ?? 1;
14
+ if (!Number.isInteger(depth) || depth < 0 || depth > 8)
15
+ throw new GraphUsageError('IA-GRAPH-TRAVERSAL-INVALID', 'Traversal depth must be an integer from 0 to 8');
16
+ const direction = options.direction ?? 'both';
17
+ if (options.follow === undefined && !['out', 'in', 'both'].includes(direction))
18
+ throw new GraphUsageError('IA-GRAPH-TRAVERSAL-INVALID', `Unknown direction '${direction}'`);
19
+ const followed = options.follow?.map((phrase) => {
20
+ const verb = verbOf(phrase);
21
+ if (verb === undefined)
22
+ throw new GraphUsageError('IA-GRAPH-VERB-UNKNOWN', `Unknown verb '${phrase}'; admitted: ${VERB_PHRASES.join(', ')}`);
23
+ return verb;
24
+ });
25
+ const coordinate = options.coordinate === undefined ? undefined : validateCoordinate(options.coordinate);
26
+ const admitted = (id) => {
27
+ const node = graph.nodes.get(id), filter = options.filter;
28
+ return (node !== undefined &&
29
+ (options.scope === undefined || options.scope.has(id)) &&
30
+ (filter?.kind === undefined || node.kind === filter.kind) &&
31
+ (filter?.discriminator === undefined || node.discriminator === filter.discriminator) &&
32
+ (filter?.system === undefined || node.system === filter.system));
33
+ };
34
+ const depths = new Map();
35
+ let frontier = [...new Set(options.start)].filter(admitted).sort(compare);
36
+ if (options.maxNodes !== undefined && frontier.length > options.maxNodes) {
37
+ frontier = frontier.slice(0, options.maxNodes);
38
+ truncated = true;
39
+ }
40
+ for (const id of frontier)
41
+ depths.set(id, 0);
42
+ const edges = new Map(), gated = new Map(), dangling = new Map(), via = new Map();
43
+ walk: for (let level = 1; level <= depth && frontier.length > 0; level++) {
44
+ const next = new Set();
45
+ for (const id of frontier)
46
+ for (const dir of ['out', 'in']) {
47
+ if (followed === undefined && direction !== 'both' && direction !== dir)
48
+ continue;
49
+ for (const [predicate, adjacent] of (dir === 'out' ? graph.out : graph.in).get(id) ?? []) {
50
+ if (followed !== undefined && !followed.some((v) => v.direction === dir && v.predicate === predicate))
51
+ continue;
52
+ for (const edge of adjacent) {
53
+ if (options.maxEdges !== undefined &&
54
+ (edges.size + gated.size + dangling.size >= options.maxEdges || ++examined > options.maxEdges * 4)) {
55
+ truncated = true;
56
+ break walk;
57
+ }
58
+ const target = dir === 'out' ? edge.to : edge.from;
59
+ // Prune before emitting even a gated edge: it must not reveal an excluded endpoint.
60
+ if (target !== null && !admitted(target))
61
+ continue;
62
+ if (target !== null &&
63
+ !depths.has(target) &&
64
+ options.maxNodes !== undefined &&
65
+ depths.size >= options.maxNodes) {
66
+ truncated = true;
67
+ continue;
68
+ }
69
+ const key = stableSerialize(edge);
70
+ if (coordinate !== undefined &&
71
+ !conditionHolds(edge.condition, graph.nodes.get(edge.conditionSubject).dimensions, coordinate)) {
72
+ gated.set(key, edge);
73
+ continue;
74
+ }
75
+ if (target === null) {
76
+ dangling.set(key, edge);
77
+ continue;
78
+ }
79
+ edges.set(key, edge);
80
+ if (depths.has(target) && depths.get(target) !== level)
81
+ continue;
82
+ const hop = { from: id, predicate, direction: dir, target };
83
+ via.set(stableSerialize(hop), hop);
84
+ if (!depths.has(target)) {
85
+ depths.set(target, level);
86
+ next.add(target);
87
+ }
88
+ }
89
+ }
90
+ }
91
+ frontier = [...next].sort(compare);
92
+ }
93
+ return snapshot({
94
+ nodes: [...depths]
95
+ .map(([identity, depth]) => ({ identity, depth }))
96
+ .sort((a, b) => a.depth - b.depth || compare(a.identity, b.identity)),
97
+ via: [...via.values()].sort((a, b) => compare(a.from, b.from) ||
98
+ compare(a.predicate, b.predicate) ||
99
+ compare(a.direction, b.direction) ||
100
+ compare(a.target, b.target)),
101
+ edges: [...edges.values()].sort(edgeOrder),
102
+ gated: [...gated.values()].sort(edgeOrder),
103
+ dangling: [...dangling.values()].sort(edgeOrder),
104
+ ...(options.maxNodes === undefined && options.maxEdges === undefined ? {} : { truncated }),
105
+ });
106
+ }
107
+ //# sourceMappingURL=traverse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traverse.js","sourceRoot":"","sources":["../src/traverse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ import type { Band, Cell, CompiledRecord, CompiledValue, EdgeReference, FrozenRegistry, Phase, Predicate, Span, Term } from '@inventarch/language';
2
+ import type { Dimensions } from './coordinate.js';
3
+ import type { GraphDiagnostic } from './diagnostics.js';
4
+ import type { RevisionInputs } from './revision.js';
5
+ import type { TextIndex } from './text.js';
6
+ export interface Node extends CompiledRecord {
7
+ readonly band: Band;
8
+ readonly reach: string;
9
+ readonly dimensions: Dimensions;
10
+ }
11
+ export interface Occurrence {
12
+ readonly key: string;
13
+ readonly node: Node;
14
+ readonly status: 'inactive' | 'refused' | 'winner' | 'shadowed' | 'tied' | 'blocked';
15
+ readonly shadowedBy?: string;
16
+ }
17
+ export interface Shadow {
18
+ readonly identity: string;
19
+ readonly winner: string;
20
+ readonly shadowed: string;
21
+ }
22
+ export interface Tie {
23
+ readonly identity: string;
24
+ readonly band: Band;
25
+ readonly occurrences: readonly string[];
26
+ }
27
+ export interface EdgeAssertion {
28
+ readonly author: string;
29
+ readonly direction: 'out' | 'in';
30
+ readonly reference: EdgeReference;
31
+ readonly source: {
32
+ readonly path: string;
33
+ readonly line: number;
34
+ readonly endLine: number;
35
+ };
36
+ }
37
+ export interface Edge {
38
+ readonly from: string | null;
39
+ readonly predicate: Predicate;
40
+ readonly to: string | null;
41
+ readonly author: string;
42
+ readonly reference: EdgeReference;
43
+ readonly fragment?: string;
44
+ readonly fragmentEndpoint?: 'from' | 'to';
45
+ readonly condition?: readonly Term[];
46
+ readonly conditionSubject: string;
47
+ readonly source: EdgeAssertion['source'];
48
+ readonly assertions: readonly EdgeAssertion[];
49
+ }
50
+ /**
51
+ * A resolved typed ref value held in a record field (G06a): `field` is the compiler's field path, `head.steward`,
52
+ * `composition.mandate`, `binding.target`, or the bare section name for a section-level `- @word name` item.
53
+ * Derived only: it is not an Edge, carries no predicate and is never consent- or cardinality-checked.
54
+ */
55
+ export interface FieldReference {
56
+ readonly from: string;
57
+ readonly to: string;
58
+ readonly field: string;
59
+ readonly reference: Extract<CompiledValue, {
60
+ kind: 'ref';
61
+ }>;
62
+ readonly source: {
63
+ readonly path: string;
64
+ readonly line: number;
65
+ readonly endLine: number;
66
+ };
67
+ }
68
+ export interface CellRef {
69
+ readonly identity: string;
70
+ readonly primary: boolean;
71
+ readonly span: Span;
72
+ }
73
+ export interface LoadOptions extends RevisionInputs {
74
+ readonly location: string;
75
+ readonly phase?: Phase;
76
+ }
77
+ export interface Graph {
78
+ readonly text: TextIndex;
79
+ readonly revision: string;
80
+ readonly location: string;
81
+ readonly phase?: Phase;
82
+ readonly registry: FrozenRegistry;
83
+ readonly nodes: ReadonlyMap<string, Node>;
84
+ readonly occurrences: readonly Occurrence[];
85
+ readonly shadows: readonly Shadow[];
86
+ readonly ties: readonly Tie[];
87
+ readonly diagnostics: readonly GraphDiagnostic[];
88
+ readonly edges: readonly Edge[];
89
+ readonly out: ReadonlyMap<string, ReadonlyMap<Predicate, readonly Edge[]>>;
90
+ readonly in: ReadonlyMap<string, ReadonlyMap<Predicate, readonly Edge[]>>;
91
+ readonly byName: ReadonlyMap<string, readonly string[]>;
92
+ readonly byDiscriminator: ReadonlyMap<string, readonly string[]>;
93
+ readonly byKind: ReadonlyMap<string, readonly string[]>;
94
+ readonly bySystem: ReadonlyMap<string, readonly string[]>;
95
+ readonly byCategory: ReadonlyMap<string, readonly string[]>;
96
+ readonly byLane: ReadonlyMap<string, readonly string[]>;
97
+ readonly byArtifactSet: ReadonlyMap<string, readonly string[]>;
98
+ readonly cells: ReadonlyMap<string, readonly CellRef[]>;
99
+ readonly selectors: ReadonlyMap<string, ReadonlyMap<string, readonly string[]>>;
100
+ readonly conditions: ReadonlyMap<string, readonly string[]>;
101
+ readonly dangling: readonly Edge[];
102
+ readonly byDanglingReference: ReadonlyMap<string, readonly Edge[]>;
103
+ /** G06a: resolved typed field refs, disjoint from `edges`; `in`, `out` and every edge count ignore them. */
104
+ readonly references: readonly FieldReference[];
105
+ /** `references` keyed by target identity, each list in `references` order. */
106
+ readonly referencedBy: ReadonlyMap<string, readonly FieldReference[]>;
107
+ }
108
+ export interface CellSelection {
109
+ readonly kind: 'exact' | 'primary';
110
+ readonly cell: Cell;
111
+ }
112
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,94 @@
1
1
  {
2
2
  "name": "@inventarch/graph",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ },
12
+ "./internal/coordinate": {
13
+ "types": "./dist/coordinate.d.ts",
14
+ "default": "./dist/coordinate.js"
15
+ },
16
+ "./internal/diagnostics": {
17
+ "types": "./dist/diagnostics.d.ts",
18
+ "default": "./dist/diagnostics.js"
19
+ },
20
+ "./internal/immutable": {
21
+ "types": "./dist/immutable.d.ts",
22
+ "default": "./dist/immutable.js"
23
+ },
24
+ "./internal/index": {
25
+ "types": "./dist/index.d.ts",
26
+ "default": "./dist/index.js"
27
+ },
28
+ "./internal/load": {
29
+ "types": "./dist/load.d.ts",
30
+ "default": "./dist/load.js"
31
+ },
32
+ "./internal/paths": {
33
+ "types": "./dist/paths.d.ts",
34
+ "default": "./dist/paths.js"
35
+ },
36
+ "./internal/queries": {
37
+ "types": "./dist/queries.d.ts",
38
+ "default": "./dist/queries.js"
39
+ },
40
+ "./internal/resolve": {
41
+ "types": "./dist/resolve.d.ts",
42
+ "default": "./dist/resolve.js"
43
+ },
44
+ "./internal/revision": {
45
+ "types": "./dist/revision.d.ts",
46
+ "default": "./dist/revision.js"
47
+ },
48
+ "./internal/text": {
49
+ "types": "./dist/text.d.ts",
50
+ "default": "./dist/text.js"
51
+ },
52
+ "./internal/traverse": {
53
+ "types": "./dist/traverse.d.ts",
54
+ "default": "./dist/traverse.js"
55
+ },
56
+ "./internal/types": {
57
+ "types": "./dist/types.d.ts",
58
+ "default": "./dist/types.js"
59
+ }
60
+ },
61
+ "files": [
62
+ "dist",
63
+ "README.md",
64
+ "SPEC.md",
65
+ "LICENSE",
66
+ "NOTICE"
67
+ ],
68
+ "dependencies": {
69
+ "@inventarch/language": "1.0.0"
70
+ },
71
+ "devDependencies": {
72
+ "@types/node": "^22.19.0",
73
+ "typescript": "^5.9.3",
74
+ "vitest": "^4.1.4"
75
+ },
76
+ "license": "Apache-2.0",
77
+ "publishConfig": {
78
+ "access": "public",
79
+ "registry": "https://registry.npmjs.org"
80
+ },
81
+ "engines": {
82
+ "node": ">=22.22.0 <23"
83
+ },
84
+ "repository": {
85
+ "type": "git",
86
+ "url": "git+https://github.com/inventarch/ia.git",
87
+ "directory": "packages/graph"
88
+ },
89
+ "scripts": {
90
+ "build": "tsc -p tsconfig.json",
91
+ "typecheck": "tsc --noEmit -p tsconfig.json && tsc -p tsconfig.tests.json",
92
+ "test": "vitest run --config vitest.config.mts"
93
+ }
6
94
  }