@medicine-wheel/relational-query 0.4.2 → 0.4.4
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.
- package/README.md +31 -0
- package/dist/guards.d.ts +69 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/guards.js +81 -0
- package/dist/guards.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/migrate.d.ts +42 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +137 -0
- package/dist/migrate.js.map +1 -0
- package/dist/traversal.d.ts.map +1 -1
- package/dist/traversal.js +35 -16
- package/dist/traversal.js.map +1 -1
- package/dist/types.d.ts +9 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -37,6 +37,37 @@ const path = shortestPath('from-id', 'to-id', nodes, edges);
|
|
|
37
37
|
const neighbors = neighborhood('node-id', nodes, edges, 2);
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
+
### Protocol Guards (avoidance protocols)
|
|
41
|
+
Conditional edge filters evaluated **before** a crossing. A guard does not veto —
|
|
42
|
+
when a boundary is reached it returns an escalation directive (delegate to a
|
|
43
|
+
custodian). The legacy `respectCeremonyBoundaries`/`ocapOnly` booleans are now
|
|
44
|
+
built-in guards; `avoidanceProtocolGuard` reads a relation's `context`.
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
import { traverse, avoidanceProtocolGuard } from '@medicine-wheel/relational-query';
|
|
48
|
+
|
|
49
|
+
const result = traverse('node-id', nodes, edges, relations, {
|
|
50
|
+
maxDepth: 3,
|
|
51
|
+
guards: [avoidanceProtocolGuard],
|
|
52
|
+
context: { identity: 'agent-mia', ceremonyState: 'open' },
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// Crossings a guard refused, surfaced for delegation:
|
|
56
|
+
result.escalations; // [{ fromId, toId, guard, reason, escalateTo }]
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### RDF → Flat Kinship-Graph Migration
|
|
60
|
+
Map RDF triples onto co-equal nodes + named relations. `rdfs:subClassOf` and
|
|
61
|
+
`rdf:type` flatten to the `co-emerges-with` edge — never a re-introduced hierarchy.
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
import { rdfToKinshipGraph, kinshipGraphToCypher, kinshipGraphToJsonl } from '@medicine-wheel/relational-query';
|
|
65
|
+
|
|
66
|
+
const graph = rdfToKinshipGraph(triples, { source: 'treaty-dataset' });
|
|
67
|
+
const cypher = kinshipGraphToCypher(graph); // MERGE statements for KuzuDB
|
|
68
|
+
const jsonl = kinshipGraphToJsonl(graph); // newline-delimited node/relation records
|
|
69
|
+
```
|
|
70
|
+
|
|
40
71
|
### Accountability Audit
|
|
41
72
|
Relational health metrics and OCAP® compliance reports.
|
|
42
73
|
|
package/dist/guards.d.ts
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @medicine-wheel/relational-query — Protocol Guards
|
|
3
|
+
*
|
|
4
|
+
* Avoidance protocols expressed as code logic: conditional edge filters
|
|
5
|
+
* evaluated BEFORE a traversal crosses a relation. A guard does not veto at
|
|
6
|
+
* inference time — when a boundary is reached it returns an escalation
|
|
7
|
+
* directive (delegate to a qualified custodian), the "in-the-loop" pattern.
|
|
8
|
+
*
|
|
9
|
+
* Built-in guards reproduce the former `respectCeremonyBoundaries` and
|
|
10
|
+
* `ocapOnly` booleans; the avoidance-protocol guard reads the optional
|
|
11
|
+
* `RelationContext` carried by a first-class Relation.
|
|
12
|
+
*/
|
|
13
|
+
import type { Relation, RelationalEdge } from '@medicine-wheel/ontology-core';
|
|
14
|
+
/** Runtime context an agent/being presents when traversing the kinship graph. */
|
|
15
|
+
export interface TraversalContext {
|
|
16
|
+
/** Identity of the being attempting traversal (matched against authorized_kin). */
|
|
17
|
+
identity?: string;
|
|
18
|
+
/** Current ceremony state / scope (matched against relation.context.active_context). */
|
|
19
|
+
ceremonyState?: string;
|
|
20
|
+
/** Free-form additional context for custom guards. */
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
}
|
|
23
|
+
/** The decision a guard returns for a single edge crossing. */
|
|
24
|
+
export interface GuardDecision {
|
|
25
|
+
allowed: boolean;
|
|
26
|
+
/** When blocked, who to escalate to — delegation, not a veto. */
|
|
27
|
+
escalateTo?: string;
|
|
28
|
+
/** Human-readable reason. */
|
|
29
|
+
reason?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* A protocol guard: a conditional edge filter evaluated before traversal.
|
|
33
|
+
* Receives the edge, its first-class Relation (if one is mapped), and the
|
|
34
|
+
* runtime context; returns whether the edge may be crossed.
|
|
35
|
+
*/
|
|
36
|
+
export interface ProtocolGuard {
|
|
37
|
+
name: string;
|
|
38
|
+
evaluate(edge: RelationalEdge, relation: Relation | undefined, context: TraversalContext): GuardDecision;
|
|
39
|
+
}
|
|
40
|
+
/** A boundary a guard refused to cross, surfaced for delegation. */
|
|
41
|
+
export interface GuardEscalation {
|
|
42
|
+
fromId: string;
|
|
43
|
+
toId: string;
|
|
44
|
+
/** Name of the guard that blocked the crossing. */
|
|
45
|
+
guard: string;
|
|
46
|
+
reason?: string;
|
|
47
|
+
escalateTo?: string;
|
|
48
|
+
}
|
|
49
|
+
/** Stop at edges that have not been honored through ceremony. */
|
|
50
|
+
export declare const ceremonyBoundaryGuard: ProtocolGuard;
|
|
51
|
+
/** Only follow OCAP®-compliant relations; edges with no mapped relation are open. */
|
|
52
|
+
export declare const ocapComplianceGuard: ProtocolGuard;
|
|
53
|
+
/**
|
|
54
|
+
* The avoidance protocol. A relation that carries a `context` is traversable
|
|
55
|
+
* only when (a) its `active_context` matches the runtime ceremony state and
|
|
56
|
+
* (b) the traversing identity is among `authorized_kin`. On failure it does
|
|
57
|
+
* not block silently — it escalates to `authorized_by` (or a qualified
|
|
58
|
+
* custodian). Relations with no declared context are open.
|
|
59
|
+
*/
|
|
60
|
+
export declare const avoidanceProtocolGuard: ProtocolGuard;
|
|
61
|
+
/**
|
|
62
|
+
* Evaluate a stack of guards against one edge crossing. The first guard that
|
|
63
|
+
* blocks wins; if every guard allows, the crossing is permitted.
|
|
64
|
+
*/
|
|
65
|
+
export declare function evaluateGuards(guards: ProtocolGuard[], edge: RelationalEdge, relation: Relation | undefined, context: TraversalContext): {
|
|
66
|
+
decision: GuardDecision;
|
|
67
|
+
guard?: string;
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=guards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../src/guards.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAG9E,iFAAiF;AACjF,MAAM,WAAW,gBAAgB;IAC/B,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wFAAwF;IACxF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,+DAA+D;AAC/D,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CACN,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,OAAO,EAAE,gBAAgB,GACxB,aAAa,CAAC;CAClB;AAED,oEAAoE;AACpE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID,iEAAiE;AACjE,eAAO,MAAM,qBAAqB,EAAE,aAUnC,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,mBAAmB,EAAE,aAajC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,EAAE,aA4BpC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,aAAa,EAAE,EACvB,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,OAAO,EAAE,gBAAgB,GACxB;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAM7C"}
|
package/dist/guards.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.avoidanceProtocolGuard = exports.ocapComplianceGuard = exports.ceremonyBoundaryGuard = void 0;
|
|
4
|
+
exports.evaluateGuards = evaluateGuards;
|
|
5
|
+
const ontology_core_1 = require("@medicine-wheel/ontology-core");
|
|
6
|
+
// ── Built-in guards ─────────────────────────────────────────────────────────
|
|
7
|
+
/** Stop at edges that have not been honored through ceremony. */
|
|
8
|
+
exports.ceremonyBoundaryGuard = {
|
|
9
|
+
name: 'ceremony-boundary',
|
|
10
|
+
evaluate(edge) {
|
|
11
|
+
if (edge.ceremony_honored)
|
|
12
|
+
return { allowed: true };
|
|
13
|
+
return {
|
|
14
|
+
allowed: false,
|
|
15
|
+
reason: 'Edge has not been honored through ceremony',
|
|
16
|
+
escalateTo: 'fire_keeper',
|
|
17
|
+
};
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
/** Only follow OCAP®-compliant relations; edges with no mapped relation are open. */
|
|
21
|
+
exports.ocapComplianceGuard = {
|
|
22
|
+
name: 'ocap-compliance',
|
|
23
|
+
evaluate(_edge, relation) {
|
|
24
|
+
if (!relation)
|
|
25
|
+
return { allowed: true };
|
|
26
|
+
if (relation.ocap && (0, ontology_core_1.checkOcapCompliance)(relation.ocap).compliant) {
|
|
27
|
+
return { allowed: true };
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
allowed: false,
|
|
31
|
+
reason: 'Relation is not OCAP®-compliant',
|
|
32
|
+
escalateTo: 'data_steward',
|
|
33
|
+
};
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* The avoidance protocol. A relation that carries a `context` is traversable
|
|
38
|
+
* only when (a) its `active_context` matches the runtime ceremony state and
|
|
39
|
+
* (b) the traversing identity is among `authorized_kin`. On failure it does
|
|
40
|
+
* not block silently — it escalates to `authorized_by` (or a qualified
|
|
41
|
+
* custodian). Relations with no declared context are open.
|
|
42
|
+
*/
|
|
43
|
+
exports.avoidanceProtocolGuard = {
|
|
44
|
+
name: 'avoidance-protocol',
|
|
45
|
+
evaluate(_edge, relation, context) {
|
|
46
|
+
const ctx = relation?.context;
|
|
47
|
+
if (!ctx)
|
|
48
|
+
return { allowed: true };
|
|
49
|
+
const custodian = ctx.authorized_by ?? 'qualified_custodian';
|
|
50
|
+
if (ctx.active_context && context.ceremonyState && ctx.active_context !== context.ceremonyState) {
|
|
51
|
+
return {
|
|
52
|
+
allowed: false,
|
|
53
|
+
reason: `Relation is valid in '${ctx.active_context}', not '${context.ceremonyState}'`,
|
|
54
|
+
escalateTo: custodian,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (ctx.authorized_kin && ctx.authorized_kin.length > 0) {
|
|
58
|
+
if (!context.identity || !ctx.authorized_kin.includes(context.identity)) {
|
|
59
|
+
return {
|
|
60
|
+
allowed: false,
|
|
61
|
+
reason: 'Traversing identity is not among authorized_kin',
|
|
62
|
+
escalateTo: custodian,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return { allowed: true };
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Evaluate a stack of guards against one edge crossing. The first guard that
|
|
71
|
+
* blocks wins; if every guard allows, the crossing is permitted.
|
|
72
|
+
*/
|
|
73
|
+
function evaluateGuards(guards, edge, relation, context) {
|
|
74
|
+
for (const guard of guards) {
|
|
75
|
+
const decision = guard.evaluate(edge, relation, context);
|
|
76
|
+
if (!decision.allowed)
|
|
77
|
+
return { decision, guard: guard.name };
|
|
78
|
+
}
|
|
79
|
+
return { decision: { allowed: true } };
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=guards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guards.js","sourceRoot":"","sources":["../src/guards.ts"],"names":[],"mappings":";;;AAkIA,wCAWC;AAhID,iEAAoE;AA6CpE,+EAA+E;AAE/E,iEAAiE;AACpD,QAAA,qBAAqB,GAAkB;IAClD,IAAI,EAAE,mBAAmB;IACzB,QAAQ,CAAC,IAAI;QACX,IAAI,IAAI,CAAC,gBAAgB;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACpD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,4CAA4C;YACpD,UAAU,EAAE,aAAa;SAC1B,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,qFAAqF;AACxE,QAAA,mBAAmB,GAAkB;IAChD,IAAI,EAAE,iBAAiB;IACvB,QAAQ,CAAC,KAAK,EAAE,QAAQ;QACtB,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACxC,IAAI,QAAQ,CAAC,IAAI,IAAI,IAAA,mCAAmB,EAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;YAClE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,iCAAiC;YACzC,UAAU,EAAE,cAAc;SAC3B,CAAC;IACJ,CAAC;CACF,CAAC;AAEF;;;;;;GAMG;AACU,QAAA,sBAAsB,GAAkB;IACnD,IAAI,EAAE,oBAAoB;IAC1B,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO;QAC/B,MAAM,GAAG,GAAG,QAAQ,EAAE,OAAO,CAAC;QAC9B,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAEnC,MAAM,SAAS,GAAG,GAAG,CAAC,aAAa,IAAI,qBAAqB,CAAC;QAE7D,IAAI,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,aAAa,IAAI,GAAG,CAAC,cAAc,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC;YAChG,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,yBAAyB,GAAG,CAAC,cAAc,WAAW,OAAO,CAAC,aAAa,GAAG;gBACtF,UAAU,EAAE,SAAS;aACtB,CAAC;QACJ,CAAC;QAED,IAAI,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxE,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,iDAAiD;oBACzD,UAAU,EAAE,SAAS;iBACtB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF,CAAC;AAEF;;;GAGG;AACH,SAAgB,cAAc,CAC5B,MAAuB,EACvB,IAAoB,EACpB,QAA8B,EAC9B,OAAyB;IAEzB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzD,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IAChE,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;AACzC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,8 +5,12 @@
|
|
|
5
5
|
* for the Medicine Wheel relational web.
|
|
6
6
|
*/
|
|
7
7
|
export type { NodeFilter, EdgeFilter, RelationFilter, SortField, SortOrder, QuerySort, QueryPagination, QueryOptions, QueryResult, TraversalDirection, TraversalOptions, TraversalPath, TraversalResult, AccountabilityReport, } from './types.js';
|
|
8
|
+
export type { TraversalContext, GuardDecision, ProtocolGuard, GuardEscalation, } from './guards.js';
|
|
9
|
+
export { ceremonyBoundaryGuard, ocapComplianceGuard, avoidanceProtocolGuard, evaluateGuards, } from './guards.js';
|
|
8
10
|
export { filterNodes, filterEdges, filterRelations, sortNodes, paginate, filterByRelation, relationCounts, filterByMinRelations, } from './query.js';
|
|
9
11
|
export { traverse, shortestPath, neighborhood, } from './traversal.js';
|
|
10
12
|
export { auditAccountability, isOcapCompliant, relationsNeedingAttention, } from './audit.js';
|
|
11
13
|
export { queryStewards, queryCeremonyProvenance, queryInquiries, queryKinshipHubs, queryKinshipRelations, queryDirectionAlignment, queryReciprocityFlows, queryInquiriesBySun, queryCeremonies, queryAllInquiries, formatReciprocityObservation, formatDirectionObservation, } from './cypher.js';
|
|
14
|
+
export type { RdfTriple, MigrationOptions, KinshipGraph } from './migrate.js';
|
|
15
|
+
export { rdfToKinshipGraph, kinshipGraphToCypher, kinshipGraphToJsonl, localName, } from './migrate.js';
|
|
12
16
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,UAAU,EACV,UAAU,EACV,cAAc,EACd,SAAS,EACT,SAAS,EACT,SAAS,EACT,eAAe,EACf,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,WAAW,EACX,WAAW,EACX,eAAe,EACf,SAAS,EACT,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,YAAY,GACb,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,4BAA4B,EAC5B,0BAA0B,GAC3B,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,UAAU,EACV,UAAU,EACV,cAAc,EACd,SAAS,EACT,SAAS,EACT,SAAS,EACT,eAAe,EACf,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,cAAc,GACf,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,WAAW,EACX,WAAW,EACX,eAAe,EACf,SAAS,EACT,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,YAAY,GACb,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,4BAA4B,EAC5B,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AAGrB,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,SAAS,GACV,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,7 +6,12 @@
|
|
|
6
6
|
* for the Medicine Wheel relational web.
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.formatDirectionObservation = exports.formatReciprocityObservation = exports.queryAllInquiries = exports.queryCeremonies = exports.queryInquiriesBySun = exports.queryReciprocityFlows = exports.queryDirectionAlignment = exports.queryKinshipRelations = exports.queryKinshipHubs = exports.queryInquiries = exports.queryCeremonyProvenance = exports.queryStewards = exports.relationsNeedingAttention = exports.isOcapCompliant = exports.auditAccountability = exports.neighborhood = exports.shortestPath = exports.traverse = exports.filterByMinRelations = exports.relationCounts = exports.filterByRelation = exports.paginate = exports.sortNodes = exports.filterRelations = exports.filterEdges = exports.filterNodes = void 0;
|
|
9
|
+
exports.localName = exports.kinshipGraphToJsonl = exports.kinshipGraphToCypher = exports.rdfToKinshipGraph = exports.formatDirectionObservation = exports.formatReciprocityObservation = exports.queryAllInquiries = exports.queryCeremonies = exports.queryInquiriesBySun = exports.queryReciprocityFlows = exports.queryDirectionAlignment = exports.queryKinshipRelations = exports.queryKinshipHubs = exports.queryInquiries = exports.queryCeremonyProvenance = exports.queryStewards = exports.relationsNeedingAttention = exports.isOcapCompliant = exports.auditAccountability = exports.neighborhood = exports.shortestPath = exports.traverse = exports.filterByMinRelations = exports.relationCounts = exports.filterByRelation = exports.paginate = exports.sortNodes = exports.filterRelations = exports.filterEdges = exports.filterNodes = exports.evaluateGuards = exports.avoidanceProtocolGuard = exports.ocapComplianceGuard = exports.ceremonyBoundaryGuard = void 0;
|
|
10
|
+
var guards_js_1 = require("./guards.js");
|
|
11
|
+
Object.defineProperty(exports, "ceremonyBoundaryGuard", { enumerable: true, get: function () { return guards_js_1.ceremonyBoundaryGuard; } });
|
|
12
|
+
Object.defineProperty(exports, "ocapComplianceGuard", { enumerable: true, get: function () { return guards_js_1.ocapComplianceGuard; } });
|
|
13
|
+
Object.defineProperty(exports, "avoidanceProtocolGuard", { enumerable: true, get: function () { return guards_js_1.avoidanceProtocolGuard; } });
|
|
14
|
+
Object.defineProperty(exports, "evaluateGuards", { enumerable: true, get: function () { return guards_js_1.evaluateGuards; } });
|
|
10
15
|
// Query builder
|
|
11
16
|
var query_js_1 = require("./query.js");
|
|
12
17
|
Object.defineProperty(exports, "filterNodes", { enumerable: true, get: function () { return query_js_1.filterNodes; } });
|
|
@@ -41,4 +46,9 @@ Object.defineProperty(exports, "queryCeremonies", { enumerable: true, get: funct
|
|
|
41
46
|
Object.defineProperty(exports, "queryAllInquiries", { enumerable: true, get: function () { return cypher_js_1.queryAllInquiries; } });
|
|
42
47
|
Object.defineProperty(exports, "formatReciprocityObservation", { enumerable: true, get: function () { return cypher_js_1.formatReciprocityObservation; } });
|
|
43
48
|
Object.defineProperty(exports, "formatDirectionObservation", { enumerable: true, get: function () { return cypher_js_1.formatDirectionObservation; } });
|
|
49
|
+
var migrate_js_1 = require("./migrate.js");
|
|
50
|
+
Object.defineProperty(exports, "rdfToKinshipGraph", { enumerable: true, get: function () { return migrate_js_1.rdfToKinshipGraph; } });
|
|
51
|
+
Object.defineProperty(exports, "kinshipGraphToCypher", { enumerable: true, get: function () { return migrate_js_1.kinshipGraphToCypher; } });
|
|
52
|
+
Object.defineProperty(exports, "kinshipGraphToJsonl", { enumerable: true, get: function () { return migrate_js_1.kinshipGraphToJsonl; } });
|
|
53
|
+
Object.defineProperty(exports, "localName", { enumerable: true, get: function () { return migrate_js_1.localName; } });
|
|
44
54
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AA2BH,yCAKqB;AAJnB,kHAAA,qBAAqB,OAAA;AACrB,gHAAA,mBAAmB,OAAA;AACnB,mHAAA,sBAAsB,OAAA;AACtB,2GAAA,cAAc,OAAA;AAGhB,gBAAgB;AAChB,uCASoB;AARlB,uGAAA,WAAW,OAAA;AACX,uGAAA,WAAW,OAAA;AACX,2GAAA,eAAe,OAAA;AACf,qGAAA,SAAS,OAAA;AACT,oGAAA,QAAQ,OAAA;AACR,4GAAA,gBAAgB,OAAA;AAChB,0GAAA,cAAc,OAAA;AACd,gHAAA,oBAAoB,OAAA;AAGtB,YAAY;AACZ,+CAIwB;AAHtB,wGAAA,QAAQ,OAAA;AACR,4GAAA,YAAY,OAAA;AACZ,4GAAA,YAAY,OAAA;AAGd,QAAQ;AACR,uCAIoB;AAHlB,+GAAA,mBAAmB,OAAA;AACnB,2GAAA,eAAe,OAAA;AACf,qHAAA,yBAAyB,OAAA;AAG3B,2DAA2D;AAC3D,yCAaqB;AAZnB,0GAAA,aAAa,OAAA;AACb,oHAAA,uBAAuB,OAAA;AACvB,2GAAA,cAAc,OAAA;AACd,6GAAA,gBAAgB,OAAA;AAChB,kHAAA,qBAAqB,OAAA;AACrB,oHAAA,uBAAuB,OAAA;AACvB,kHAAA,qBAAqB,OAAA;AACrB,gHAAA,mBAAmB,OAAA;AACnB,4GAAA,eAAe,OAAA;AACf,8GAAA,iBAAiB,OAAA;AACjB,yHAAA,4BAA4B,OAAA;AAC5B,uHAAA,0BAA0B,OAAA;AAK5B,2CAKsB;AAJpB,+GAAA,iBAAiB,OAAA;AACjB,kHAAA,oBAAoB,OAAA;AACpB,iHAAA,mBAAmB,OAAA;AACnB,uGAAA,SAAS,OAAA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @medicine-wheel/relational-query — RDF → Flat Kinship-Graph Migration
|
|
3
|
+
*
|
|
4
|
+
* Ingests RDF triples and emits a flat kinship graph (co-equal nodes + named,
|
|
5
|
+
* context-bound relations). The reconciliation move: `rdfs:subClassOf` and
|
|
6
|
+
* `rdf:type` — the axes that encode taxonomic subordination — are mapped onto
|
|
7
|
+
* a NAMED kinship edge (`co-emerges-with` by default), never re-introduced as
|
|
8
|
+
* a class hierarchy. Source provenance is carried into each relation's
|
|
9
|
+
* `context.authorized_by`.
|
|
10
|
+
*/
|
|
11
|
+
import type { Relation, RelationalNode, KinshipEdgeName } from '@medicine-wheel/ontology-core';
|
|
12
|
+
/** A single RDF statement (subject–predicate–object), IRIs or prefixed names. */
|
|
13
|
+
export interface RdfTriple {
|
|
14
|
+
subject: string;
|
|
15
|
+
predicate: string;
|
|
16
|
+
object: string;
|
|
17
|
+
}
|
|
18
|
+
export interface MigrationOptions {
|
|
19
|
+
/** Provenance label written into each relation's context.authorized_by. */
|
|
20
|
+
source?: string;
|
|
21
|
+
/** Predicate (IRI or prefixed) → kinship edge name overrides. */
|
|
22
|
+
predicateMap?: Record<string, KinshipEdgeName>;
|
|
23
|
+
/** Predicates whose (literal) objects fold into node.name. */
|
|
24
|
+
labelPredicates?: string[];
|
|
25
|
+
/** Decide whether an RDF term is a resource (→ node) vs a literal (→ attribute). */
|
|
26
|
+
isResource?: (term: string) => boolean;
|
|
27
|
+
/** ISO timestamp for created/updated fields (defaults to now). */
|
|
28
|
+
now?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface KinshipGraph {
|
|
31
|
+
nodes: RelationalNode[];
|
|
32
|
+
relations: Relation[];
|
|
33
|
+
}
|
|
34
|
+
/** The local name of an IRI or prefixed term (after the last #, / or :). */
|
|
35
|
+
export declare function localName(term: string): string;
|
|
36
|
+
/** Migrate RDF triples into a flat kinship graph. */
|
|
37
|
+
export declare function rdfToKinshipGraph(triples: RdfTriple[], options?: MigrationOptions): KinshipGraph;
|
|
38
|
+
/** Emit MERGE statements for a kinship graph (KuzuDB / openCypher). */
|
|
39
|
+
export declare function kinshipGraphToCypher(graph: KinshipGraph): string[];
|
|
40
|
+
/** Emit newline-delimited JSON (one node/relation per line) for the JSONL store. */
|
|
41
|
+
export declare function kinshipGraphToJsonl(graph: KinshipGraph): string;
|
|
42
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EACV,QAAQ,EACR,cAAc,EACd,eAAe,EAChB,MAAM,+BAA+B,CAAC;AAGvC,iFAAiF;AACjF,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC/C,8DAA8D;IAC9D,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,oFAAoF;IACpF,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,kEAAkE;IAClE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB;AAyBD,4EAA4E;AAC5E,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAU9C;AAED,qDAAqD;AACrD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,SAAS,EAAE,EACpB,OAAO,GAAE,gBAAqB,GAC7B,YAAY,CAyEd;AAMD,uEAAuE;AACvE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,EAAE,CAelE;AAED,oFAAoF;AACpF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAK/D"}
|
package/dist/migrate.js
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.localName = localName;
|
|
4
|
+
exports.rdfToKinshipGraph = rdfToKinshipGraph;
|
|
5
|
+
exports.kinshipGraphToCypher = kinshipGraphToCypher;
|
|
6
|
+
exports.kinshipGraphToJsonl = kinshipGraphToJsonl;
|
|
7
|
+
const ontology_core_1 = require("@medicine-wheel/ontology-core");
|
|
8
|
+
/**
|
|
9
|
+
* The subordinating axes are flattened to co-emergence: an instance/subclass
|
|
10
|
+
* stands beside its kind rather than beneath it.
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_PREDICATE_MAP = {
|
|
13
|
+
a: 'co-emerges-with',
|
|
14
|
+
'rdf:type': 'co-emerges-with',
|
|
15
|
+
'http://www.w3.org/1999/02/22-rdf-syntax-ns#type': 'co-emerges-with',
|
|
16
|
+
'rdfs:subClassOf': 'co-emerges-with',
|
|
17
|
+
'http://www.w3.org/2000/01/rdf-schema#subClassOf': 'co-emerges-with',
|
|
18
|
+
};
|
|
19
|
+
const DEFAULT_LABEL_PREDICATES = [
|
|
20
|
+
'rdfs:label',
|
|
21
|
+
'http://www.w3.org/2000/01/rdf-schema#label',
|
|
22
|
+
];
|
|
23
|
+
function defaultIsResource(term) {
|
|
24
|
+
if (/^https?:\/\//.test(term))
|
|
25
|
+
return true;
|
|
26
|
+
// A prefixed name like `mw:Direction` or `ex:river` (not a free-text literal).
|
|
27
|
+
return /^[A-Za-z][\w-]*:[\w./#-]+$/.test(term);
|
|
28
|
+
}
|
|
29
|
+
/** The local name of an IRI or prefixed term (after the last #, / or :). */
|
|
30
|
+
function localName(term) {
|
|
31
|
+
const hash = term.lastIndexOf('#');
|
|
32
|
+
if (hash >= 0)
|
|
33
|
+
return term.slice(hash + 1);
|
|
34
|
+
if (/^https?:\/\//.test(term)) {
|
|
35
|
+
const slash = term.lastIndexOf('/');
|
|
36
|
+
if (slash >= 0)
|
|
37
|
+
return term.slice(slash + 1);
|
|
38
|
+
}
|
|
39
|
+
const colon = term.lastIndexOf(':');
|
|
40
|
+
if (colon >= 0)
|
|
41
|
+
return term.slice(colon + 1);
|
|
42
|
+
return term;
|
|
43
|
+
}
|
|
44
|
+
/** Migrate RDF triples into a flat kinship graph. */
|
|
45
|
+
function rdfToKinshipGraph(triples, options = {}) {
|
|
46
|
+
const now = options.now ?? new Date().toISOString();
|
|
47
|
+
const source = options.source;
|
|
48
|
+
const predicateMap = { ...DEFAULT_PREDICATE_MAP, ...(options.predicateMap ?? {}) };
|
|
49
|
+
const labelPredicates = new Set(options.labelPredicates ?? DEFAULT_LABEL_PREDICATES);
|
|
50
|
+
const isResource = options.isResource ?? defaultIsResource;
|
|
51
|
+
const nodeMap = new Map();
|
|
52
|
+
const relations = [];
|
|
53
|
+
let relSeq = 0;
|
|
54
|
+
const ensureNode = (id) => {
|
|
55
|
+
let n = nodeMap.get(id);
|
|
56
|
+
if (!n) {
|
|
57
|
+
// Every being lands on the same flat ontological layer.
|
|
58
|
+
n = { id, name: id, type: 'knowledge', metadata: {}, created_at: now, updated_at: now };
|
|
59
|
+
nodeMap.set(id, n);
|
|
60
|
+
}
|
|
61
|
+
return n;
|
|
62
|
+
};
|
|
63
|
+
for (const t of triples) {
|
|
64
|
+
const subject = ensureNode(t.subject);
|
|
65
|
+
// Literal object → an attribute on the subject node.
|
|
66
|
+
if (!isResource(t.object)) {
|
|
67
|
+
if (labelPredicates.has(t.predicate)) {
|
|
68
|
+
subject.name = t.object;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
subject.metadata[localName(t.predicate)] = t.object;
|
|
72
|
+
}
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
// Resource object → a named kinship relation.
|
|
76
|
+
ensureNode(t.object);
|
|
77
|
+
const local = localName(t.predicate);
|
|
78
|
+
const kinship_type = predicateMap[t.predicate] ?? ((0, ontology_core_1.isKinshipEdgeName)(local) ? local : undefined);
|
|
79
|
+
relations.push({
|
|
80
|
+
id: `rel-${relSeq++}`,
|
|
81
|
+
from_id: t.subject,
|
|
82
|
+
to_id: t.object,
|
|
83
|
+
relationship_type: local,
|
|
84
|
+
...(kinship_type ? { kinship_type } : {}),
|
|
85
|
+
strength: 1,
|
|
86
|
+
obligations: [],
|
|
87
|
+
// Migrated relations are unverified until a steward honors them — an
|
|
88
|
+
// honest default rather than assumed compliance/consent.
|
|
89
|
+
ocap: {
|
|
90
|
+
ownership: source ?? 'unknown',
|
|
91
|
+
control: source ?? 'unknown',
|
|
92
|
+
access: 'community',
|
|
93
|
+
possession: 'community-server',
|
|
94
|
+
compliant: false,
|
|
95
|
+
steward: source,
|
|
96
|
+
},
|
|
97
|
+
accountability: {
|
|
98
|
+
respect: 0,
|
|
99
|
+
reciprocity: 0,
|
|
100
|
+
responsibility: 0,
|
|
101
|
+
wilson_alignment: 0,
|
|
102
|
+
relations_honored: [],
|
|
103
|
+
},
|
|
104
|
+
...(source ? { context: { authorized_by: source } } : {}),
|
|
105
|
+
metadata: { source_predicate: t.predicate },
|
|
106
|
+
created_at: now,
|
|
107
|
+
updated_at: now,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return { nodes: [...nodeMap.values()], relations };
|
|
111
|
+
}
|
|
112
|
+
function esc(value) {
|
|
113
|
+
return value.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
|
|
114
|
+
}
|
|
115
|
+
/** Emit MERGE statements for a kinship graph (KuzuDB / openCypher). */
|
|
116
|
+
function kinshipGraphToCypher(graph) {
|
|
117
|
+
const stmts = [];
|
|
118
|
+
for (const n of graph.nodes) {
|
|
119
|
+
stmts.push(`MERGE (n {id: '${esc(n.id)}'}) SET n.name = '${esc(n.name)}', n.type = '${esc(n.type)}'`);
|
|
120
|
+
}
|
|
121
|
+
for (const r of graph.relations) {
|
|
122
|
+
const type = r.kinship_type ?? r.relationship_type;
|
|
123
|
+
stmts.push(`MATCH (a {id: '${esc(r.from_id)}'}), (b {id: '${esc(r.to_id)}'}) ` +
|
|
124
|
+
`MERGE (a)-[:KINSHIP {type: '${esc(type)}'}]->(b)`);
|
|
125
|
+
}
|
|
126
|
+
return stmts;
|
|
127
|
+
}
|
|
128
|
+
/** Emit newline-delimited JSON (one node/relation per line) for the JSONL store. */
|
|
129
|
+
function kinshipGraphToJsonl(graph) {
|
|
130
|
+
const lines = [];
|
|
131
|
+
for (const n of graph.nodes)
|
|
132
|
+
lines.push(JSON.stringify({ kind: 'node', ...n }));
|
|
133
|
+
for (const r of graph.relations)
|
|
134
|
+
lines.push(JSON.stringify({ kind: 'relation', ...r }));
|
|
135
|
+
return lines.join('\n');
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"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"}
|
package/dist/traversal.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traversal.d.ts","sourceRoot":"","sources":["../src/traversal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"traversal.d.ts","sourceRoot":"","sources":["../src/traversal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC9F,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,eAAe,EAChB,MAAM,YAAY,CAAC;AAmCpB,mDAAmD;AACnD,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,cAAc,EAAE,EACvB,KAAK,EAAE,cAAc,EAAE,EACvB,SAAS,EAAE,QAAQ,EAAE,EACrB,IAAI,GAAE,OAAO,CAAC,gBAAgB,CAAM,GACnC,eAAe,CA8GjB;AAED,2CAA2C;AAC3C,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,cAAc,EAAE,EACvB,KAAK,EAAE,cAAc,EAAE,GACtB,aAAa,GAAG,IAAI,CA4CtB;AAED,6CAA6C;AAC7C,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,cAAc,EAAE,EACvB,KAAK,EAAE,cAAc,EAAE,EACvB,QAAQ,GAAE,MAAU,GACnB,cAAc,EAAE,CAMlB"}
|
package/dist/traversal.js
CHANGED
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.traverse = traverse;
|
|
4
4
|
exports.shortestPath = shortestPath;
|
|
5
5
|
exports.neighborhood = neighborhood;
|
|
6
|
-
const ontology_core_1 = require("@medicine-wheel/ontology-core");
|
|
7
6
|
const query_js_1 = require("./query.js");
|
|
7
|
+
const guards_js_1 = require("./guards.js");
|
|
8
8
|
const DEFAULT_OPTIONS = {
|
|
9
9
|
maxDepth: 3,
|
|
10
10
|
direction: 'both',
|
|
@@ -36,17 +36,23 @@ function traverse(rootId, nodes, edges, relations, opts = {}) {
|
|
|
36
36
|
if (options.edgeFilter) {
|
|
37
37
|
filteredEdges = (0, query_js_1.filterEdges)(edges, options.edgeFilter);
|
|
38
38
|
}
|
|
39
|
-
//
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
39
|
+
// Assemble the protocol-guard stack. The former `respectCeremonyBoundaries`
|
|
40
|
+
// and `ocapOnly` booleans are now built-in guards, evaluated per crossing
|
|
41
|
+
// alongside any caller-supplied guards.
|
|
42
|
+
const guards = [];
|
|
43
|
+
if (options.respectCeremonyBoundaries)
|
|
44
|
+
guards.push(guards_js_1.ceremonyBoundaryGuard);
|
|
45
|
+
if (options.ocapOnly)
|
|
46
|
+
guards.push(guards_js_1.ocapComplianceGuard);
|
|
47
|
+
if (options.guards)
|
|
48
|
+
guards.push(...options.guards);
|
|
49
|
+
const guardContext = options.context ?? {};
|
|
50
|
+
// Map an edge (by endpoint pair, in either direction) to its first-class
|
|
51
|
+
// Relation, so guards can read the relation's OCAP flags and context.
|
|
52
|
+
const relationLookup = new Map();
|
|
53
|
+
for (const r of relations) {
|
|
54
|
+
relationLookup.set(`${r.from_id}|${r.to_id}`, r);
|
|
55
|
+
relationLookup.set(`${r.to_id}|${r.from_id}`, r);
|
|
50
56
|
}
|
|
51
57
|
// Build adjacency
|
|
52
58
|
const adj = buildAdjacency(filteredEdges, options.direction);
|
|
@@ -58,6 +64,7 @@ function traverse(rootId, nodes, edges, relations, opts = {}) {
|
|
|
58
64
|
}
|
|
59
65
|
// BFS traversal
|
|
60
66
|
const paths = [];
|
|
67
|
+
const escalations = [];
|
|
61
68
|
const visited = new Set([rootId]);
|
|
62
69
|
let maxDepthReached = false;
|
|
63
70
|
const queue = [{ nodeId: rootId, path: [rootNode], edgePath: [], depth: 0 }];
|
|
@@ -71,9 +78,21 @@ function traverse(rootId, nodes, edges, relations, opts = {}) {
|
|
|
71
78
|
for (const { nodeId, edge } of neighbors) {
|
|
72
79
|
if (visited.has(nodeId))
|
|
73
80
|
continue;
|
|
74
|
-
//
|
|
75
|
-
|
|
76
|
-
|
|
81
|
+
// Protocol guards: evaluate before crossing the edge. A blocked crossing
|
|
82
|
+
// is recorded as an escalation (delegation), not a silent skip.
|
|
83
|
+
if (guards.length > 0) {
|
|
84
|
+
const relation = relationLookup.get(`${edge.from_id}|${edge.to_id}`);
|
|
85
|
+
const { decision, guard } = (0, guards_js_1.evaluateGuards)(guards, edge, relation, guardContext);
|
|
86
|
+
if (!decision.allowed) {
|
|
87
|
+
escalations.push({
|
|
88
|
+
fromId: current.nodeId,
|
|
89
|
+
toId: nodeId,
|
|
90
|
+
guard: guard ?? 'unknown',
|
|
91
|
+
reason: decision.reason,
|
|
92
|
+
escalateTo: decision.escalateTo,
|
|
93
|
+
});
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
77
96
|
}
|
|
78
97
|
const node = nodeMap.get(nodeId);
|
|
79
98
|
if (!node)
|
|
@@ -100,7 +119,7 @@ function traverse(rootId, nodes, edges, relations, opts = {}) {
|
|
|
100
119
|
});
|
|
101
120
|
}
|
|
102
121
|
}
|
|
103
|
-
return { root: rootNode, paths, visitedNodes: visited, maxDepthReached };
|
|
122
|
+
return { root: rootNode, paths, visitedNodes: visited, maxDepthReached, escalations };
|
|
104
123
|
}
|
|
105
124
|
/** Find shortest path between two nodes */
|
|
106
125
|
function shortestPath(fromId, toId, nodes, edges) {
|
package/dist/traversal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traversal.js","sourceRoot":"","sources":["../src/traversal.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"traversal.js","sourceRoot":"","sources":["../src/traversal.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* with Indigenous protocol awareness.
|
|
6
6
|
*/
|
|
7
7
|
import type { DirectionName, NodeType, RelationalNode, RelationalEdge } from '@medicine-wheel/ontology-core';
|
|
8
|
+
import type { ProtocolGuard, TraversalContext, GuardEscalation } from './guards.js';
|
|
8
9
|
export interface NodeFilter {
|
|
9
10
|
type?: NodeType | NodeType[];
|
|
10
11
|
direction?: DirectionName | DirectionName[];
|
|
@@ -58,10 +59,14 @@ export interface TraversalOptions {
|
|
|
58
59
|
direction: TraversalDirection;
|
|
59
60
|
edgeFilter?: EdgeFilter;
|
|
60
61
|
nodeFilter?: NodeFilter;
|
|
61
|
-
/** Stop traversal at nodes without ceremony-honored edges */
|
|
62
|
+
/** Stop traversal at nodes without ceremony-honored edges (built-in guard) */
|
|
62
63
|
respectCeremonyBoundaries?: boolean;
|
|
63
|
-
/** Only follow OCAP-compliant relations */
|
|
64
|
+
/** Only follow OCAP-compliant relations (built-in guard) */
|
|
64
65
|
ocapOnly?: boolean;
|
|
66
|
+
/** Additional protocol guards evaluated before each edge crossing */
|
|
67
|
+
guards?: ProtocolGuard[];
|
|
68
|
+
/** Runtime context (identity, ceremony state) supplied to the guards */
|
|
69
|
+
context?: TraversalContext;
|
|
65
70
|
}
|
|
66
71
|
export interface TraversalPath {
|
|
67
72
|
nodes: RelationalNode[];
|
|
@@ -73,6 +78,8 @@ export interface TraversalResult {
|
|
|
73
78
|
paths: TraversalPath[];
|
|
74
79
|
visitedNodes: Set<string>;
|
|
75
80
|
maxDepthReached: boolean;
|
|
81
|
+
/** Edge crossings a protocol guard refused, surfaced for delegation. */
|
|
82
|
+
escalations: GuardEscalation[];
|
|
76
83
|
}
|
|
77
84
|
export interface AccountabilityReport {
|
|
78
85
|
totalRelations: number;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EACV,aAAa,EACb,QAAQ,EAER,cAAc,EACd,cAAc,EAEf,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@medicine-wheel/relational-query",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.4",
|
|
4
4
|
"description": "Query builder for relational webs with Indigenous protocol awareness — traversal, accountability, OCAP® compliance",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"author": "jgwill",
|
|
34
34
|
"license": "MIT",
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@medicine-wheel/ontology-core": "^0.4.
|
|
36
|
+
"@medicine-wheel/ontology-core": "^0.4.4"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"typescript": "^5.7.0"
|