@x12i/memorix-scoper 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -0
- package/dist/coordinator.d.ts +12 -0
- package/dist/coordinator.d.ts.map +1 -0
- package/dist/coordinator.js +351 -0
- package/dist/coordinator.js.map +1 -0
- package/dist/create-scoper.d.ts +77 -0
- package/dist/create-scoper.d.ts.map +1 -0
- package/dist/create-scoper.js +58 -0
- package/dist/create-scoper.js.map +1 -0
- package/dist/epistemic.d.ts +4 -0
- package/dist/epistemic.d.ts.map +1 -0
- package/dist/epistemic.js +34 -0
- package/dist/epistemic.js.map +1 -0
- package/dist/guard.d.ts +3 -0
- package/dist/guard.d.ts.map +1 -0
- package/dist/guard.js +15 -0
- package/dist/guard.js.map +1 -0
- package/dist/guard.test.d.ts +2 -0
- package/dist/guard.test.d.ts.map +1 -0
- package/dist/guard.test.js +13 -0
- package/dist/guard.test.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server.d.ts +58 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +166 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/profiles.d.ts +2 -0
- package/dist/profiles.d.ts.map +1 -0
- package/dist/profiles.js +2 -0
- package/dist/profiles.js.map +1 -0
- package/dist/reasoner/ai-dispatcher.d.ts +24 -0
- package/dist/reasoner/ai-dispatcher.d.ts.map +1 -0
- package/dist/reasoner/ai-dispatcher.js +106 -0
- package/dist/reasoner/ai-dispatcher.js.map +1 -0
- package/dist/reasoner/ai-dispatcher.test.d.ts +2 -0
- package/dist/reasoner/ai-dispatcher.test.d.ts.map +1 -0
- package/dist/reasoner/ai-dispatcher.test.js +70 -0
- package/dist/reasoner/ai-dispatcher.test.js.map +1 -0
- package/dist/reasoner/index.d.ts +4 -0
- package/dist/reasoner/index.d.ts.map +1 -0
- package/dist/reasoner/index.js +3 -0
- package/dist/reasoner/index.js.map +1 -0
- package/dist/reasoner/scripted.d.ts +14 -0
- package/dist/reasoner/scripted.d.ts.map +1 -0
- package/dist/reasoner/scripted.js +22 -0
- package/dist/reasoner/scripted.js.map +1 -0
- package/dist/reasoner/types.d.ts +17 -0
- package/dist/reasoner/types.d.ts.map +1 -0
- package/dist/reasoner/types.js +2 -0
- package/dist/reasoner/types.js.map +1 -0
- package/dist/recursion.d.ts +4 -0
- package/dist/recursion.d.ts.map +1 -0
- package/dist/recursion.js +17 -0
- package/dist/recursion.js.map +1 -0
- package/dist/validation.d.ts +11 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +64 -0
- package/dist/validation.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recursion.d.ts","sourceRoot":"","sources":["../src/recursion.ts"],"names":[],"mappings":"AAKA,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,IAAI,CAW3D;AAED,kBAAkB;AAClB,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ScoperError } from "@x12i/memorix-scoper-contracts";
|
|
2
|
+
/** In-process recursion guard keyed by traceId. */
|
|
3
|
+
const activeTraces = new Set();
|
|
4
|
+
export function enterScopeTrace(traceId) {
|
|
5
|
+
if (activeTraces.has(traceId)) {
|
|
6
|
+
throw new ScoperError("RECURSIVE_SCOPE_CALL", `recursive scope() call detected for traceId=${traceId}`);
|
|
7
|
+
}
|
|
8
|
+
activeTraces.add(traceId);
|
|
9
|
+
return () => {
|
|
10
|
+
activeTraces.delete(traceId);
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/** Test helper */
|
|
14
|
+
export function resetScopeTraces() {
|
|
15
|
+
activeTraces.clear();
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=recursion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recursion.js","sourceRoot":"","sources":["../src/recursion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,mDAAmD;AACnD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;AAEvC,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,WAAW,CACnB,sBAAsB,EACtB,+CAA+C,OAAO,EAAE,CACzD,CAAC;IACJ,CAAC;IACD,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC1B,OAAO,GAAG,EAAE;QACV,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC,CAAC;AACJ,CAAC;AAED,kBAAkB;AAClB,MAAM,UAAU,gBAAgB;IAC9B,YAAY,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type CatalogEntry, type RetrievalPlan, type ScoperProfile, type EpistemicClass, type EvidenceItem, type EvidenceBundle } from "@x12i/memorix-scoper-contracts";
|
|
2
|
+
export declare function validatePlanAgainstCatalog(plan: RetrievalPlan, catalogEntries: CatalogEntry[], profile: ScoperProfile): void;
|
|
3
|
+
/**
|
|
4
|
+
* Epistemic validators — POLICY_CANDIDATE must not be treated as REACHABLE.
|
|
5
|
+
*/
|
|
6
|
+
export declare function validateEpistemicConsistency(items: EvidenceItem[]): {
|
|
7
|
+
items: EvidenceItem[];
|
|
8
|
+
warnings: EvidenceBundle["warnings"];
|
|
9
|
+
};
|
|
10
|
+
export declare function assertNotPromotingPolicyToReachable(from: EpistemicClass, to: EpistemicClass): void;
|
|
11
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,cAAc,EACpB,MAAM,gCAAgC,CAAC;AAExC,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,aAAa,EACnB,cAAc,EAAE,YAAY,EAAE,EAC9B,OAAO,EAAE,aAAa,GACrB,IAAI,CA0BN;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG;IACnE,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;CACtC,CAoCA;AAED,wBAAgB,mCAAmC,CACjD,IAAI,EAAE,cAAc,EACpB,EAAE,EAAE,cAAc,GACjB,IAAI,CAON"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { ScoperError, } from "@x12i/memorix-scoper-contracts";
|
|
2
|
+
export function validatePlanAgainstCatalog(plan, catalogEntries, profile) {
|
|
3
|
+
const byId = new Map(catalogEntries.map((e) => [e.id, e]));
|
|
4
|
+
for (const step of plan.steps) {
|
|
5
|
+
if (!profile.allowedCapabilities.includes(step.capability)) {
|
|
6
|
+
throw new ScoperError("CATALOG_REJECTED", `capability ${step.capability} not allowed by profile ${profile.id}`);
|
|
7
|
+
}
|
|
8
|
+
const entry = byId.get(step.catalogEntryId);
|
|
9
|
+
if (!entry) {
|
|
10
|
+
throw new ScoperError("CATALOG_REJECTED", `unknown catalogEntryId: ${step.catalogEntryId}`);
|
|
11
|
+
}
|
|
12
|
+
if (entry.capability !== step.capability) {
|
|
13
|
+
throw new ScoperError("CATALOG_REJECTED", `capability mismatch for ${step.catalogEntryId}: plan=${step.capability} catalog=${entry.capability}`);
|
|
14
|
+
}
|
|
15
|
+
if (!entry.enabled) {
|
|
16
|
+
throw new ScoperError("CATALOG_REJECTED", `catalog entry disabled: ${step.catalogEntryId}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Epistemic validators — POLICY_CANDIDATE must not be treated as REACHABLE.
|
|
22
|
+
*/
|
|
23
|
+
export function validateEpistemicConsistency(items) {
|
|
24
|
+
const warnings = [];
|
|
25
|
+
const next = items.map((item) => {
|
|
26
|
+
if (item.epistemic === "POLICY_CANDIDATE" && item.tags?.includes("reachable")) {
|
|
27
|
+
warnings.push({
|
|
28
|
+
code: "EPISTEMIC_DOWNGRADE",
|
|
29
|
+
message: "POLICY_CANDIDATE cannot be tagged reachable; downgrading tag",
|
|
30
|
+
details: { evidenceId: item.id },
|
|
31
|
+
});
|
|
32
|
+
return {
|
|
33
|
+
...item,
|
|
34
|
+
tags: item.tags.filter((t) => t !== "reachable"),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return item;
|
|
38
|
+
});
|
|
39
|
+
// Detect contradictory pairings in the same bundle
|
|
40
|
+
const bySubject = new Map();
|
|
41
|
+
for (const item of next) {
|
|
42
|
+
if (item.ref.kind === "subject") {
|
|
43
|
+
const key = `${item.ref.objectType}:${item.ref.recordId}`;
|
|
44
|
+
const list = bySubject.get(key) ?? [];
|
|
45
|
+
list.push(item.epistemic);
|
|
46
|
+
bySubject.set(key, list);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
for (const [key, classes] of bySubject) {
|
|
50
|
+
if (classes.includes("POLICY_CANDIDATE") && classes.includes("REACHABLE")) {
|
|
51
|
+
warnings.push({
|
|
52
|
+
code: "EPISTEMIC_CONFLICT",
|
|
53
|
+
message: `POLICY_CANDIDATE and REACHABLE both present for ${key} — REACHABLE requires observed path evidence`,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return { items: next, warnings };
|
|
58
|
+
}
|
|
59
|
+
export function assertNotPromotingPolicyToReachable(from, to) {
|
|
60
|
+
if (from === "POLICY_CANDIDATE" && to === "REACHABLE") {
|
|
61
|
+
throw new ScoperError("INVALID_REQUEST", "POLICY_CANDIDATE must not be promoted to REACHABLE without observed path evidence");
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@x12i/memorix-scoper",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "Memorix Scoper core — profiles, reasoner, coordinator",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./profiles": {
|
|
14
|
+
"types": "./dist/profiles.d.ts",
|
|
15
|
+
"import": "./dist/profiles.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"README.md"
|
|
21
|
+
],
|
|
22
|
+
"publishConfig": {
|
|
23
|
+
"access": "restricted",
|
|
24
|
+
"registry": "https://registry.npmjs.org/",
|
|
25
|
+
"tag": "dev"
|
|
26
|
+
},
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "tsc -p tsconfig.json",
|
|
29
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
30
|
+
"test": "vitest run"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@x12i/ai-dispatcher": "^1.3.0",
|
|
34
|
+
"@x12i/memorix-scoper-contracts": "^1.0.0",
|
|
35
|
+
"@x12i/memorix-scoper-profiles": "^1.0.0",
|
|
36
|
+
"@x12i/memorix-scoper-sdk": "^1.0.0",
|
|
37
|
+
"zod": "^3.25.67"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@x12i/memorix-scoper-testing": "workspace:*",
|
|
41
|
+
"typescript": "^5.8.3",
|
|
42
|
+
"vitest": "^3.2.4"
|
|
43
|
+
},
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=22"
|
|
46
|
+
},
|
|
47
|
+
"license": "MIT"
|
|
48
|
+
}
|