@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.
Files changed (62) hide show
  1. package/README.md +29 -0
  2. package/dist/coordinator.d.ts +12 -0
  3. package/dist/coordinator.d.ts.map +1 -0
  4. package/dist/coordinator.js +351 -0
  5. package/dist/coordinator.js.map +1 -0
  6. package/dist/create-scoper.d.ts +77 -0
  7. package/dist/create-scoper.d.ts.map +1 -0
  8. package/dist/create-scoper.js +58 -0
  9. package/dist/create-scoper.js.map +1 -0
  10. package/dist/epistemic.d.ts +4 -0
  11. package/dist/epistemic.d.ts.map +1 -0
  12. package/dist/epistemic.js +34 -0
  13. package/dist/epistemic.js.map +1 -0
  14. package/dist/guard.d.ts +3 -0
  15. package/dist/guard.d.ts.map +1 -0
  16. package/dist/guard.js +15 -0
  17. package/dist/guard.js.map +1 -0
  18. package/dist/guard.test.d.ts +2 -0
  19. package/dist/guard.test.d.ts.map +1 -0
  20. package/dist/guard.test.js +13 -0
  21. package/dist/guard.test.js.map +1 -0
  22. package/dist/index.d.ts +10 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +9 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/mcp-server.d.ts +58 -0
  27. package/dist/mcp-server.d.ts.map +1 -0
  28. package/dist/mcp-server.js +166 -0
  29. package/dist/mcp-server.js.map +1 -0
  30. package/dist/profiles.d.ts +2 -0
  31. package/dist/profiles.d.ts.map +1 -0
  32. package/dist/profiles.js +2 -0
  33. package/dist/profiles.js.map +1 -0
  34. package/dist/reasoner/ai-dispatcher.d.ts +24 -0
  35. package/dist/reasoner/ai-dispatcher.d.ts.map +1 -0
  36. package/dist/reasoner/ai-dispatcher.js +106 -0
  37. package/dist/reasoner/ai-dispatcher.js.map +1 -0
  38. package/dist/reasoner/ai-dispatcher.test.d.ts +2 -0
  39. package/dist/reasoner/ai-dispatcher.test.d.ts.map +1 -0
  40. package/dist/reasoner/ai-dispatcher.test.js +70 -0
  41. package/dist/reasoner/ai-dispatcher.test.js.map +1 -0
  42. package/dist/reasoner/index.d.ts +4 -0
  43. package/dist/reasoner/index.d.ts.map +1 -0
  44. package/dist/reasoner/index.js +3 -0
  45. package/dist/reasoner/index.js.map +1 -0
  46. package/dist/reasoner/scripted.d.ts +14 -0
  47. package/dist/reasoner/scripted.d.ts.map +1 -0
  48. package/dist/reasoner/scripted.js +22 -0
  49. package/dist/reasoner/scripted.js.map +1 -0
  50. package/dist/reasoner/types.d.ts +17 -0
  51. package/dist/reasoner/types.d.ts.map +1 -0
  52. package/dist/reasoner/types.js +2 -0
  53. package/dist/reasoner/types.js.map +1 -0
  54. package/dist/recursion.d.ts +4 -0
  55. package/dist/recursion.d.ts.map +1 -0
  56. package/dist/recursion.js +17 -0
  57. package/dist/recursion.js.map +1 -0
  58. package/dist/validation.d.ts +11 -0
  59. package/dist/validation.d.ts.map +1 -0
  60. package/dist/validation.js +64 -0
  61. package/dist/validation.js.map +1 -0
  62. package/package.json +48 -0
package/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # @x12i/memorix-scoper
2
+
3
+ Coordinator library: `scope()`, reasoners, profiles, and **ai-dispatcher MCP** (`createScoperMcpServer`).
4
+
5
+ ```ts
6
+ import { createScoper, ScriptedReasoner, createScoperMcpServer } from "@x12i/memorix-scoper";
7
+ import { createAiDispatcher } from "@x12i/ai-dispatcher";
8
+
9
+ const scoper = createScoper({ sdkConfig: { memorixBaseUrls: ["http://127.0.0.1:5100"] } });
10
+
11
+ const dispatcher = createAiDispatcher({
12
+ /* providers */,
13
+ mcp: {
14
+ servers: [
15
+ createScoperMcpServer({
16
+ scoper,
17
+ context: {
18
+ orgId: "sandbox1",
19
+ agentIds: ["opx"],
20
+ caller: "skill-process",
21
+ traceId: "…",
22
+ },
23
+ }),
24
+ ],
25
+ },
26
+ });
27
+ ```
28
+
29
+ Tools exposed to the model: `scoper__scope`, `scoper__subject_data`. Trusted org/agent/caller come **only** from `context` at create time — never from tool args.
@@ -0,0 +1,12 @@
1
+ import { type ScopeRequest, type TrustedExecutionContext, type EvidenceBundle, type ScoperBudgets, type ScoperProfile } from "@x12i/memorix-scoper-contracts";
2
+ import type { MemorixScoperClient } from "@x12i/memorix-scoper-sdk";
3
+ import type { ScoperReasoner } from "./reasoner/types.js";
4
+ export interface ScoperDependencies {
5
+ sdk: MemorixScoperClient;
6
+ reasoner: ScoperReasoner;
7
+ /** Host-enforced budget caps (request budgets clamped to these). */
8
+ hostBudgetCaps?: ScoperBudgets;
9
+ profiles?: Record<string, ScoperProfile>;
10
+ }
11
+ export declare function scope(request: ScopeRequest, context: TrustedExecutionContext, deps: ScoperDependencies): Promise<EvidenceBundle>;
12
+ //# sourceMappingURL=coordinator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../src/coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,KAAK,cAAc,EAGnB,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,mBAAmB,EAAiB,MAAM,0BAA0B,CAAC;AAEnF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAI1D,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,mBAAmB,CAAC;IACzB,QAAQ,EAAE,cAAc,CAAC;IACzB,oEAAoE;IACpE,cAAc,CAAC,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAC1C;AAoPD,wBAAsB,KAAK,CACzB,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,uBAAuB,EAChC,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,cAAc,CAAC,CAuJzB"}
@@ -0,0 +1,351 @@
1
+ import { ScopeRequestSchema, TrustedExecutionContextSchema, EvidenceBundleSchema, RetrievalPlanSchema, ScoperError, clampBudgets, } from "@x12i/memorix-scoper-contracts";
2
+ import { getProfile } from "@x12i/memorix-scoper-profiles";
3
+ import { enterScopeTrace } from "./recursion.js";
4
+ import { validatePlanAgainstCatalog, validateEpistemicConsistency } from "./validation.js";
5
+ async function mapPool(items, concurrency, fn) {
6
+ const results = new Array(items.length);
7
+ let idx = 0;
8
+ async function worker() {
9
+ while (idx < items.length) {
10
+ const i = idx++;
11
+ results[i] = await fn(items[i]);
12
+ }
13
+ }
14
+ const n = Math.max(1, Math.min(concurrency, items.length || 1));
15
+ await Promise.all(Array.from({ length: n }, () => worker()));
16
+ return results;
17
+ }
18
+ async function executeStep(step, ctxSdk, context) {
19
+ const args = step.args ?? {};
20
+ switch (step.capability) {
21
+ case "catalog.describe": {
22
+ // Local capability catalog — not a Memorix-landed OT/CT subject.
23
+ const described = ctxSdk.catalog.describe();
24
+ return [
25
+ {
26
+ id: `${step.id}:catalog`,
27
+ ref: {
28
+ kind: "subject",
29
+ orgId: context.orgId,
30
+ objectType: "catalog",
31
+ contentType: "describe",
32
+ recordId: described.version,
33
+ },
34
+ summary: `Catalog ${described.version} with ${described.entries.length} entries`,
35
+ epistemic: "OBSERVED",
36
+ payload: described,
37
+ },
38
+ ];
39
+ }
40
+ case "subjects.get": {
41
+ const objectType = String(args.objectType ?? "").trim();
42
+ const contentType = String(args.contentType ?? "").trim();
43
+ const id = String(args.recordId ?? args.id ?? "").trim();
44
+ if (!objectType || !contentType || !id) {
45
+ throw new ScoperError("INVALID_REQUEST", "subjects.get requires objectType, contentType, and recordId (id alias)", { details: { objectType, contentType, id } });
46
+ }
47
+ const res = await ctxSdk.subjects.get({ objectType, contentType, id });
48
+ if (!res.record)
49
+ return [];
50
+ return [
51
+ {
52
+ id: `${step.id}:${id}`,
53
+ ref: res.ref,
54
+ summary: `Subject ${objectType}/${contentType}/${id}`,
55
+ epistemic: "OBSERVED",
56
+ payload: res.record,
57
+ },
58
+ ];
59
+ }
60
+ case "subjects.list":
61
+ case "subjects.query": {
62
+ const objectType = String(args.objectType ?? "").trim();
63
+ const contentType = String(args.contentType ?? "").trim();
64
+ if (!objectType || !contentType) {
65
+ throw new ScoperError("INVALID_REQUEST", `${step.capability} requires objectType and contentType`, { details: { objectType, contentType } });
66
+ }
67
+ const limit = typeof args.limit === "number" ? args.limit : undefined;
68
+ const res = step.capability === "subjects.query"
69
+ ? await ctxSdk.subjects.query({
70
+ objectType,
71
+ contentType,
72
+ limit,
73
+ filter: args.filter ?? undefined,
74
+ })
75
+ : await ctxSdk.subjects.list({ objectType, contentType, limit });
76
+ return res.records.map((rec, i) => ({
77
+ id: `${step.id}:${String(rec.recordId ?? rec.id ?? i)}`,
78
+ ref: res.refs[i],
79
+ summary: `Listed ${objectType}/${contentType}`,
80
+ epistemic: "OBSERVED",
81
+ payload: rec,
82
+ }));
83
+ }
84
+ case "subjects.getNexumSnapshot": {
85
+ // Nexum persist is Memorix-internal: fixed OT/CT from memorix-nexum-persist/1.
86
+ const id = String(args.recordId ?? args.id ?? "").trim();
87
+ if (!id) {
88
+ throw new ScoperError("INVALID_REQUEST", "subjects.getNexumSnapshot requires recordId (id alias)", { details: { id } });
89
+ }
90
+ const res = await ctxSdk.subjects.getNexumSnapshot({ id });
91
+ return [
92
+ {
93
+ id: `${step.id}:${id}`,
94
+ ref: {
95
+ kind: "subject",
96
+ orgId: context.orgId,
97
+ objectType: "content",
98
+ contentType: "snapshots",
99
+ recordId: id,
100
+ },
101
+ summary: `Nexum persist snapshot ${res.envelope.serviceId}@${res.envelope.contractVersion}`,
102
+ epistemic: "OBSERVED",
103
+ payload: res.envelope,
104
+ },
105
+ ];
106
+ }
107
+ case "estate.startSession":
108
+ case "estate.getBag":
109
+ case "estate.query": {
110
+ // Will throw ESTATE_PATH_UNAVAILABLE when transport missing
111
+ if (step.capability === "estate.startSession") {
112
+ const session = await ctxSdk.estate.startSession({ bootstrap: args.bootstrap });
113
+ return [
114
+ {
115
+ id: `${step.id}:session`,
116
+ ref: {
117
+ kind: "estate-bag",
118
+ orgId: context.orgId,
119
+ sessionId: session.sessionId,
120
+ bagId: "session",
121
+ },
122
+ summary: `Estate session ${session.sessionId}`,
123
+ epistemic: "UNKNOWN",
124
+ payload: session,
125
+ },
126
+ ];
127
+ }
128
+ if (step.capability === "estate.getBag") {
129
+ const bag = await ctxSdk.estate.getBag({
130
+ sessionId: String(args.sessionId ?? ""),
131
+ bagId: String(args.bagId ?? ""),
132
+ });
133
+ return [
134
+ {
135
+ id: `${step.id}:${bag.bagId}`,
136
+ ref: {
137
+ kind: "estate-bag",
138
+ orgId: context.orgId,
139
+ sessionId: String(args.sessionId ?? ""),
140
+ bagId: bag.bagId,
141
+ },
142
+ summary: `Estate bag ${bag.bagId}`,
143
+ epistemic: "OBSERVED",
144
+ payload: bag.data,
145
+ },
146
+ ];
147
+ }
148
+ const q = await ctxSdk.estate.query({
149
+ sessionId: String(args.sessionId ?? ""),
150
+ query: args.query ?? {},
151
+ });
152
+ return [
153
+ {
154
+ id: `${step.id}:query`,
155
+ ref: {
156
+ kind: "estate-bag",
157
+ orgId: context.orgId,
158
+ sessionId: String(args.sessionId ?? ""),
159
+ bagId: "query",
160
+ },
161
+ summary: `Estate query returned ${q.results.length} results`,
162
+ epistemic: "OBSERVED",
163
+ payload: q,
164
+ },
165
+ ];
166
+ }
167
+ case "explore.query": {
168
+ await ctxSdk.explore.query(args);
169
+ return [];
170
+ }
171
+ default:
172
+ throw new ScoperError("CATALOG_REJECTED", `unsupported capability: ${step.capability}`);
173
+ }
174
+ }
175
+ async function obtainPlan(reasoner, input) {
176
+ try {
177
+ const plan = await reasoner.proposePlan(input);
178
+ validatePlanAgainstCatalog(plan, input.catalog.entries, input.profile);
179
+ return RetrievalPlanSchema.parse(plan);
180
+ }
181
+ catch (firstErr) {
182
+ if (firstErr instanceof ScoperError &&
183
+ (firstErr.code === "PROVIDER_NOT_IMPLEMENTED" ||
184
+ firstErr.code === "RECURSIVE_SCOPE_CALL" ||
185
+ firstErr.code === "BUDGET_EXCEEDED")) {
186
+ throw firstErr;
187
+ }
188
+ const message = firstErr instanceof Error ? firstErr.message : String(firstErr);
189
+ // One repair attempt only
190
+ try {
191
+ const repaired = await reasoner.proposePlan({
192
+ ...input,
193
+ repairOf: {
194
+ previousPlan: firstErr instanceof ScoperError ? firstErr.details : undefined,
195
+ error: message,
196
+ },
197
+ });
198
+ validatePlanAgainstCatalog(repaired, input.catalog.entries, input.profile);
199
+ return RetrievalPlanSchema.parse(repaired);
200
+ }
201
+ catch (secondErr) {
202
+ if (secondErr instanceof ScoperError) {
203
+ if (secondErr.code === "PROVIDER_NOT_IMPLEMENTED" ||
204
+ secondErr.code === "RECURSIVE_SCOPE_CALL") {
205
+ throw secondErr;
206
+ }
207
+ throw new ScoperError("REASONER_REPAIR_FAILED", secondErr.message, {
208
+ details: { first: message, second: secondErr.toJSON() },
209
+ });
210
+ }
211
+ throw new ScoperError("REASONER_REPAIR_FAILED", secondErr instanceof Error ? secondErr.message : String(secondErr), { details: { first: message } });
212
+ }
213
+ }
214
+ }
215
+ export async function scope(request, context, deps) {
216
+ const parsedRequest = ScopeRequestSchema.parse(request);
217
+ const parsedContext = TrustedExecutionContextSchema.parse(context);
218
+ const leave = enterScopeTrace(parsedContext.traceId);
219
+ try {
220
+ // Security: budgets come from host caps + clamped request — never from reasoner/hints injection
221
+ const resolvedProfile = deps.profiles?.[parsedRequest.profileId] ?? getProfile(parsedRequest.profileId);
222
+ if (!resolvedProfile) {
223
+ throw new ScoperError("INVALID_REQUEST", `unknown profile: ${parsedRequest.profileId}`);
224
+ }
225
+ const profile = resolvedProfile;
226
+ const hostCaps = deps.hostBudgetCaps ?? deps.sdk.hostBudgets;
227
+ const profileDefaults = profile.defaultBudgets ?? {};
228
+ // Ignore any attempt to smuggle budgets via hints
229
+ const safeRequested = {
230
+ ...profileDefaults,
231
+ ...parsedRequest.budgets,
232
+ };
233
+ if (parsedRequest.hints && typeof parsedRequest.hints === "object") {
234
+ // Explicitly discard budget keys from hints (prompt-injection surface)
235
+ const hints = parsedRequest.hints;
236
+ if (hints.budgets || hints.maxSubjects || hints.maxTokens) {
237
+ // strip — host caps win
238
+ }
239
+ }
240
+ const budgets = clampBudgets(safeRequested, hostCaps);
241
+ const ctxSdk = deps.sdk.forContext(parsedContext);
242
+ const catalog = ctxSdk.catalog.describe({ enabledOnly: false });
243
+ const plan = await obtainPlan(deps.reasoner, {
244
+ request: parsedRequest,
245
+ context: parsedContext,
246
+ profile,
247
+ budgets,
248
+ catalog: {
249
+ version: catalog.version,
250
+ entries: catalog.entries.filter((e) => e.enabled && profile.allowedCapabilities.includes(e.capability)),
251
+ },
252
+ });
253
+ // Group steps for parallel execution
254
+ const groups = new Map();
255
+ for (const step of plan.steps) {
256
+ const key = step.parallelGroup ?? step.id;
257
+ const list = groups.get(key) ?? [];
258
+ list.push(step);
259
+ groups.set(key, list);
260
+ }
261
+ const allItems = [];
262
+ const warnings = [];
263
+ const unknowns = [];
264
+ const conflicts = [];
265
+ const continuations = [];
266
+ for (const groupSteps of groups.values()) {
267
+ ctxSdk.budgets.consumeParallel(groupSteps.length);
268
+ const groupResults = await mapPool(groupSteps, budgets.maxParallelCalls, async (step) => {
269
+ try {
270
+ return await executeStep(step, ctxSdk, parsedContext);
271
+ }
272
+ catch (err) {
273
+ if (err instanceof ScoperError && err.code === "ESTATE_PATH_UNAVAILABLE") {
274
+ unknowns.push({
275
+ id: `unknown:${step.id}`,
276
+ message: err.message,
277
+ });
278
+ continuations.push({
279
+ kind: "estate-session",
280
+ message: "Estate path unavailable — inject estateTransport or await map-store docs",
281
+ });
282
+ if (!step.required)
283
+ return [];
284
+ warnings.push({ code: err.code, message: err.message });
285
+ return [];
286
+ }
287
+ if (err instanceof ScoperError && err.code === "NEXUM_EXPLORE_UNAVAILABLE") {
288
+ warnings.push({ code: err.code, message: err.message });
289
+ continuations.push({
290
+ kind: "explore",
291
+ message: "Nexum explore deferred/disabled",
292
+ });
293
+ return [];
294
+ }
295
+ if (err instanceof ScoperError && !step.required) {
296
+ warnings.push({ code: err.code, message: err.message });
297
+ return [];
298
+ }
299
+ throw err;
300
+ }
301
+ });
302
+ for (const items of groupResults) {
303
+ ctxSdk.budgets.consumeEvidence(items.length);
304
+ allItems.push(...items);
305
+ }
306
+ }
307
+ // Apply selection epistemic overrides carefully
308
+ for (const sel of plan.selections) {
309
+ if (sel.epistemic === "REACHABLE") {
310
+ for (const item of allItems) {
311
+ if (item.id.startsWith(sel.stepId) && item.epistemic === "POLICY_CANDIDATE") {
312
+ warnings.push({
313
+ code: "EPISTEMIC_BLOCKED_PROMOTION",
314
+ message: "Blocked POLICY_CANDIDATE → REACHABLE promotion from selection",
315
+ details: { evidenceId: item.id },
316
+ });
317
+ }
318
+ }
319
+ }
320
+ }
321
+ const epistemic = validateEpistemicConsistency(allItems);
322
+ warnings.push(...epistemic.warnings);
323
+ // Detect injected budget mutation attempts in question/hints for security telemetry
324
+ const injectionHints = /ignore.*budget|set.*maxSubjects\s*=|budgets\s*:\s*\{/i.test(parsedRequest.question) ||
325
+ Boolean(parsedRequest.hints &&
326
+ typeof parsedRequest.hints === "object" &&
327
+ ("budgets" in parsedRequest.hints ||
328
+ "maxSubjects" in parsedRequest.hints));
329
+ if (injectionHints) {
330
+ warnings.push({
331
+ code: "PROMPT_INJECTION_BUDGET_IGNORED",
332
+ message: "Prompt/hint budget manipulation ignored; host caps applied",
333
+ details: { appliedBudgets: budgets },
334
+ });
335
+ }
336
+ const bundle = EvidenceBundleSchema.parse({
337
+ items: epistemic.items.slice(0, budgets.maxEvidenceItems),
338
+ conflicts,
339
+ unknowns,
340
+ warnings,
341
+ continuations,
342
+ answer: plan.answerDraft,
343
+ budgetsUsed: ctxSdk.budgets.snapshot(),
344
+ });
345
+ return bundle;
346
+ }
347
+ finally {
348
+ leave();
349
+ }
350
+ }
351
+ //# sourceMappingURL=coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../src/coordinator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import type { ScoperBudgets, ScoperProfile } from "@x12i/memorix-scoper-contracts";
2
+ import type { MemorixScoperClient, TrustedSdkConfig } from "@x12i/memorix-scoper-sdk";
3
+ import type { ScoperReasoner } from "./reasoner/types.js";
4
+ import { type AiDispatcherReasonerOptions } from "./reasoner/ai-dispatcher.js";
5
+ import { scope, type ScoperDependencies } from "./coordinator.js";
6
+ export interface CreateScoperOptions {
7
+ sdk?: MemorixScoperClient;
8
+ sdkConfig?: TrustedSdkConfig;
9
+ reasoner?: ScoperReasoner;
10
+ reasonerKind?: "scripted" | "ai-dispatcher";
11
+ aiDispatcher?: AiDispatcherReasonerOptions;
12
+ hostBudgetCaps?: ScoperBudgets;
13
+ profiles?: Record<string, ScoperProfile>;
14
+ }
15
+ export declare function createScoper(options?: CreateScoperOptions): {
16
+ scope: (request: Parameters<typeof scope>[0], context: Parameters<typeof scope>[1]) => Promise<{
17
+ items: {
18
+ id: string;
19
+ ref: {
20
+ kind: "subject";
21
+ orgId: string;
22
+ objectType: string;
23
+ contentType: string;
24
+ recordId: string;
25
+ revision?: string | number | undefined;
26
+ } | {
27
+ kind: "estate-bag";
28
+ orgId: string;
29
+ sessionId: string;
30
+ bagId: string;
31
+ path?: string | undefined;
32
+ } | {
33
+ kind: "knowledge-explore";
34
+ orgId: string;
35
+ exploreQueryId: string;
36
+ nodeIds?: string[] | undefined;
37
+ };
38
+ summary: string;
39
+ epistemic: "OBSERVED" | "INFERRED" | "POLICY_CANDIDATE" | "REACHABLE" | "UNKNOWN" | "CONFLICTING";
40
+ confidence?: number | undefined;
41
+ payload?: unknown;
42
+ tags?: string[] | undefined;
43
+ }[];
44
+ conflicts: {
45
+ message: string;
46
+ id: string;
47
+ evidenceIds: string[];
48
+ severity: "low" | "medium" | "high";
49
+ }[];
50
+ unknowns: {
51
+ message: string;
52
+ id: string;
53
+ relatedEvidenceIds?: string[] | undefined;
54
+ }[];
55
+ warnings: {
56
+ code: string;
57
+ message: string;
58
+ details?: unknown;
59
+ }[];
60
+ continuations: {
61
+ kind: "follow-up-question" | "estate-session" | "explore" | "manual";
62
+ message: string;
63
+ payload?: unknown;
64
+ }[];
65
+ answer?: string | undefined;
66
+ budgetsUsed?: {
67
+ subjects?: number | undefined;
68
+ evidenceItems?: number | undefined;
69
+ parallelCalls?: number | undefined;
70
+ tokens?: number | undefined;
71
+ wallClockMs?: number | undefined;
72
+ } | undefined;
73
+ }>;
74
+ deps: ScoperDependencies;
75
+ };
76
+ export type Scoper = ReturnType<typeof createScoper>;
77
+ //# sourceMappingURL=create-scoper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-scoper.d.ts","sourceRoot":"","sources":["../src/create-scoper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAGL,KAAK,2BAA2B,EACjC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAElE,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,mBAAmB,CAAC;IAC1B,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,YAAY,CAAC,EAAE,UAAU,GAAG,eAAe,CAAC;IAC5C,YAAY,CAAC,EAAE,2BAA2B,CAAC;IAC3C,cAAc,CAAC,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAC1C;AA8BD,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB;qBA8B/C,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,WAC3B,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;;;;;;;;;wBAOsoa,CAAC;;;;;;oBAAkL,CAAC;;;;;uBAA6J,CAAC;;;;sBAAyL,CAAC;mBAAqC,CAAC;gBAAuB,CAAC;;;;;;;;;;;8BAA2Q,CAAC;;;;;mBAA+G,CAAC;;;;;mBAA+J,CAAC;;;;oBAAyF,CAAC;yBAA2C,CAAC;yBAA2C,CAAC;kBAAoC,CAAC;uBAAyC,CAAC;;;;EAHthd;AAED,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { createMemorixScoperClient } from "@x12i/memorix-scoper-sdk";
2
+ import { ScriptedReasoner } from "./reasoner/scripted.js";
3
+ import { AiDispatcherReasoner, dispatcherOptionsFromEnv, } from "./reasoner/ai-dispatcher.js";
4
+ import { scope } from "./coordinator.js";
5
+ function resolveAiDispatcherOptions(options) {
6
+ if (options?.dispatcher)
7
+ return options;
8
+ const fromEnv = dispatcherOptionsFromEnv();
9
+ return {
10
+ ...options,
11
+ dispatcherOptions: {
12
+ ...fromEnv,
13
+ ...options?.dispatcherOptions,
14
+ openrouter: {
15
+ ...fromEnv.openrouter,
16
+ ...options?.dispatcherOptions?.openrouter,
17
+ },
18
+ bedrock: {
19
+ ...fromEnv.bedrock,
20
+ ...options?.dispatcherOptions?.bedrock,
21
+ },
22
+ openai: {
23
+ ...fromEnv.openai,
24
+ ...options?.dispatcherOptions?.openai,
25
+ },
26
+ },
27
+ provider: options?.provider ?? fromEnv.provider,
28
+ model: options?.model ?? process.env.SCOPER_AI_MODEL,
29
+ };
30
+ }
31
+ export function createScoper(options = {}) {
32
+ const sdk = options.sdk ??
33
+ createMemorixScoperClient(options.sdkConfig ?? {
34
+ memorixBaseUrls: ["http://127.0.0.1:0"],
35
+ });
36
+ let reasoner = options.reasoner;
37
+ if (!reasoner) {
38
+ const kind = options.reasonerKind ??
39
+ (process.env.SCOPER_REASONER === "ai-dispatcher" ? "ai-dispatcher" : "scripted");
40
+ if (kind === "ai-dispatcher") {
41
+ reasoner = new AiDispatcherReasoner(resolveAiDispatcherOptions(options.aiDispatcher));
42
+ }
43
+ else {
44
+ reasoner = new ScriptedReasoner();
45
+ }
46
+ }
47
+ const deps = {
48
+ sdk,
49
+ reasoner,
50
+ hostBudgetCaps: options.hostBudgetCaps,
51
+ profiles: options.profiles,
52
+ };
53
+ return {
54
+ scope: (request, context) => scope(request, context, deps),
55
+ deps,
56
+ };
57
+ }
58
+ //# sourceMappingURL=create-scoper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-scoper.js","sourceRoot":"","sources":["../src/create-scoper.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAErE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EACL,oBAAoB,EACpB,wBAAwB,GAEzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,KAAK,EAA2B,MAAM,kBAAkB,CAAC;AAYlE,SAAS,0BAA0B,CACjC,OAAgD;IAEhD,IAAI,OAAO,EAAE,UAAU;QAAE,OAAO,OAAO,CAAC;IACxC,MAAM,OAAO,GAAG,wBAAwB,EAAE,CAAC;IAC3C,OAAO;QACL,GAAG,OAAO;QACV,iBAAiB,EAAE;YACjB,GAAG,OAAO;YACV,GAAG,OAAO,EAAE,iBAAiB;YAC7B,UAAU,EAAE;gBACV,GAAG,OAAO,CAAC,UAAU;gBACrB,GAAG,OAAO,EAAE,iBAAiB,EAAE,UAAU;aAC1C;YACD,OAAO,EAAE;gBACP,GAAG,OAAO,CAAC,OAAO;gBAClB,GAAG,OAAO,EAAE,iBAAiB,EAAE,OAAO;aACvC;YACD,MAAM,EAAE;gBACN,GAAG,OAAO,CAAC,MAAM;gBACjB,GAAG,OAAO,EAAE,iBAAiB,EAAE,MAAM;aACtC;SACF;QACD,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,OAAO,CAAC,QAAQ;QAC/C,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe;KACrD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,UAA+B,EAAE;IAC5D,MAAM,GAAG,GACP,OAAO,CAAC,GAAG;QACX,yBAAyB,CACvB,OAAO,CAAC,SAAS,IAAI;YACnB,eAAe,EAAE,CAAC,oBAAoB,CAAC;SACxC,CACF,CAAC;IAEJ,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAChC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,GACR,OAAO,CAAC,YAAY;YACpB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACnF,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;YAC7B,QAAQ,GAAG,IAAI,oBAAoB,CAAC,0BAA0B,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;QACxF,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAuB;QAC/B,GAAG;QACH,QAAQ;QACR,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,CACL,OAAoC,EACpC,OAAoC,EACpC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;QAClC,IAAI;KACL,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { EvidenceItem, WarningItem } from "@x12i/memorix-scoper-contracts";
2
+ export declare function validateEpistemicClaims(items: EvidenceItem[]): WarningItem[];
3
+ export declare function assertEvidenceHasRefs(items: EvidenceItem[]): void;
4
+ //# sourceMappingURL=epistemic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epistemic.d.ts","sourceRoot":"","sources":["../src/epistemic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAQhF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,WAAW,EAAE,CAoB5E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI,CAMjE"}
@@ -0,0 +1,34 @@
1
+ const FORBIDDEN_PROMOTIONS = [
2
+ { from: /POLICY_CANDIDATE/i, to: /\bREACHABLE\b/i, code: "EPSTEMIC_POLICY_TO_REACHABLE" },
3
+ { from: /\bOBSERVED\b/i, to: /\bREACHABLE\b/i, code: "EPSTEMIC_OBSERVED_TO_REACHABLE" },
4
+ { from: /\bUNKNOWN\b/i, to: /\bNO_|IMPOSSIBLE|ABSENCE\b/i, code: "EPSTEMIC_UNKNOWN_NEGATIVE" },
5
+ ];
6
+ export function validateEpistemicClaims(items) {
7
+ const warnings = [];
8
+ for (const item of items) {
9
+ const blob = `${item.assertionType} ${item.fact} ${JSON.stringify(item.value)}`;
10
+ for (const rule of FORBIDDEN_PROMOTIONS) {
11
+ if (rule.from.test(item.assertionType) && rule.to.test(blob)) {
12
+ warnings.push({
13
+ code: rule.code,
14
+ message: `Evidence ${item.evidenceId} appears to promote ${item.assertionType} incorrectly`,
15
+ });
16
+ }
17
+ }
18
+ if (/weak.?correlation/i.test(item.assertionType) && /\bidentity\b/i.test(blob)) {
19
+ warnings.push({
20
+ code: "EPSTEMIC_WEAK_CORRELATION_IDENTITY",
21
+ message: `Evidence ${item.evidenceId} must not treat weak correlation as identity`,
22
+ });
23
+ }
24
+ }
25
+ return warnings;
26
+ }
27
+ export function assertEvidenceHasRefs(items) {
28
+ for (const item of items) {
29
+ if (!item.ref || !item.evidenceId) {
30
+ throw new Error(`Evidence item missing provenance: ${item.evidenceId ?? "?"}`);
31
+ }
32
+ }
33
+ }
34
+ //# sourceMappingURL=epistemic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epistemic.js","sourceRoot":"","sources":["../src/epistemic.ts"],"names":[],"mappings":"AAEA,MAAM,oBAAoB,GAAsD;IAC9E,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,8BAA8B,EAAE;IACzF,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,gCAAgC,EAAE;IACvF,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,6BAA6B,EAAE,IAAI,EAAE,2BAA2B,EAAE;CAC/F,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,KAAqB;IAC3D,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChF,KAAK,MAAM,IAAI,IAAI,oBAAoB,EAAE,CAAC;YACxC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7D,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,YAAY,IAAI,CAAC,UAAU,uBAAuB,IAAI,CAAC,aAAa,cAAc;iBAC5F,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAChF,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,oCAAoC;gBAC1C,OAAO,EAAE,YAAY,IAAI,CAAC,UAAU,8CAA8C;aACnF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAqB;IACzD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function enterScopeTrace(traceId: string): () => void;
2
+ export declare function __resetScopeTracesForTests(): void;
3
+ //# sourceMappingURL=guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"AAIA,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,IAAI,CAQ3D;AAED,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD"}
package/dist/guard.js ADDED
@@ -0,0 +1,15 @@
1
+ import { ScoperError } from "@x12i/memorix-scoper-contracts";
2
+ const activeTraces = new Set();
3
+ export function enterScopeTrace(traceId) {
4
+ if (activeTraces.has(traceId)) {
5
+ throw new ScoperError("RECURSIVE_SCOPE_CALL", `Recursive memorix.scope call for trace ${traceId}`);
6
+ }
7
+ activeTraces.add(traceId);
8
+ return () => {
9
+ activeTraces.delete(traceId);
10
+ };
11
+ }
12
+ export function __resetScopeTracesForTests() {
13
+ activeTraces.clear();
14
+ }
15
+ //# sourceMappingURL=guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.js","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,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,CAAC,sBAAsB,EAAE,0CAA0C,OAAO,EAAE,CAAC,CAAC;IACrG,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,MAAM,UAAU,0BAA0B;IACxC,YAAY,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=guard.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.test.d.ts","sourceRoot":"","sources":["../src/guard.test.ts"],"names":[],"mappings":""}