@x12i/memorix-scoper-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +29 -0
  2. package/catalog/catalog.v1.json +83 -0
  3. package/dist/addressing.d.ts +20 -0
  4. package/dist/addressing.d.ts.map +1 -0
  5. package/dist/addressing.js +20 -0
  6. package/dist/addressing.js.map +1 -0
  7. package/dist/budget-errors.d.ts +4 -0
  8. package/dist/budget-errors.d.ts.map +1 -0
  9. package/dist/budget-errors.js +12 -0
  10. package/dist/budget-errors.js.map +1 -0
  11. package/dist/budgets.d.ts +28 -0
  12. package/dist/budgets.d.ts.map +1 -0
  13. package/dist/budgets.js +52 -0
  14. package/dist/budgets.js.map +1 -0
  15. package/dist/catalog/catalog.v1.json +83 -0
  16. package/dist/catalog.d.ts +12 -0
  17. package/dist/catalog.d.ts.map +1 -0
  18. package/dist/catalog.js +55 -0
  19. package/dist/catalog.js.map +1 -0
  20. package/dist/client.d.ts +96 -0
  21. package/dist/client.d.ts.map +1 -0
  22. package/dist/client.js +315 -0
  23. package/dist/client.js.map +1 -0
  24. package/dist/config.d.ts +77 -0
  25. package/dist/config.d.ts.map +1 -0
  26. package/dist/config.js +15 -0
  27. package/dist/config.js.map +1 -0
  28. package/dist/decoder.d.ts +21 -0
  29. package/dist/decoder.d.ts.map +1 -0
  30. package/dist/decoder.js +145 -0
  31. package/dist/decoder.js.map +1 -0
  32. package/dist/decoders.d.ts +32 -0
  33. package/dist/decoders.d.ts.map +1 -0
  34. package/dist/decoders.js +65 -0
  35. package/dist/decoders.js.map +1 -0
  36. package/dist/errors.d.ts +2 -0
  37. package/dist/errors.d.ts.map +1 -0
  38. package/dist/errors.js +2 -0
  39. package/dist/errors.js.map +1 -0
  40. package/dist/estate.d.ts +15 -0
  41. package/dist/estate.d.ts.map +1 -0
  42. package/dist/estate.js +15 -0
  43. package/dist/estate.js.map +1 -0
  44. package/dist/evidence-refs.d.ts +6 -0
  45. package/dist/evidence-refs.d.ts.map +1 -0
  46. package/dist/evidence-refs.js +16 -0
  47. package/dist/evidence-refs.js.map +1 -0
  48. package/dist/index.d.ts +10 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +10 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/pagination.d.ts +3 -0
  53. package/dist/pagination.d.ts.map +1 -0
  54. package/dist/pagination.js +16 -0
  55. package/dist/pagination.js.map +1 -0
  56. package/dist/subject-data.d.ts +9 -0
  57. package/dist/subject-data.d.ts.map +1 -0
  58. package/dist/subject-data.js +76 -0
  59. package/dist/subject-data.js.map +1 -0
  60. package/dist/subjects.d.ts +2 -0
  61. package/dist/subjects.d.ts.map +1 -0
  62. package/dist/subjects.js +2 -0
  63. package/dist/subjects.js.map +1 -0
  64. package/package.json +43 -0
package/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # @x12i/memorix-scoper-sdk
2
+
3
+ Trusted Memorix data access for Scoper hosts.
4
+
5
+ Scoper is a **product-content reader** aligned with Memorix land v2 (clean default): every `GET /api/data/content` call requires `objectType` + `contentType` + scope headers. Nexum graphs are fetched only as Memorix-landed `content`/`snapshots` subjects — Scoper does not land or write.
6
+
7
+ ```ts
8
+ import { createMemorixScoperClient, readSubjectData } from "@x12i/memorix-scoper-sdk";
9
+
10
+ const client = createMemorixScoperClient({
11
+ memorixBaseUrls: ["https://memorix.example"],
12
+ credentials: async () => ({ token: process.env.TOKEN }),
13
+ });
14
+ const ctx = client.forContext({ orgId, agentIds, caller, traceId });
15
+
16
+ // Product read — always OT + CT + recordId
17
+ await ctx.subjects.get({ objectType: "employees", contentType: "raw", id: "e1" });
18
+
19
+ // Structured subject dump (part 1): same address, optional extra content types
20
+ await readSubjectData(ctx, {
21
+ recordId: "e1",
22
+ objectType: "employees",
23
+ contentType: "raw",
24
+ alsoContentTypes: ["snapshots"],
25
+ });
26
+
27
+ // Nexum persist (Memorix-internal address)
28
+ await ctx.subjects.getNexumSnapshot({ id: "nexum:item-1" });
29
+ ```
@@ -0,0 +1,83 @@
1
+ {
2
+ "version": "1.0.0",
3
+ "entries": [
4
+ {
5
+ "id": "subjects.get",
6
+ "capability": "subjects.get",
7
+ "description": "Fetch a single subject content record by OT/CT/id",
8
+ "version": "1.0.0",
9
+ "enabled": true,
10
+ "epistemicDefault": "OBSERVED"
11
+ },
12
+ {
13
+ "id": "subjects.list",
14
+ "capability": "subjects.list",
15
+ "description": "List subject content records for an OT/CT",
16
+ "version": "1.0.0",
17
+ "enabled": true,
18
+ "epistemicDefault": "OBSERVED"
19
+ },
20
+ {
21
+ "id": "subjects.query",
22
+ "capability": "subjects.query",
23
+ "description": "Query subjects with optional filters (list-backed)",
24
+ "version": "1.0.0",
25
+ "enabled": true,
26
+ "epistemicDefault": "OBSERVED"
27
+ },
28
+ {
29
+ "id": "subjects.getNexumSnapshot",
30
+ "capability": "subjects.getNexumSnapshot",
31
+ "objectType": "content",
32
+ "contentType": "snapshots",
33
+ "description": "Fetch and decode memorix-nexum-persist/1 snapshot envelope",
34
+ "version": "1.0.0",
35
+ "enabled": true,
36
+ "epistemicDefault": "OBSERVED"
37
+ },
38
+ {
39
+ "id": "estate.startSession",
40
+ "capability": "estate.startSession",
41
+ "description": "Start an estate/map-store session (requires map-store transport)",
42
+ "version": "1.0.0",
43
+ "enabled": true,
44
+ "requiresFeature": "estate",
45
+ "epistemicDefault": "UNKNOWN"
46
+ },
47
+ {
48
+ "id": "estate.getBag",
49
+ "capability": "estate.getBag",
50
+ "description": "Read an estate bag from an active session",
51
+ "version": "1.0.0",
52
+ "enabled": true,
53
+ "requiresFeature": "estate",
54
+ "epistemicDefault": "OBSERVED"
55
+ },
56
+ {
57
+ "id": "estate.query",
58
+ "capability": "estate.query",
59
+ "description": "Query estate session state",
60
+ "version": "1.0.0",
61
+ "enabled": true,
62
+ "requiresFeature": "estate",
63
+ "epistemicDefault": "OBSERVED"
64
+ },
65
+ {
66
+ "id": "explore.query",
67
+ "capability": "explore.query",
68
+ "description": "Nexum explore query (feature-gated; deferred by default)",
69
+ "version": "1.0.0",
70
+ "enabled": false,
71
+ "requiresFeature": "nexum-explore",
72
+ "epistemicDefault": "INFERRED"
73
+ },
74
+ {
75
+ "id": "catalog.describe",
76
+ "capability": "catalog.describe",
77
+ "description": "Describe the embedded SDK capability catalog",
78
+ "version": "1.0.0",
79
+ "enabled": true,
80
+ "epistemicDefault": "OBSERVED"
81
+ }
82
+ ]
83
+ }
@@ -0,0 +1,20 @@
1
+ /** Require OT+CT for product content list/query (land v2 product read). */
2
+ export declare function requireContentTypePair(input: {
3
+ objectType?: string;
4
+ contentType?: string;
5
+ }): {
6
+ objectType: string;
7
+ contentType: string;
8
+ };
9
+ /** Require OT+CT+recordId for product content get (land v2; `id` is the documented alias). */
10
+ export declare function requireContentAddress(input: {
11
+ objectType?: string;
12
+ contentType?: string;
13
+ id?: string;
14
+ recordId?: string;
15
+ }): {
16
+ objectType: string;
17
+ contentType: string;
18
+ id: string;
19
+ };
20
+ //# sourceMappingURL=addressing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addressing.d.ts","sourceRoot":"","sources":["../src/addressing.ts"],"names":[],"mappings":"AAEA,2EAA2E;AAC3E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAW9C;AAED,8FAA8F;AAC9F,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAW1D"}
@@ -0,0 +1,20 @@
1
+ import { ScoperError } from "@x12i/memorix-scoper-contracts";
2
+ /** Require OT+CT for product content list/query (land v2 product read). */
3
+ export function requireContentTypePair(input) {
4
+ const objectType = String(input.objectType ?? "").trim();
5
+ const contentType = String(input.contentType ?? "").trim();
6
+ if (!objectType || !contentType) {
7
+ throw new ScoperError("INVALID_REQUEST", "Product content reads require non-empty objectType and contentType", { details: { objectType, contentType } });
8
+ }
9
+ return { objectType, contentType };
10
+ }
11
+ /** Require OT+CT+recordId for product content get (land v2; `id` is the documented alias). */
12
+ export function requireContentAddress(input) {
13
+ const { objectType, contentType } = requireContentTypePair(input);
14
+ const id = String(input.id ?? input.recordId ?? "").trim();
15
+ if (!id) {
16
+ throw new ScoperError("INVALID_REQUEST", "Product content get requires recordId (id remains a documented alias)", { details: { objectType, contentType, id } });
17
+ }
18
+ return { objectType, contentType, id };
19
+ }
20
+ //# sourceMappingURL=addressing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addressing.js","sourceRoot":"","sources":["../src/addressing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,2EAA2E;AAC3E,MAAM,UAAU,sBAAsB,CAAC,KAGtC;IACC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,IAAI,WAAW,CACnB,iBAAiB,EACjB,oEAAoE,EACpE,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,CACzC,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;AACrC,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,qBAAqB,CAAC,KAKrC;IACC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAClE,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,WAAW,CACnB,iBAAiB,EACjB,uEAAuE,EACvE,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,CAC7C,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;AACzC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { BudgetAccountant } from "./budgets.js";
2
+ export declare function asBudgetError(err: unknown): never;
3
+ export { BudgetAccountant };
4
+ //# sourceMappingURL=budget-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget-errors.d.ts","sourceRoot":"","sources":["../src/budget-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAIhD,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAMjD;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { BudgetAccountant } from "./budgets.js";
2
+ import { ScoperError } from "@x12i/memorix-scoper-contracts";
3
+ // Patch budget throws to ScoperError — keep BudgetAccountant simple and wrap at call sites in client if needed.
4
+ export function asBudgetError(err) {
5
+ const anyErr = err;
6
+ if (anyErr?.code === "BUDGET_EXCEEDED") {
7
+ throw new ScoperError("BUDGET_EXCEEDED", anyErr.message ?? "budget exceeded");
8
+ }
9
+ throw err;
10
+ }
11
+ export { BudgetAccountant };
12
+ //# sourceMappingURL=budget-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget-errors.js","sourceRoot":"","sources":["../src/budget-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,gHAAgH;AAChH,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,MAAM,MAAM,GAAG,GAA0C,CAAC;IAC1D,IAAI,MAAM,EAAE,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACvC,MAAM,IAAI,WAAW,CAAC,iBAAiB,EAAE,MAAM,CAAC,OAAO,IAAI,iBAAiB,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,GAAG,CAAC;AACZ,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,28 @@
1
+ export declare class BudgetAccountant {
2
+ private readonly caps;
3
+ private subjects;
4
+ private evidenceItems;
5
+ private parallelCalls;
6
+ private tokens;
7
+ private readonly startedAt;
8
+ constructor(caps: {
9
+ maxSubjects: number;
10
+ maxEvidenceItems: number;
11
+ maxParallelCalls: number;
12
+ maxTokens: number;
13
+ maxWallClockMs: number;
14
+ });
15
+ consumeSubjects(n: number): void;
16
+ consumeEvidence(n: number): void;
17
+ consumeParallel(n: number): void;
18
+ consumeTokens(n: number): void;
19
+ checkWallClock(): void;
20
+ snapshot(): {
21
+ subjects: number;
22
+ evidenceItems: number;
23
+ parallelCalls: number;
24
+ tokens: number;
25
+ wallClockMs: number;
26
+ };
27
+ }
28
+ //# sourceMappingURL=budgets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budgets.d.ts","sourceRoot":"","sources":["../src/budgets.ts"],"names":[],"mappings":"AAEA,qBAAa,gBAAgB;IAQzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPvB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;gBAGrB,IAAI,EAAE;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;QACzB,gBAAgB,EAAE,MAAM,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,CAAC;KACxB;IAGH,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAUhC,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAUhC,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAUhC,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAU9B,cAAc,IAAI,IAAI;IAUtB,QAAQ;;;;;;;CAST"}
@@ -0,0 +1,52 @@
1
+ import { ScoperError } from "@x12i/memorix-scoper-contracts";
2
+ export class BudgetAccountant {
3
+ caps;
4
+ subjects = 0;
5
+ evidenceItems = 0;
6
+ parallelCalls = 0;
7
+ tokens = 0;
8
+ startedAt = Date.now();
9
+ constructor(caps) {
10
+ this.caps = caps;
11
+ }
12
+ consumeSubjects(n) {
13
+ this.subjects += n;
14
+ if (this.subjects > this.caps.maxSubjects) {
15
+ throw new ScoperError("BUDGET_EXCEEDED", `subject budget exceeded: ${this.subjects} > ${this.caps.maxSubjects}`);
16
+ }
17
+ }
18
+ consumeEvidence(n) {
19
+ this.evidenceItems += n;
20
+ if (this.evidenceItems > this.caps.maxEvidenceItems) {
21
+ throw new ScoperError("BUDGET_EXCEEDED", `evidence budget exceeded: ${this.evidenceItems} > ${this.caps.maxEvidenceItems}`);
22
+ }
23
+ }
24
+ consumeParallel(n) {
25
+ this.parallelCalls = Math.max(this.parallelCalls, n);
26
+ if (n > this.caps.maxParallelCalls) {
27
+ throw new ScoperError("BUDGET_EXCEEDED", `parallel call budget exceeded: ${n} > ${this.caps.maxParallelCalls}`);
28
+ }
29
+ }
30
+ consumeTokens(n) {
31
+ this.tokens += n;
32
+ if (this.tokens > this.caps.maxTokens) {
33
+ throw new ScoperError("BUDGET_EXCEEDED", `token budget exceeded: ${this.tokens} > ${this.caps.maxTokens}`);
34
+ }
35
+ }
36
+ checkWallClock() {
37
+ const elapsed = Date.now() - this.startedAt;
38
+ if (elapsed > this.caps.maxWallClockMs) {
39
+ throw new ScoperError("BUDGET_EXCEEDED", `wall clock budget exceeded: ${elapsed}ms > ${this.caps.maxWallClockMs}ms`);
40
+ }
41
+ }
42
+ snapshot() {
43
+ return {
44
+ subjects: this.subjects,
45
+ evidenceItems: this.evidenceItems,
46
+ parallelCalls: this.parallelCalls,
47
+ tokens: this.tokens,
48
+ wallClockMs: Date.now() - this.startedAt,
49
+ };
50
+ }
51
+ }
52
+ //# sourceMappingURL=budgets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budgets.js","sourceRoot":"","sources":["../src/budgets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,MAAM,OAAO,gBAAgB;IAQR;IAPX,QAAQ,GAAG,CAAC,CAAC;IACb,aAAa,GAAG,CAAC,CAAC;IAClB,aAAa,GAAG,CAAC,CAAC;IAClB,MAAM,GAAG,CAAC,CAAC;IACF,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAExC,YACmB,IAMhB;QANgB,SAAI,GAAJ,IAAI,CAMpB;IACA,CAAC;IAEJ,eAAe,CAAC,CAAS;QACvB,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACnB,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,MAAM,IAAI,WAAW,CACnB,iBAAiB,EACjB,4BAA4B,IAAI,CAAC,QAAQ,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CACvE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,eAAe,CAAC,CAAS;QACvB,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACpD,MAAM,IAAI,WAAW,CACnB,iBAAiB,EACjB,6BAA6B,IAAI,CAAC,aAAa,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAClF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,eAAe,CAAC,CAAS;QACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACnC,MAAM,IAAI,WAAW,CACnB,iBAAiB,EACjB,kCAAkC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CACtE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,aAAa,CAAC,CAAS;QACrB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACjB,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,MAAM,IAAI,WAAW,CACnB,iBAAiB,EACjB,0BAA0B,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CACjE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,cAAc;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;QAC5C,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACvC,MAAM,IAAI,WAAW,CACnB,iBAAiB,EACjB,+BAA+B,OAAO,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAC3E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,QAAQ;QACN,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS;SACzC,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,83 @@
1
+ {
2
+ "version": "1.0.0",
3
+ "entries": [
4
+ {
5
+ "id": "subjects.get",
6
+ "capability": "subjects.get",
7
+ "description": "Fetch a single subject content record by OT/CT/id",
8
+ "version": "1.0.0",
9
+ "enabled": true,
10
+ "epistemicDefault": "OBSERVED"
11
+ },
12
+ {
13
+ "id": "subjects.list",
14
+ "capability": "subjects.list",
15
+ "description": "List subject content records for an OT/CT",
16
+ "version": "1.0.0",
17
+ "enabled": true,
18
+ "epistemicDefault": "OBSERVED"
19
+ },
20
+ {
21
+ "id": "subjects.query",
22
+ "capability": "subjects.query",
23
+ "description": "Query subjects with optional filters (list-backed)",
24
+ "version": "1.0.0",
25
+ "enabled": true,
26
+ "epistemicDefault": "OBSERVED"
27
+ },
28
+ {
29
+ "id": "subjects.getNexumSnapshot",
30
+ "capability": "subjects.getNexumSnapshot",
31
+ "objectType": "content",
32
+ "contentType": "snapshots",
33
+ "description": "Fetch and decode memorix-nexum-persist/1 snapshot envelope",
34
+ "version": "1.0.0",
35
+ "enabled": true,
36
+ "epistemicDefault": "OBSERVED"
37
+ },
38
+ {
39
+ "id": "estate.startSession",
40
+ "capability": "estate.startSession",
41
+ "description": "Start an estate/map-store session (requires map-store transport)",
42
+ "version": "1.0.0",
43
+ "enabled": true,
44
+ "requiresFeature": "estate",
45
+ "epistemicDefault": "UNKNOWN"
46
+ },
47
+ {
48
+ "id": "estate.getBag",
49
+ "capability": "estate.getBag",
50
+ "description": "Read an estate bag from an active session",
51
+ "version": "1.0.0",
52
+ "enabled": true,
53
+ "requiresFeature": "estate",
54
+ "epistemicDefault": "OBSERVED"
55
+ },
56
+ {
57
+ "id": "estate.query",
58
+ "capability": "estate.query",
59
+ "description": "Query estate session state",
60
+ "version": "1.0.0",
61
+ "enabled": true,
62
+ "requiresFeature": "estate",
63
+ "epistemicDefault": "OBSERVED"
64
+ },
65
+ {
66
+ "id": "explore.query",
67
+ "capability": "explore.query",
68
+ "description": "Nexum explore query (feature-gated; deferred by default)",
69
+ "version": "1.0.0",
70
+ "enabled": false,
71
+ "requiresFeature": "nexum-explore",
72
+ "epistemicDefault": "INFERRED"
73
+ },
74
+ {
75
+ "id": "catalog.describe",
76
+ "capability": "catalog.describe",
77
+ "description": "Describe the embedded SDK capability catalog",
78
+ "version": "1.0.0",
79
+ "enabled": true,
80
+ "epistemicDefault": "OBSERVED"
81
+ }
82
+ ]
83
+ }
@@ -0,0 +1,12 @@
1
+ import { type Catalog, type CatalogEntry, type CatalogCapability } from "@x12i/memorix-scoper-contracts";
2
+ export declare function getCatalog(): Catalog;
3
+ export declare function describeCatalog(filter?: {
4
+ capability?: CatalogCapability;
5
+ enabledOnly?: boolean;
6
+ featureFlags?: Record<string, boolean>;
7
+ }): {
8
+ version: string;
9
+ entries: CatalogEntry[];
10
+ };
11
+ export declare function requireCatalogEntry(catalogEntryId: string): CatalogEntry;
12
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACvB,MAAM,gCAAgC,CAAC;AAqBxC,wBAAgB,UAAU,IAAI,OAAO,CAGpC;AAED,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE;IACvC,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,EAAE,CAAA;CAAE,CAgB/C;AAED,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY,CASxE"}
@@ -0,0 +1,55 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { CatalogSchema, ScoperError, } from "@x12i/memorix-scoper-contracts";
5
+ function loadEmbeddedCatalog() {
6
+ const here = dirname(fileURLToPath(import.meta.url));
7
+ const candidates = [
8
+ join(here, "catalog", "catalog.v1.json"),
9
+ join(here, "..", "catalog", "catalog.v1.json"),
10
+ ];
11
+ for (const path of candidates) {
12
+ try {
13
+ const raw = JSON.parse(readFileSync(path, "utf8"));
14
+ return CatalogSchema.parse(raw);
15
+ }
16
+ catch {
17
+ // try next
18
+ }
19
+ }
20
+ throw new ScoperError("INTERNAL", "embedded catalog.v1.json not found");
21
+ }
22
+ let cached;
23
+ export function getCatalog() {
24
+ cached ??= loadEmbeddedCatalog();
25
+ return cached;
26
+ }
27
+ export function describeCatalog(filter) {
28
+ const catalog = getCatalog();
29
+ let entries = catalog.entries;
30
+ if (filter?.capability) {
31
+ entries = entries.filter((e) => e.capability === filter.capability);
32
+ }
33
+ if (filter?.enabledOnly !== false) {
34
+ entries = entries.filter((e) => e.enabled);
35
+ }
36
+ if (filter?.featureFlags) {
37
+ entries = entries.filter((e) => {
38
+ if (!e.requiresFeature)
39
+ return true;
40
+ return Boolean(filter.featureFlags?.[e.requiresFeature]);
41
+ });
42
+ }
43
+ return { version: catalog.version, entries };
44
+ }
45
+ export function requireCatalogEntry(catalogEntryId) {
46
+ const entry = getCatalog().entries.find((e) => e.id === catalogEntryId);
47
+ if (!entry) {
48
+ throw new ScoperError("CATALOG_REJECTED", `unknown catalog entry: ${catalogEntryId}`);
49
+ }
50
+ if (!entry.enabled) {
51
+ throw new ScoperError("CATALOG_REJECTED", `catalog entry disabled: ${catalogEntryId}`);
52
+ }
53
+ return entry;
54
+ }
55
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,aAAa,EACb,WAAW,GAIZ,MAAM,gCAAgC,CAAC;AAExC,SAAS,mBAAmB;IAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,iBAAiB,CAAC;QACxC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,iBAAiB,CAAC;KAC/C,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YACnD,OAAO,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,WAAW;QACb,CAAC;IACH,CAAC;IACD,MAAM,IAAI,WAAW,CAAC,UAAU,EAAE,oCAAoC,CAAC,CAAC;AAC1E,CAAC;AAED,IAAI,MAA2B,CAAC;AAEhC,MAAM,UAAU,UAAU;IACxB,MAAM,KAAK,mBAAmB,EAAE,CAAC;IACjC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAI/B;IACC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAC9B,IAAI,MAAM,EAAE,UAAU,EAAE,CAAC;QACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,MAAM,EAAE,WAAW,KAAK,KAAK,EAAE,CAAC;QAClC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,MAAM,EAAE,YAAY,EAAE,CAAC;QACzB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YAC7B,IAAI,CAAC,CAAC,CAAC,eAAe;gBAAE,OAAO,IAAI,CAAC;YACpC,OAAO,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,cAAsB;IACxD,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,CAAC;IACxE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,WAAW,CAAC,kBAAkB,EAAE,0BAA0B,cAAc,EAAE,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,IAAI,WAAW,CAAC,kBAAkB,EAAE,2BAA2B,cAAc,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,96 @@
1
+ import { type TrustedExecutionContext, type NexumPersistData, type CatalogEntry } from "@x12i/memorix-scoper-contracts";
2
+ import { type TrustedSdkConfig } from "./config.js";
3
+ import { BudgetAccountant } from "./budgets.js";
4
+ import { decodeNexumPersistRecord } from "./decoder.js";
5
+ import { subjectRef } from "./evidence-refs.js";
6
+ export interface ContextualSdk {
7
+ readonly context: TrustedExecutionContext;
8
+ readonly budgets: BudgetAccountant;
9
+ subjects: {
10
+ get(input: {
11
+ objectType: string;
12
+ contentType: string;
13
+ id: string;
14
+ }): Promise<{
15
+ record: Record<string, unknown> | null;
16
+ ref: ReturnType<typeof subjectRef>;
17
+ }>;
18
+ list(input: {
19
+ objectType: string;
20
+ contentType: string;
21
+ limit?: number;
22
+ cursor?: string;
23
+ }): Promise<{
24
+ records: Array<Record<string, unknown>>;
25
+ nextCursor: string | null;
26
+ refs: Array<ReturnType<typeof subjectRef>>;
27
+ /** Ordinary multi-page list results are not snapshot-consistent (schema §7). */
28
+ snapshotConsistent: false;
29
+ }>;
30
+ query(input: {
31
+ objectType: string;
32
+ contentType: string;
33
+ limit?: number;
34
+ filter?: Record<string, unknown>;
35
+ }): Promise<{
36
+ records: Array<Record<string, unknown>>;
37
+ refs: Array<ReturnType<typeof subjectRef>>;
38
+ snapshotConsistent: false;
39
+ }>;
40
+ /** Nexum persist is Memorix-internal: always OT `content` / CT `snapshots`. */
41
+ getNexumSnapshot(input: {
42
+ id: string;
43
+ }): Promise<{
44
+ envelope: NexumPersistData;
45
+ record: Record<string, unknown>;
46
+ decoded: ReturnType<typeof decodeNexumPersistRecord>;
47
+ }>;
48
+ };
49
+ estate: {
50
+ startSession(input?: {
51
+ bootstrap?: unknown;
52
+ }): Promise<{
53
+ sessionId: string;
54
+ }>;
55
+ getBag(input: {
56
+ sessionId: string;
57
+ bagId: string;
58
+ }): Promise<{
59
+ bagId: string;
60
+ data: unknown;
61
+ }>;
62
+ query(input: {
63
+ sessionId: string;
64
+ query: Record<string, unknown>;
65
+ }): Promise<{
66
+ results: unknown[];
67
+ }>;
68
+ };
69
+ explore: {
70
+ query(input: Record<string, unknown>): Promise<never>;
71
+ };
72
+ catalog: {
73
+ describe(filter?: {
74
+ capability?: CatalogEntry["capability"];
75
+ enabledOnly?: boolean;
76
+ }): {
77
+ version: string;
78
+ entries: CatalogEntry[];
79
+ };
80
+ };
81
+ }
82
+ export declare function createMemorixScoperClient(config: TrustedSdkConfig): {
83
+ config: TrustedSdkConfig;
84
+ baseUrl: string;
85
+ hostBudgets: {
86
+ maxSubjects: number;
87
+ maxEvidenceItems: number;
88
+ maxParallelCalls: number;
89
+ maxTokens: number;
90
+ maxWallClockMs: number;
91
+ maxEstateSessions: number;
92
+ };
93
+ forContext(context: TrustedExecutionContext): ContextualSdk;
94
+ };
95
+ export type MemorixScoperClient = ReturnType<typeof createMemorixScoperClient>;
96
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}