@x12i/memorix-scoper 1.1.0-rc.26-Sep-2am
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/ai-markdown.d.ts +19 -0
- package/dist/ai-markdown.d.ts.map +1 -0
- package/dist/ai-markdown.js +70 -0
- package/dist/ai-markdown.js.map +1 -0
- package/dist/coordinator.d.ts +14 -0
- package/dist/coordinator.d.ts.map +1 -0
- package/dist/coordinator.js +431 -0
- package/dist/coordinator.js.map +1 -0
- package/dist/create-scoper.d.ts +83 -0
- package/dist/create-scoper.d.ts.map +1 -0
- package/dist/create-scoper.js +59 -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 +186 -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 +144 -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
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,19 @@
|
|
|
1
|
+
import type { EvidenceItem, ScopeRequest } from "@x12i/memorix-scoper-contracts";
|
|
2
|
+
export type RecordAddress = {
|
|
3
|
+
recordId: string;
|
|
4
|
+
objectType: string;
|
|
5
|
+
contentType: string;
|
|
6
|
+
};
|
|
7
|
+
export type StoredMarkdown = {
|
|
8
|
+
content: string;
|
|
9
|
+
source: string;
|
|
10
|
+
metadata?: Record<string, unknown>;
|
|
11
|
+
};
|
|
12
|
+
/** A scope that is only "return this one record". */
|
|
13
|
+
export declare function singleRecordFocus(request: ScopeRequest): RecordAddress | null;
|
|
14
|
+
export declare function readMarkdown(record: Record<string, unknown> | null): StoredMarkdown | null;
|
|
15
|
+
/** Original model text. Empty content does not count. */
|
|
16
|
+
export declare function isAiMarkdown(record: Record<string, unknown> | null): boolean;
|
|
17
|
+
export declare function revisionOf(record: Record<string, unknown> | null): number | undefined;
|
|
18
|
+
export declare function withMarkdownOnRecord(items: EvidenceItem[], address: RecordAddress, markdown: StoredMarkdown): EvidenceItem[];
|
|
19
|
+
//# sourceMappingURL=ai-markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-markdown.d.ts","sourceRoot":"","sources":["../src/ai-markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAEjF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,CAAC;AAEF,qDAAqD;AACrD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,aAAa,GAAG,IAAI,CAY7E;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,cAAc,GAAG,IAAI,CAe1F;AAED,yDAAyD;AACzD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,OAAO,CAG5E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CASrF;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,YAAY,EAAE,EACrB,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,cAAc,GACvB,YAAY,EAAE,CAgBhB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/** A scope that is only "return this one record". */
|
|
2
|
+
export function singleRecordFocus(request) {
|
|
3
|
+
const focus = request.focus;
|
|
4
|
+
if (!focus)
|
|
5
|
+
return null;
|
|
6
|
+
const ids = (focus.subjectIds ?? []).map((id) => id.trim()).filter(Boolean);
|
|
7
|
+
const objectTypes = (focus.objectTypes ?? []).map((id) => id.trim()).filter(Boolean);
|
|
8
|
+
const contentTypes = (focus.contentTypes ?? []).map((id) => id.trim()).filter(Boolean);
|
|
9
|
+
if (ids.length !== 1 || objectTypes.length !== 1 || contentTypes.length !== 1)
|
|
10
|
+
return null;
|
|
11
|
+
return {
|
|
12
|
+
recordId: ids[0],
|
|
13
|
+
objectType: objectTypes[0],
|
|
14
|
+
contentType: contentTypes[0],
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export function readMarkdown(record) {
|
|
18
|
+
if (!record)
|
|
19
|
+
return null;
|
|
20
|
+
const raw = record._markdown;
|
|
21
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
22
|
+
return null;
|
|
23
|
+
const markdown = raw;
|
|
24
|
+
if (typeof markdown.content !== "string" || typeof markdown.source !== "string")
|
|
25
|
+
return null;
|
|
26
|
+
const metadata = markdown.metadata && typeof markdown.metadata === "object" && !Array.isArray(markdown.metadata)
|
|
27
|
+
? markdown.metadata
|
|
28
|
+
: undefined;
|
|
29
|
+
return {
|
|
30
|
+
content: markdown.content,
|
|
31
|
+
source: markdown.source,
|
|
32
|
+
...(metadata ? { metadata } : {}),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** Original model text. Empty content does not count. */
|
|
36
|
+
export function isAiMarkdown(record) {
|
|
37
|
+
const markdown = readMarkdown(record);
|
|
38
|
+
return markdown?.source === "ai" && markdown.content.trim().length > 0;
|
|
39
|
+
}
|
|
40
|
+
export function revisionOf(record) {
|
|
41
|
+
if (!record)
|
|
42
|
+
return undefined;
|
|
43
|
+
if (typeof record.revision === "number" && Number.isFinite(record.revision))
|
|
44
|
+
return record.revision;
|
|
45
|
+
const system = record._system;
|
|
46
|
+
if (system && typeof system === "object" && !Array.isArray(system)) {
|
|
47
|
+
const revision = system.revision;
|
|
48
|
+
if (typeof revision === "number" && Number.isFinite(revision))
|
|
49
|
+
return revision;
|
|
50
|
+
}
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
export function withMarkdownOnRecord(items, address, markdown) {
|
|
54
|
+
return items.map((item) => {
|
|
55
|
+
if (item.ref.kind !== "subject")
|
|
56
|
+
return item;
|
|
57
|
+
if (item.ref.recordId !== address.recordId ||
|
|
58
|
+
item.ref.objectType !== address.objectType ||
|
|
59
|
+
item.ref.contentType !== address.contentType) {
|
|
60
|
+
return item;
|
|
61
|
+
}
|
|
62
|
+
if (!item.payload || typeof item.payload !== "object" || Array.isArray(item.payload))
|
|
63
|
+
return item;
|
|
64
|
+
return {
|
|
65
|
+
...item,
|
|
66
|
+
payload: { ...item.payload, _markdown: markdown },
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=ai-markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-markdown.js","sourceRoot":"","sources":["../src/ai-markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
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
|
+
/** Default true. See CreateScoperOptions.skipWhenAiMarkdown. */
|
|
11
|
+
skipWhenAiMarkdown?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function scope(request: ScopeRequest, context: TrustedExecutionContext, deps: ScoperDependencies): Promise<EvidenceBundle>;
|
|
14
|
+
//# 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,EAEjB,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;AAY1D,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;IACzC,gEAAgE;IAChE,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAkSD,wBAAsB,KAAK,CACzB,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,uBAAuB,EAChC,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,cAAc,CAAC,CA8LzB"}
|
|
@@ -0,0 +1,431 @@
|
|
|
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
|
+
import { isAiMarkdown, readMarkdown, revisionOf, singleRecordFocus, withMarkdownOnRecord, } from "./ai-markdown.js";
|
|
6
|
+
async function mapPool(items, concurrency, fn) {
|
|
7
|
+
const results = new Array(items.length);
|
|
8
|
+
let idx = 0;
|
|
9
|
+
async function worker() {
|
|
10
|
+
while (idx < items.length) {
|
|
11
|
+
const i = idx++;
|
|
12
|
+
results[i] = await fn(items[i]);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const n = Math.max(1, Math.min(concurrency, items.length || 1));
|
|
16
|
+
await Promise.all(Array.from({ length: n }, () => worker()));
|
|
17
|
+
return results;
|
|
18
|
+
}
|
|
19
|
+
async function executeStep(step, ctxSdk, context, include) {
|
|
20
|
+
const args = step.args ?? {};
|
|
21
|
+
switch (step.capability) {
|
|
22
|
+
case "catalog.describe": {
|
|
23
|
+
// Local capability catalog — not a Memorix-landed OT/CT subject.
|
|
24
|
+
const described = ctxSdk.catalog.describe();
|
|
25
|
+
return [
|
|
26
|
+
{
|
|
27
|
+
id: `${step.id}:catalog`,
|
|
28
|
+
ref: {
|
|
29
|
+
kind: "subject",
|
|
30
|
+
orgId: context.orgId,
|
|
31
|
+
objectType: "catalog",
|
|
32
|
+
contentType: "describe",
|
|
33
|
+
recordId: described.version,
|
|
34
|
+
},
|
|
35
|
+
summary: `Catalog ${described.version} with ${described.entries.length} entries`,
|
|
36
|
+
epistemic: "OBSERVED",
|
|
37
|
+
payload: described,
|
|
38
|
+
},
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
case "subjects.get": {
|
|
42
|
+
const objectType = String(args.objectType ?? "").trim();
|
|
43
|
+
const contentType = String(args.contentType ?? "").trim();
|
|
44
|
+
const id = String(args.recordId ?? args.id ?? "").trim();
|
|
45
|
+
if (!objectType || !contentType || !id) {
|
|
46
|
+
throw new ScoperError("INVALID_REQUEST", "subjects.get requires objectType, contentType, and recordId (id alias)", { details: { objectType, contentType, id } });
|
|
47
|
+
}
|
|
48
|
+
const res = await ctxSdk.subjects.get({ objectType, contentType, id, include });
|
|
49
|
+
if (!res.record)
|
|
50
|
+
return [];
|
|
51
|
+
return [
|
|
52
|
+
{
|
|
53
|
+
id: `${step.id}:${id}`,
|
|
54
|
+
ref: res.ref,
|
|
55
|
+
summary: `Subject ${objectType}/${contentType}/${id}`,
|
|
56
|
+
epistemic: "OBSERVED",
|
|
57
|
+
payload: res.record,
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
}
|
|
61
|
+
case "subjects.list":
|
|
62
|
+
case "subjects.query": {
|
|
63
|
+
const objectType = String(args.objectType ?? "").trim();
|
|
64
|
+
const contentType = String(args.contentType ?? "").trim();
|
|
65
|
+
if (!objectType || !contentType) {
|
|
66
|
+
throw new ScoperError("INVALID_REQUEST", `${step.capability} requires objectType and contentType`, { details: { objectType, contentType } });
|
|
67
|
+
}
|
|
68
|
+
const limit = typeof args.limit === "number" ? args.limit : undefined;
|
|
69
|
+
const res = step.capability === "subjects.query"
|
|
70
|
+
? await ctxSdk.subjects.query({
|
|
71
|
+
objectType,
|
|
72
|
+
contentType,
|
|
73
|
+
limit,
|
|
74
|
+
filter: args.filter ?? undefined,
|
|
75
|
+
include,
|
|
76
|
+
})
|
|
77
|
+
: await ctxSdk.subjects.list({ objectType, contentType, limit, include });
|
|
78
|
+
return res.records.map((rec, i) => ({
|
|
79
|
+
id: `${step.id}:${String(rec.recordId ?? rec.id ?? i)}`,
|
|
80
|
+
ref: res.refs[i],
|
|
81
|
+
summary: `Listed ${objectType}/${contentType}`,
|
|
82
|
+
epistemic: "OBSERVED",
|
|
83
|
+
payload: rec,
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
case "subjects.getNexumSnapshot": {
|
|
87
|
+
// Nexum persist is Memorix-internal: fixed OT/CT from memorix-nexum-persist/1.
|
|
88
|
+
const id = String(args.recordId ?? args.id ?? "").trim();
|
|
89
|
+
if (!id) {
|
|
90
|
+
throw new ScoperError("INVALID_REQUEST", "subjects.getNexumSnapshot requires recordId (id alias)", { details: { id } });
|
|
91
|
+
}
|
|
92
|
+
const res = await ctxSdk.subjects.getNexumSnapshot({ id });
|
|
93
|
+
return [
|
|
94
|
+
{
|
|
95
|
+
id: `${step.id}:${id}`,
|
|
96
|
+
ref: {
|
|
97
|
+
kind: "subject",
|
|
98
|
+
orgId: context.orgId,
|
|
99
|
+
objectType: "content",
|
|
100
|
+
contentType: "snapshots",
|
|
101
|
+
recordId: id,
|
|
102
|
+
},
|
|
103
|
+
summary: `Nexum persist snapshot ${res.envelope.serviceId}@${res.envelope.contractVersion}`,
|
|
104
|
+
epistemic: "OBSERVED",
|
|
105
|
+
payload: res.envelope,
|
|
106
|
+
},
|
|
107
|
+
];
|
|
108
|
+
}
|
|
109
|
+
case "estate.startSession":
|
|
110
|
+
case "estate.getBag":
|
|
111
|
+
case "estate.query": {
|
|
112
|
+
// Will throw ESTATE_PATH_UNAVAILABLE when transport missing
|
|
113
|
+
if (step.capability === "estate.startSession") {
|
|
114
|
+
const session = await ctxSdk.estate.startSession({ bootstrap: args.bootstrap });
|
|
115
|
+
return [
|
|
116
|
+
{
|
|
117
|
+
id: `${step.id}:session`,
|
|
118
|
+
ref: {
|
|
119
|
+
kind: "estate-bag",
|
|
120
|
+
orgId: context.orgId,
|
|
121
|
+
sessionId: session.sessionId,
|
|
122
|
+
bagId: "session",
|
|
123
|
+
},
|
|
124
|
+
summary: `Estate session ${session.sessionId}`,
|
|
125
|
+
epistemic: "UNKNOWN",
|
|
126
|
+
payload: session,
|
|
127
|
+
},
|
|
128
|
+
];
|
|
129
|
+
}
|
|
130
|
+
if (step.capability === "estate.getBag") {
|
|
131
|
+
const bag = await ctxSdk.estate.getBag({
|
|
132
|
+
sessionId: String(args.sessionId ?? ""),
|
|
133
|
+
bagId: String(args.bagId ?? ""),
|
|
134
|
+
});
|
|
135
|
+
return [
|
|
136
|
+
{
|
|
137
|
+
id: `${step.id}:${bag.bagId}`,
|
|
138
|
+
ref: {
|
|
139
|
+
kind: "estate-bag",
|
|
140
|
+
orgId: context.orgId,
|
|
141
|
+
sessionId: String(args.sessionId ?? ""),
|
|
142
|
+
bagId: bag.bagId,
|
|
143
|
+
},
|
|
144
|
+
summary: `Estate bag ${bag.bagId}`,
|
|
145
|
+
epistemic: "OBSERVED",
|
|
146
|
+
payload: bag.data,
|
|
147
|
+
},
|
|
148
|
+
];
|
|
149
|
+
}
|
|
150
|
+
const q = await ctxSdk.estate.query({
|
|
151
|
+
sessionId: String(args.sessionId ?? ""),
|
|
152
|
+
query: args.query ?? {},
|
|
153
|
+
});
|
|
154
|
+
return [
|
|
155
|
+
{
|
|
156
|
+
id: `${step.id}:query`,
|
|
157
|
+
ref: {
|
|
158
|
+
kind: "estate-bag",
|
|
159
|
+
orgId: context.orgId,
|
|
160
|
+
sessionId: String(args.sessionId ?? ""),
|
|
161
|
+
bagId: "query",
|
|
162
|
+
},
|
|
163
|
+
summary: `Estate query returned ${q.results.length} results`,
|
|
164
|
+
epistemic: "OBSERVED",
|
|
165
|
+
payload: q,
|
|
166
|
+
},
|
|
167
|
+
];
|
|
168
|
+
}
|
|
169
|
+
case "explore.query": {
|
|
170
|
+
await ctxSdk.explore.query(args);
|
|
171
|
+
return [];
|
|
172
|
+
}
|
|
173
|
+
default:
|
|
174
|
+
throw new ScoperError("CATALOG_REJECTED", `unsupported capability: ${step.capability}`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async function obtainPlan(reasoner, input) {
|
|
178
|
+
try {
|
|
179
|
+
const plan = await reasoner.proposePlan(input);
|
|
180
|
+
validatePlanAgainstCatalog(plan, input.catalog.entries, input.profile);
|
|
181
|
+
return RetrievalPlanSchema.parse(plan);
|
|
182
|
+
}
|
|
183
|
+
catch (firstErr) {
|
|
184
|
+
if (firstErr instanceof ScoperError &&
|
|
185
|
+
(firstErr.code === "PROVIDER_NOT_IMPLEMENTED" ||
|
|
186
|
+
firstErr.code === "RECURSIVE_SCOPE_CALL" ||
|
|
187
|
+
firstErr.code === "BUDGET_EXCEEDED")) {
|
|
188
|
+
throw firstErr;
|
|
189
|
+
}
|
|
190
|
+
const message = firstErr instanceof Error ? firstErr.message : String(firstErr);
|
|
191
|
+
// One repair attempt only
|
|
192
|
+
try {
|
|
193
|
+
const repaired = await reasoner.proposePlan({
|
|
194
|
+
...input,
|
|
195
|
+
repairOf: {
|
|
196
|
+
previousPlan: firstErr instanceof ScoperError ? firstErr.details : undefined,
|
|
197
|
+
error: message,
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
validatePlanAgainstCatalog(repaired, input.catalog.entries, input.profile);
|
|
201
|
+
return RetrievalPlanSchema.parse(repaired);
|
|
202
|
+
}
|
|
203
|
+
catch (secondErr) {
|
|
204
|
+
if (secondErr instanceof ScoperError) {
|
|
205
|
+
if (secondErr.code === "PROVIDER_NOT_IMPLEMENTED" ||
|
|
206
|
+
secondErr.code === "RECURSIVE_SCOPE_CALL") {
|
|
207
|
+
throw secondErr;
|
|
208
|
+
}
|
|
209
|
+
throw new ScoperError("REASONER_REPAIR_FAILED", secondErr.message, {
|
|
210
|
+
details: { first: message, second: secondErr.toJSON() },
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
throw new ScoperError("REASONER_REPAIR_FAILED", secondErr instanceof Error ? secondErr.message : String(secondErr), { details: { first: message } });
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
async function applyAiMarkdown(ctxSdk, focus, answer, warnings) {
|
|
218
|
+
const existing = await ctxSdk.subjects.get({
|
|
219
|
+
objectType: focus.objectType,
|
|
220
|
+
contentType: focus.contentType,
|
|
221
|
+
id: focus.recordId,
|
|
222
|
+
include: { markdown: true },
|
|
223
|
+
});
|
|
224
|
+
const stored = readMarkdown(existing.record);
|
|
225
|
+
if (stored?.source === "ai" || stored?.source === "content")
|
|
226
|
+
return undefined;
|
|
227
|
+
const revision = revisionOf(existing.record);
|
|
228
|
+
if (revision === undefined) {
|
|
229
|
+
warnings.push({
|
|
230
|
+
code: "AI_MARKDOWN_NOT_APPLIED",
|
|
231
|
+
message: "applyAiMarkdown was set, but the record has no revision to patch",
|
|
232
|
+
});
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
const markdown = {
|
|
236
|
+
content: answer,
|
|
237
|
+
source: "ai",
|
|
238
|
+
metadata: { capturedAt: new Date().toISOString(), generatedFrom: "scope" },
|
|
239
|
+
};
|
|
240
|
+
const written = await ctxSdk.subjects.patchMarkdown({
|
|
241
|
+
objectType: focus.objectType,
|
|
242
|
+
contentType: focus.contentType,
|
|
243
|
+
id: focus.recordId,
|
|
244
|
+
revision,
|
|
245
|
+
markdown: { content: markdown.content, source: "ai", metadata: markdown.metadata },
|
|
246
|
+
});
|
|
247
|
+
if (!written.written) {
|
|
248
|
+
warnings.push({
|
|
249
|
+
code: "AI_MARKDOWN_NOT_APPLIED",
|
|
250
|
+
message: "applyAiMarkdown was set, but the transport cannot patch _markdown",
|
|
251
|
+
});
|
|
252
|
+
return undefined;
|
|
253
|
+
}
|
|
254
|
+
return markdown;
|
|
255
|
+
}
|
|
256
|
+
export async function scope(request, context, deps) {
|
|
257
|
+
const parsedRequest = ScopeRequestSchema.parse(request);
|
|
258
|
+
const parsedContext = TrustedExecutionContextSchema.parse(context);
|
|
259
|
+
const leave = enterScopeTrace(parsedContext.traceId);
|
|
260
|
+
try {
|
|
261
|
+
// Security: budgets come from host caps + clamped request — never from reasoner/hints injection
|
|
262
|
+
const resolvedProfile = deps.profiles?.[parsedRequest.profileId] ?? getProfile(parsedRequest.profileId);
|
|
263
|
+
if (!resolvedProfile) {
|
|
264
|
+
throw new ScoperError("INVALID_REQUEST", `unknown profile: ${parsedRequest.profileId}`);
|
|
265
|
+
}
|
|
266
|
+
const profile = resolvedProfile;
|
|
267
|
+
const hostCaps = deps.hostBudgetCaps ?? deps.sdk.hostBudgets;
|
|
268
|
+
const profileDefaults = profile.defaultBudgets ?? {};
|
|
269
|
+
// Ignore any attempt to smuggle budgets via hints
|
|
270
|
+
const safeRequested = {
|
|
271
|
+
...profileDefaults,
|
|
272
|
+
...parsedRequest.budgets,
|
|
273
|
+
};
|
|
274
|
+
if (parsedRequest.hints && typeof parsedRequest.hints === "object") {
|
|
275
|
+
// Explicitly discard budget keys from hints (prompt-injection surface)
|
|
276
|
+
const hints = parsedRequest.hints;
|
|
277
|
+
if (hints.budgets || hints.maxSubjects || hints.maxTokens) {
|
|
278
|
+
// strip — host caps win
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
const budgets = clampBudgets(safeRequested, hostCaps);
|
|
282
|
+
const ctxSdk = deps.sdk.forContext(parsedContext);
|
|
283
|
+
const focus = singleRecordFocus(parsedRequest);
|
|
284
|
+
const skipWhenAiMarkdown = deps.skipWhenAiMarkdown !== false;
|
|
285
|
+
if (focus && skipWhenAiMarkdown) {
|
|
286
|
+
const existing = await ctxSdk.subjects.get({
|
|
287
|
+
objectType: focus.objectType,
|
|
288
|
+
contentType: focus.contentType,
|
|
289
|
+
id: focus.recordId,
|
|
290
|
+
include: { markdown: true },
|
|
291
|
+
});
|
|
292
|
+
if (isAiMarkdown(existing.record)) {
|
|
293
|
+
const markdown = readMarkdown(existing.record);
|
|
294
|
+
return EvidenceBundleSchema.parse({
|
|
295
|
+
items: [
|
|
296
|
+
{
|
|
297
|
+
id: `record:${focus.recordId}`,
|
|
298
|
+
ref: existing.ref,
|
|
299
|
+
summary: `Subject ${focus.objectType}/${focus.contentType}/${focus.recordId}`,
|
|
300
|
+
epistemic: "OBSERVED",
|
|
301
|
+
payload: existing.record,
|
|
302
|
+
},
|
|
303
|
+
],
|
|
304
|
+
answer: markdown.content,
|
|
305
|
+
budgetsUsed: ctxSdk.budgets.snapshot(),
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
const catalog = ctxSdk.catalog.describe({ enabledOnly: false });
|
|
310
|
+
const plan = await obtainPlan(deps.reasoner, {
|
|
311
|
+
request: parsedRequest,
|
|
312
|
+
context: parsedContext,
|
|
313
|
+
profile,
|
|
314
|
+
budgets,
|
|
315
|
+
catalog: {
|
|
316
|
+
version: catalog.version,
|
|
317
|
+
entries: catalog.entries.filter((e) => e.enabled && profile.allowedCapabilities.includes(e.capability)),
|
|
318
|
+
},
|
|
319
|
+
});
|
|
320
|
+
// Group steps for parallel execution
|
|
321
|
+
const groups = new Map();
|
|
322
|
+
for (const step of plan.steps) {
|
|
323
|
+
const key = step.parallelGroup ?? step.id;
|
|
324
|
+
const list = groups.get(key) ?? [];
|
|
325
|
+
list.push(step);
|
|
326
|
+
groups.set(key, list);
|
|
327
|
+
}
|
|
328
|
+
const allItems = [];
|
|
329
|
+
const warnings = [];
|
|
330
|
+
const unknowns = [];
|
|
331
|
+
const conflicts = [];
|
|
332
|
+
const continuations = [];
|
|
333
|
+
for (const groupSteps of groups.values()) {
|
|
334
|
+
ctxSdk.budgets.consumeParallel(groupSteps.length);
|
|
335
|
+
const groupResults = await mapPool(groupSteps, budgets.maxParallelCalls, async (step) => {
|
|
336
|
+
try {
|
|
337
|
+
return await executeStep(step, ctxSdk, parsedContext, parsedRequest.options?.include);
|
|
338
|
+
}
|
|
339
|
+
catch (err) {
|
|
340
|
+
if (err instanceof ScoperError && err.code === "ESTATE_PATH_UNAVAILABLE") {
|
|
341
|
+
unknowns.push({
|
|
342
|
+
id: `unknown:${step.id}`,
|
|
343
|
+
message: err.message,
|
|
344
|
+
});
|
|
345
|
+
continuations.push({
|
|
346
|
+
kind: "estate-session",
|
|
347
|
+
message: "Estate path unavailable — inject estateTransport or await map-store docs",
|
|
348
|
+
});
|
|
349
|
+
if (!step.required)
|
|
350
|
+
return [];
|
|
351
|
+
warnings.push({ code: err.code, message: err.message });
|
|
352
|
+
return [];
|
|
353
|
+
}
|
|
354
|
+
if (err instanceof ScoperError && err.code === "NEXUM_EXPLORE_UNAVAILABLE") {
|
|
355
|
+
warnings.push({ code: err.code, message: err.message });
|
|
356
|
+
continuations.push({
|
|
357
|
+
kind: "explore",
|
|
358
|
+
message: "Nexum explore deferred/disabled",
|
|
359
|
+
});
|
|
360
|
+
return [];
|
|
361
|
+
}
|
|
362
|
+
if (err instanceof ScoperError && !step.required) {
|
|
363
|
+
warnings.push({ code: err.code, message: err.message });
|
|
364
|
+
return [];
|
|
365
|
+
}
|
|
366
|
+
throw err;
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
for (const items of groupResults) {
|
|
370
|
+
ctxSdk.budgets.consumeEvidence(items.length);
|
|
371
|
+
allItems.push(...items);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
// Apply selection epistemic overrides carefully
|
|
375
|
+
for (const sel of plan.selections) {
|
|
376
|
+
if (sel.epistemic === "REACHABLE") {
|
|
377
|
+
for (const item of allItems) {
|
|
378
|
+
if (item.id.startsWith(sel.stepId) && item.epistemic === "POLICY_CANDIDATE") {
|
|
379
|
+
warnings.push({
|
|
380
|
+
code: "EPISTEMIC_BLOCKED_PROMOTION",
|
|
381
|
+
message: "Blocked POLICY_CANDIDATE → REACHABLE promotion from selection",
|
|
382
|
+
details: { evidenceId: item.id },
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
const epistemic = validateEpistemicConsistency(allItems);
|
|
389
|
+
warnings.push(...epistemic.warnings);
|
|
390
|
+
// Detect injected budget mutation attempts in question/hints for security telemetry
|
|
391
|
+
const injectionHints = /ignore.*budget|set.*maxSubjects\s*=|budgets\s*:\s*\{/i.test(parsedRequest.question) ||
|
|
392
|
+
Boolean(parsedRequest.hints &&
|
|
393
|
+
typeof parsedRequest.hints === "object" &&
|
|
394
|
+
("budgets" in parsedRequest.hints ||
|
|
395
|
+
"maxSubjects" in parsedRequest.hints));
|
|
396
|
+
if (injectionHints) {
|
|
397
|
+
warnings.push({
|
|
398
|
+
code: "PROMPT_INJECTION_BUDGET_IGNORED",
|
|
399
|
+
message: "Prompt/hint budget manipulation ignored; host caps applied",
|
|
400
|
+
details: { appliedBudgets: budgets },
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
let items = epistemic.items.slice(0, budgets.maxEvidenceItems);
|
|
404
|
+
const answer = plan.answerDraft;
|
|
405
|
+
if (focus && parsedRequest.options?.applyAiMarkdown === true && answer?.trim()) {
|
|
406
|
+
const applied = await applyAiMarkdown(ctxSdk, focus, answer.trim(), warnings);
|
|
407
|
+
if (applied)
|
|
408
|
+
items = withMarkdownOnRecord(items, focus, applied);
|
|
409
|
+
}
|
|
410
|
+
else if (focus && parsedRequest.options?.applyAiMarkdown === true) {
|
|
411
|
+
warnings.push({
|
|
412
|
+
code: "AI_MARKDOWN_NOT_APPLIED",
|
|
413
|
+
message: "applyAiMarkdown was set, but the scope produced no answer text to store",
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
const bundle = EvidenceBundleSchema.parse({
|
|
417
|
+
items,
|
|
418
|
+
conflicts,
|
|
419
|
+
unknowns,
|
|
420
|
+
warnings,
|
|
421
|
+
continuations,
|
|
422
|
+
answer,
|
|
423
|
+
budgetsUsed: ctxSdk.budgets.snapshot(),
|
|
424
|
+
});
|
|
425
|
+
return bundle;
|
|
426
|
+
}
|
|
427
|
+
finally {
|
|
428
|
+
leave();
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
//# sourceMappingURL=coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../src/coordinator.ts"],"names":[],"mappings":"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"}
|