@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/dist/client.js ADDED
@@ -0,0 +1,315 @@
1
+ import { ScoperError, normalizeUpstreamError, NEXUM_PERSIST_OBJECT_TYPE, NEXUM_PERSIST_CONTENT_TYPE, MEMORIX_PAGE_MAX, } from "@x12i/memorix-scoper-contracts";
2
+ import { resolveBaseUrl, resolveHostBudgets, } from "./config.js";
3
+ import { BudgetAccountant } from "./budgets.js";
4
+ import { decodeNexumPersistOrThrow, decodeNexumPersistRecord } from "./decoder.js";
5
+ import { describeCatalog } from "./catalog.js";
6
+ import { subjectRef } from "./evidence-refs.js";
7
+ import { clampPageLimit } from "./pagination.js";
8
+ import { requireContentAddress, requireContentTypePair } from "./addressing.js";
9
+ async function withRetries(fn, retries) {
10
+ const maxAttempts = retries?.maxAttempts ?? 2;
11
+ const backoffMs = retries?.backoffMs ?? 50;
12
+ let last;
13
+ for (let i = 0; i < maxAttempts; i++) {
14
+ try {
15
+ return await fn();
16
+ }
17
+ catch (err) {
18
+ last = err;
19
+ const normalized = normalizeUpstreamError(err);
20
+ if (!normalized.retryable || i >= maxAttempts - 1)
21
+ throw normalized;
22
+ await new Promise((r) => setTimeout(r, backoffMs * (i + 1)));
23
+ }
24
+ }
25
+ throw normalizeUpstreamError(last);
26
+ }
27
+ async function readErrorBody(res) {
28
+ try {
29
+ return await res.json();
30
+ }
31
+ catch {
32
+ return undefined;
33
+ }
34
+ }
35
+ function throwHttpError(res, body, op) {
36
+ const code = body && typeof body === "object"
37
+ ? body.error?.code
38
+ : undefined;
39
+ if (res.status === 404 || code === "READ_NOT_FOUND") {
40
+ throw new ScoperError("READ_NOT_FOUND", `${op}: subject not found`, { details: body });
41
+ }
42
+ throw new ScoperError("UPSTREAM_UNAVAILABLE", `${op} HTTP ${res.status}`, {
43
+ details: body,
44
+ retryable: res.status >= 500,
45
+ });
46
+ }
47
+ function defaultHttpTransport(baseUrl, context, headers) {
48
+ // Caller is an application label (not authentication). Credentials/grants are separate.
49
+ const scopeHeaders = {
50
+ "x-memorix-org-id": context.orgId,
51
+ "x-memorix-agent-ids": context.agentIds.join(","),
52
+ "x-memorix-caller": context.caller,
53
+ ...headers,
54
+ };
55
+ return {
56
+ async getContent({ objectType, contentType, id }) {
57
+ const address = requireContentAddress({ objectType, contentType, id });
58
+ // Land v2: recordId is primary; id remains a documented alias.
59
+ const params = new URLSearchParams({
60
+ objectType: address.objectType,
61
+ contentType: address.contentType,
62
+ recordId: address.id,
63
+ id: address.id,
64
+ });
65
+ const res = await fetch(`${baseUrl}/api/data/content?${params}`, {
66
+ headers: scopeHeaders,
67
+ });
68
+ if (!res.ok)
69
+ throwHttpError(res, await readErrorBody(res), "getContent");
70
+ const body = (await res.json());
71
+ return { record: body.record ?? null };
72
+ },
73
+ async listContent({ objectType, contentType, limit, cursor }) {
74
+ const pair = requireContentTypePair({ objectType, contentType });
75
+ const pageLimit = clampPageLimit(limit);
76
+ const params = new URLSearchParams({
77
+ objectType: pair.objectType,
78
+ contentType: pair.contentType,
79
+ limit: String(pageLimit),
80
+ });
81
+ if (cursor)
82
+ params.set("cursor", cursor);
83
+ const res = await fetch(`${baseUrl}/api/data/content?${params}`, {
84
+ headers: scopeHeaders,
85
+ });
86
+ if (!res.ok)
87
+ throwHttpError(res, await readErrorBody(res), "listContent");
88
+ const body = (await res.json());
89
+ const records = body.records ?? [];
90
+ // Never silently truncate; reject oversized pages.
91
+ if (records.length > MEMORIX_PAGE_MAX) {
92
+ throw new ScoperError("RESULT_TOO_LARGE", `listContent returned ${records.length} records exceeding page maximum ${MEMORIX_PAGE_MAX}`);
93
+ }
94
+ return {
95
+ records,
96
+ nextCursor: body.pageInfo?.nextCursor ?? null,
97
+ };
98
+ },
99
+ };
100
+ }
101
+ async function tryCreateMemorixClientTransport(config, baseUrl, context, headers) {
102
+ if (config.createMemorixClient) {
103
+ return config.createMemorixClient({ baseUrl, context, headers });
104
+ }
105
+ if (config.memorixTransport)
106
+ return config.memorixTransport;
107
+ try {
108
+ const mod = await import("@x12i/memorix-client");
109
+ const createClient = mod
110
+ .createClient ??
111
+ mod.createMemorixClient ??
112
+ mod.default;
113
+ if (typeof createClient === "function") {
114
+ const client = createClient({
115
+ baseUrl,
116
+ orgId: context.orgId,
117
+ agentIds: context.agentIds,
118
+ caller: context.caller,
119
+ headers,
120
+ });
121
+ const explore = client?.explore ?? client;
122
+ if (explore?.getContent && explore?.listContent) {
123
+ return {
124
+ getContent: async ({ objectType, contentType, id }) => {
125
+ try {
126
+ const res = await explore.getContent({ objectType, contentType, id });
127
+ return { record: res?.record ?? res ?? null };
128
+ }
129
+ catch (err) {
130
+ throw normalizeUpstreamError(err);
131
+ }
132
+ },
133
+ listContent: async ({ objectType, contentType, limit, cursor }) => {
134
+ const pageLimit = clampPageLimit(limit);
135
+ try {
136
+ const res = await explore.listContent({
137
+ objectType,
138
+ contentType,
139
+ limit: pageLimit,
140
+ cursor,
141
+ });
142
+ const records = res?.records ?? [];
143
+ if (records.length > MEMORIX_PAGE_MAX) {
144
+ throw new ScoperError("RESULT_TOO_LARGE", `listContent returned ${records.length} records exceeding page maximum`);
145
+ }
146
+ return {
147
+ records,
148
+ nextCursor: res?.nextCursor ?? res?.pageInfo?.nextCursor ?? null,
149
+ };
150
+ }
151
+ catch (err) {
152
+ throw normalizeUpstreamError(err);
153
+ }
154
+ },
155
+ };
156
+ }
157
+ }
158
+ }
159
+ catch {
160
+ // Fall through to raw HTTP
161
+ }
162
+ return null;
163
+ }
164
+ export function createMemorixScoperClient(config) {
165
+ const baseUrl = resolveBaseUrl(config);
166
+ const hostBudgets = resolveHostBudgets(config);
167
+ return {
168
+ config,
169
+ baseUrl,
170
+ hostBudgets,
171
+ forContext(context) {
172
+ const budgets = new BudgetAccountant(hostBudgets);
173
+ let transportPromise;
174
+ const getTransport = async () => {
175
+ transportPromise ??= (async () => {
176
+ const creds = config.credentials ? await config.credentials() : {};
177
+ const headers = { ...(creds.headers ?? {}) };
178
+ if (creds.token)
179
+ headers.authorization = `Bearer ${creds.token}`;
180
+ const fromClient = await tryCreateMemorixClientTransport(config, baseUrl, context, headers);
181
+ return fromClient ?? defaultHttpTransport(baseUrl, context, headers);
182
+ })();
183
+ return transportPromise;
184
+ };
185
+ const estateOrThrow = () => {
186
+ if (!config.estateTransport) {
187
+ throw new ScoperError("ESTATE_PATH_UNAVAILABLE", "Estate/map-store excluded from this pass; path unavailable");
188
+ }
189
+ return config.estateTransport;
190
+ };
191
+ return {
192
+ context,
193
+ budgets,
194
+ subjects: {
195
+ async get({ objectType, contentType, id }) {
196
+ const address = requireContentAddress({ objectType, contentType, id });
197
+ budgets.checkWallClock();
198
+ budgets.consumeSubjects(1);
199
+ const transport = await getTransport();
200
+ const res = await withRetries(() => transport.getContent({
201
+ context,
202
+ objectType: address.objectType,
203
+ contentType: address.contentType,
204
+ id: address.id,
205
+ }), config.retries);
206
+ return {
207
+ record: res.record,
208
+ ref: subjectRef({
209
+ orgId: context.orgId,
210
+ objectType: address.objectType,
211
+ contentType: address.contentType,
212
+ recordId: address.id,
213
+ }),
214
+ };
215
+ },
216
+ async list({ objectType, contentType, limit, cursor }) {
217
+ const pair = requireContentTypePair({ objectType, contentType });
218
+ budgets.checkWallClock();
219
+ const pageLimit = clampPageLimit(limit);
220
+ const transport = await getTransport();
221
+ const res = await withRetries(() => transport.listContent({
222
+ context,
223
+ objectType: pair.objectType,
224
+ contentType: pair.contentType,
225
+ limit: pageLimit,
226
+ cursor,
227
+ }), config.retries);
228
+ budgets.consumeSubjects(res.records.length);
229
+ const refs = res.records.map((rec) => {
230
+ const recordId = String(rec.recordId ?? rec.id ?? "").trim();
231
+ return subjectRef({
232
+ orgId: context.orgId,
233
+ objectType: pair.objectType,
234
+ contentType: pair.contentType,
235
+ recordId,
236
+ });
237
+ });
238
+ return {
239
+ records: res.records,
240
+ nextCursor: res.nextCursor,
241
+ refs,
242
+ snapshotConsistent: false,
243
+ };
244
+ },
245
+ async query({ objectType, contentType, limit, filter }) {
246
+ // Ordinary multi-page query is not snapshot-consistent (schema §7).
247
+ const pair = requireContentTypePair({ objectType, contentType });
248
+ const listed = await this.list({
249
+ objectType: pair.objectType,
250
+ contentType: pair.contentType,
251
+ limit,
252
+ });
253
+ let records = listed.records;
254
+ if (filter) {
255
+ records = records.filter((rec) => Object.entries(filter).every(([k, v]) => rec[k] === v));
256
+ }
257
+ const refs = records.map((rec) => subjectRef({
258
+ orgId: context.orgId,
259
+ objectType: pair.objectType,
260
+ contentType: pair.contentType,
261
+ recordId: String(rec.recordId ?? rec.id ?? "").trim(),
262
+ }));
263
+ return { records, refs, snapshotConsistent: false };
264
+ },
265
+ async getNexumSnapshot({ id }) {
266
+ // Nexum is Memorix-internal persist: address is fixed by memorix-nexum-persist/1.
267
+ const address = requireContentAddress({
268
+ objectType: NEXUM_PERSIST_OBJECT_TYPE,
269
+ contentType: NEXUM_PERSIST_CONTENT_TYPE,
270
+ id,
271
+ });
272
+ const { record } = await this.get(address);
273
+ if (!record) {
274
+ throw new ScoperError("READ_NOT_FOUND", `nexum snapshot not found: ${address.id} (including empty-node/no-write upstream)`);
275
+ }
276
+ const decoded = decodeNexumPersistRecord(record);
277
+ const envelope = decodeNexumPersistOrThrow(record.data ?? record);
278
+ return { envelope, record, decoded };
279
+ },
280
+ },
281
+ estate: {
282
+ async startSession(input) {
283
+ budgets.checkWallClock();
284
+ return estateOrThrow().startSession({ context, bootstrap: input?.bootstrap });
285
+ },
286
+ async getBag(input) {
287
+ budgets.checkWallClock();
288
+ return estateOrThrow().getBag({ context, ...input });
289
+ },
290
+ async query(input) {
291
+ budgets.checkWallClock();
292
+ return estateOrThrow().query({ context, ...input });
293
+ },
294
+ },
295
+ explore: {
296
+ async query(_input) {
297
+ throw new ScoperError("NEXUM_EXPLORE_UNAVAILABLE", "Nexum Explore is excluded from this pass");
298
+ },
299
+ },
300
+ catalog: {
301
+ describe(filter) {
302
+ return describeCatalog({
303
+ ...filter,
304
+ featureFlags: {
305
+ estate: false,
306
+ "nexum-explore": false,
307
+ },
308
+ });
309
+ },
310
+ },
311
+ };
312
+ },
313
+ };
314
+ }
315
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import type { TrustedExecutionContext, ScoperBudgets } from "@x12i/memorix-scoper-contracts";
2
+ export type CredentialsProvider = () => Promise<{
3
+ token?: string;
4
+ headers?: Record<string, string>;
5
+ }>;
6
+ export interface EstateTransport {
7
+ startSession(input: {
8
+ context: TrustedExecutionContext;
9
+ bootstrap?: unknown;
10
+ }): Promise<{
11
+ sessionId: string;
12
+ }>;
13
+ getBag(input: {
14
+ context: TrustedExecutionContext;
15
+ sessionId: string;
16
+ bagId: string;
17
+ }): Promise<{
18
+ bagId: string;
19
+ data: unknown;
20
+ }>;
21
+ query(input: {
22
+ context: TrustedExecutionContext;
23
+ sessionId: string;
24
+ query: Record<string, unknown>;
25
+ }): Promise<{
26
+ results: unknown[];
27
+ }>;
28
+ }
29
+ export interface MemorixTransport {
30
+ getContent(input: {
31
+ context: TrustedExecutionContext;
32
+ objectType: string;
33
+ contentType: string;
34
+ id: string;
35
+ }): Promise<{
36
+ record: Record<string, unknown> | null;
37
+ }>;
38
+ listContent(input: {
39
+ context: TrustedExecutionContext;
40
+ objectType: string;
41
+ contentType: string;
42
+ limit?: number;
43
+ cursor?: string;
44
+ }): Promise<{
45
+ records: Array<Record<string, unknown>>;
46
+ nextCursor: string | null;
47
+ }>;
48
+ }
49
+ export interface TrustedSdkConfig {
50
+ /** Allowlisted Memorix base URL(s). Never taken from ScopeRequest. */
51
+ memorixBaseUrls: string[];
52
+ /** Selected base URL index or exact URL that must be in the allowlist. */
53
+ memorixBaseUrl?: string;
54
+ credentials?: CredentialsProvider;
55
+ retries?: {
56
+ maxAttempts?: number;
57
+ backoffMs?: number;
58
+ };
59
+ budgets?: Partial<ScoperBudgets>;
60
+ features?: {
61
+ estate?: boolean;
62
+ nexumExplore?: boolean;
63
+ };
64
+ /** Injected for tests / when map-store docs are available. */
65
+ estateTransport?: EstateTransport;
66
+ /** Override Memorix HTTP transport (tests / custom clients). */
67
+ memorixTransport?: MemorixTransport;
68
+ /** Optional factory wrapping @x12i/memorix-client. */
69
+ createMemorixClient?: (opts: {
70
+ baseUrl: string;
71
+ context: TrustedExecutionContext;
72
+ headers: Record<string, string>;
73
+ }) => MemorixTransport;
74
+ }
75
+ export declare function resolveBaseUrl(config: TrustedSdkConfig): string;
76
+ export declare function resolveHostBudgets(config: TrustedSdkConfig): ScoperBudgets;
77
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/config.js ADDED
@@ -0,0 +1,15 @@
1
+ import { DEFAULT_SCOPER_BUDGETS } from "@x12i/memorix-scoper-contracts";
2
+ export function resolveBaseUrl(config) {
3
+ if (!config.memorixBaseUrls.length) {
4
+ throw new Error("TrustedSdkConfig.memorixBaseUrls must be non-empty");
5
+ }
6
+ const preferred = config.memorixBaseUrl ?? config.memorixBaseUrls[0];
7
+ if (!config.memorixBaseUrls.includes(preferred)) {
8
+ throw new Error(`memorixBaseUrl "${preferred}" is not in allowlist`);
9
+ }
10
+ return preferred;
11
+ }
12
+ export function resolveHostBudgets(config) {
13
+ return { ...DEFAULT_SCOPER_BUDGETS, ...config.budgets };
14
+ }
15
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAgExE,MAAM,UAAU,cAAc,CAAC,MAAwB;IACrD,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,eAAe,CAAC,CAAC,CAAE,CAAC;IACtE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,uBAAuB,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAwB;IACzD,OAAO,EAAE,GAAG,sBAAsB,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type NexumPersistData, type NexumPersistRecord } from "@x12i/memorix-scoper-contracts";
2
+ export type DecoderResult = {
3
+ ok: true;
4
+ record: NexumPersistRecord;
5
+ envelope: NexumPersistData;
6
+ } | {
7
+ ok: false;
8
+ code: "UNSUPPORTED_CONTRACT_VERSION" | "UPSTREAM_CONTRACT_MISMATCH" | "DECODER_REJECTED";
9
+ reason: string;
10
+ };
11
+ /**
12
+ * Decode a stored Memorix subject for memorix-nexum-persist/1 per the normative schema.
13
+ * Preserves proposed/non-authoritative graph meaning (analyze draft, not explore truth).
14
+ */
15
+ export declare function decodeNexumPersistRecord(raw: unknown): NexumPersistRecord;
16
+ /** Decode fixture `expectedStored` (recordId may be omitted). */
17
+ export declare function decodeNexumPersistExpectedStored(expectedStored: unknown): NexumPersistRecord;
18
+ /** Result-style API used by existing call sites. Accepts full record or data-only object. */
19
+ export declare function decodeNexumPersistEnvelope(data: unknown): DecoderResult;
20
+ export declare function decodeNexumPersistOrThrow(data: unknown): NexumPersistData;
21
+ //# sourceMappingURL=decoder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decoder.d.ts","sourceRoot":"","sources":["../src/decoder.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EAExB,MAAM,gCAAgC,CAAC;AAExC,MAAM,MAAM,aAAa,GACrB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAC;IAAC,QAAQ,EAAE,gBAAgB,CAAA;CAAE,GACpE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,8BAA8B,GAAG,4BAA4B,GAAG,kBAAkB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAwB5H;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,CAmHzE;AAED,iEAAiE;AACjE,wBAAgB,gCAAgC,CAAC,cAAc,EAAE,OAAO,GAAG,kBAAkB,CAS5F;AAED,6FAA6F;AAC7F,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CAwBvE;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAMzE"}
@@ -0,0 +1,145 @@
1
+ import { ScoperError, NEXUM_PERSIST_CONTRACT_VERSION, NEXUM_PERSIST_KIND, NEXUM_PERSIST_SERVICE_ID, NEXUM_PERSIST_OBJECT_TYPE, NEXUM_PERSIST_CONTENT_TYPE, } from "@x12i/memorix-scoper-contracts";
2
+ function asRecord(value) {
3
+ return value && typeof value === "object" && !Array.isArray(value)
4
+ ? value
5
+ : null;
6
+ }
7
+ function normalizeProposedGraph(raw) {
8
+ const g = asRecord(raw);
9
+ if (!g) {
10
+ throw new ScoperError("UPSTREAM_CONTRACT_MISMATCH", "data.proposedGraph must be an object");
11
+ }
12
+ if (!Array.isArray(g.nodes)) {
13
+ throw new ScoperError("UPSTREAM_CONTRACT_MISMATCH", "data.proposedGraph.nodes must be an array");
14
+ }
15
+ return {
16
+ nodes: g.nodes,
17
+ edges: Array.isArray(g.edges) ? g.edges : [],
18
+ unresolvedMentions: Array.isArray(g.unresolvedMentions) ? g.unresolvedMentions : [],
19
+ edgeCandidates: Array.isArray(g.edgeCandidates) ? g.edgeCandidates : [],
20
+ };
21
+ }
22
+ /**
23
+ * Decode a stored Memorix subject for memorix-nexum-persist/1 per the normative schema.
24
+ * Preserves proposed/non-authoritative graph meaning (analyze draft, not explore truth).
25
+ */
26
+ export function decodeNexumPersistRecord(raw) {
27
+ const rec = asRecord(raw);
28
+ if (!rec) {
29
+ throw new ScoperError("UPSTREAM_CONTRACT_MISMATCH", "Nexum persist record must be an object");
30
+ }
31
+ const dataRaw = asRecord(rec.data);
32
+ if (!dataRaw) {
33
+ throw new ScoperError("UPSTREAM_CONTRACT_MISMATCH", "Missing data object on Nexum persist record");
34
+ }
35
+ if (dataRaw.contractVersion !== NEXUM_PERSIST_CONTRACT_VERSION) {
36
+ throw new ScoperError("UNSUPPORTED_CONTRACT_VERSION", `Unsupported contractVersion: ${String(dataRaw.contractVersion)}`, { details: { expected: NEXUM_PERSIST_CONTRACT_VERSION, actual: dataRaw.contractVersion } });
37
+ }
38
+ if (dataRaw.kind !== NEXUM_PERSIST_KIND) {
39
+ throw new ScoperError("UPSTREAM_CONTRACT_MISMATCH", `data.kind must be "${NEXUM_PERSIST_KIND}"`, { details: { actual: dataRaw.kind } });
40
+ }
41
+ if (dataRaw.serviceId !== NEXUM_PERSIST_SERVICE_ID) {
42
+ throw new ScoperError("UPSTREAM_CONTRACT_MISMATCH", `data.serviceId must be "${NEXUM_PERSIST_SERVICE_ID}"`, { details: { actual: dataRaw.serviceId } });
43
+ }
44
+ const proposedGraph = normalizeProposedGraph(dataRaw.proposedGraph);
45
+ if (!Array.isArray(dataRaw.sourceRefs)) {
46
+ throw new ScoperError("UPSTREAM_CONTRACT_MISMATCH", "data.sourceRefs must be an array");
47
+ }
48
+ if (typeof dataRaw.nodeCount !== "number" || !Number.isFinite(dataRaw.nodeCount)) {
49
+ throw new ScoperError("UPSTREAM_CONTRACT_MISMATCH", "data.nodeCount must be a number");
50
+ }
51
+ if (typeof dataRaw.edgeCount !== "number" || !Number.isFinite(dataRaw.edgeCount)) {
52
+ throw new ScoperError("UPSTREAM_CONTRACT_MISMATCH", "data.edgeCount must be a number");
53
+ }
54
+ if (dataRaw.nodeCount !== proposedGraph.nodes.length) {
55
+ throw new ScoperError("UPSTREAM_CONTRACT_MISMATCH", "data.nodeCount must equal proposedGraph.nodes.length", { details: { nodeCount: dataRaw.nodeCount, nodes: proposedGraph.nodes.length } });
56
+ }
57
+ if (dataRaw.edgeCount !== proposedGraph.edges.length) {
58
+ throw new ScoperError("UPSTREAM_CONTRACT_MISMATCH", "data.edgeCount must equal proposedGraph.edges.length", { details: { edgeCount: dataRaw.edgeCount, edges: proposedGraph.edges.length } });
59
+ }
60
+ let diagnostics;
61
+ if (dataRaw.diagnostics !== undefined) {
62
+ const d = asRecord(dataRaw.diagnostics);
63
+ if (!d) {
64
+ throw new ScoperError("UPSTREAM_CONTRACT_MISMATCH", "data.diagnostics must be an object when present");
65
+ }
66
+ diagnostics = d;
67
+ }
68
+ const data = {
69
+ contractVersion: NEXUM_PERSIST_CONTRACT_VERSION,
70
+ kind: NEXUM_PERSIST_KIND,
71
+ serviceId: NEXUM_PERSIST_SERVICE_ID,
72
+ proposedGraph,
73
+ sourceRefs: dataRaw.sourceRefs.map((s) => String(s)),
74
+ nodeCount: dataRaw.nodeCount,
75
+ edgeCount: dataRaw.edgeCount,
76
+ ...(diagnostics ? { diagnostics } : {}),
77
+ };
78
+ const recordId = String(rec.recordId ?? rec.id ?? "").trim();
79
+ if (!recordId) {
80
+ throw new ScoperError("UPSTREAM_CONTRACT_MISMATCH", "Nexum persist record requires non-empty recordId (org-wide subject id; never a bare provider item id alone)");
81
+ }
82
+ const objectType = typeof rec.objectType === "string" && rec.objectType.trim()
83
+ ? rec.objectType.trim()
84
+ : NEXUM_PERSIST_OBJECT_TYPE;
85
+ const contentType = typeof rec.contentType === "string" && rec.contentType.trim()
86
+ ? rec.contentType.trim()
87
+ : NEXUM_PERSIST_CONTENT_TYPE;
88
+ if (objectType !== NEXUM_PERSIST_OBJECT_TYPE || contentType !== NEXUM_PERSIST_CONTENT_TYPE) {
89
+ throw new ScoperError("UPSTREAM_CONTRACT_MISMATCH", `Nexum persist address must be ${NEXUM_PERSIST_OBJECT_TYPE}/${NEXUM_PERSIST_CONTENT_TYPE}`, { details: { objectType, contentType } });
90
+ }
91
+ return {
92
+ format: typeof rec.format === "string" ? rec.format : undefined,
93
+ recordId,
94
+ objectType,
95
+ contentType,
96
+ dataCategory: typeof rec.dataCategory === "string" ? rec.dataCategory : undefined,
97
+ data,
98
+ concept: asRecord(rec.concept) ?? undefined,
99
+ _system: asRecord(rec._system) ?? undefined,
100
+ };
101
+ }
102
+ /** Decode fixture `expectedStored` (recordId may be omitted). */
103
+ export function decodeNexumPersistExpectedStored(expectedStored) {
104
+ const stored = asRecord(expectedStored);
105
+ if (!stored) {
106
+ throw new ScoperError("UPSTREAM_CONTRACT_MISMATCH", "expectedStored must be an object");
107
+ }
108
+ return decodeNexumPersistRecord({
109
+ recordId: typeof stored.recordId === "string" ? stored.recordId : "fixture:expectedStored",
110
+ ...stored,
111
+ });
112
+ }
113
+ /** Result-style API used by existing call sites. Accepts full record or data-only object. */
114
+ export function decodeNexumPersistEnvelope(data) {
115
+ try {
116
+ const asData = asRecord(data);
117
+ const raw = asData && asData.contractVersion !== undefined && asData.proposedGraph !== undefined && !asData.data
118
+ ? {
119
+ recordId: "envelope:data-only",
120
+ objectType: NEXUM_PERSIST_OBJECT_TYPE,
121
+ contentType: NEXUM_PERSIST_CONTENT_TYPE,
122
+ data: asData,
123
+ }
124
+ : data;
125
+ const record = decodeNexumPersistRecord(raw);
126
+ return { ok: true, record, envelope: record.data };
127
+ }
128
+ catch (err) {
129
+ if (err instanceof ScoperError) {
130
+ const code = err.code === "UNSUPPORTED_CONTRACT_VERSION" || err.code === "UPSTREAM_CONTRACT_MISMATCH"
131
+ ? err.code
132
+ : "DECODER_REJECTED";
133
+ return { ok: false, code, reason: err.message };
134
+ }
135
+ return { ok: false, code: "DECODER_REJECTED", reason: String(err) };
136
+ }
137
+ }
138
+ export function decodeNexumPersistOrThrow(data) {
139
+ const result = decodeNexumPersistEnvelope(data);
140
+ if (!result.ok) {
141
+ throw new ScoperError(result.code, result.reason, { details: { data } });
142
+ }
143
+ return result.envelope;
144
+ }
145
+ //# sourceMappingURL=decoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decoder.js","sourceRoot":"","sources":["../src/decoder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export declare const NEXUM_PERSIST_CONTRACT = "memorix-nexum-persist/1";
2
+ /**
3
+ * Production decoder remains unavailable until these locked artifacts exist:
4
+ * - docs/nexum-persistence-schema.md
5
+ * - docs/fixtures/nexum-persist-roundtrip.json
6
+ * Searched x12i org; neither file nor the string `memorix-nexum-persist` was found.
7
+ */
8
+ export declare const NEXUM_PERSIST_DECODER_AVAILABLE = false;
9
+ export type MinimalNexumPersistRecord = {
10
+ format?: string;
11
+ recordId: string;
12
+ objectType?: string;
13
+ contentType?: string;
14
+ data: {
15
+ serviceId: string;
16
+ contractVersion: typeof NEXUM_PERSIST_CONTRACT;
17
+ [key: string]: unknown;
18
+ };
19
+ _system?: Record<string, unknown>;
20
+ };
21
+ export declare function assertNexumPersistDecoderAvailable(): void;
22
+ /**
23
+ * Structural envelope gate used only after normative schema is unlocked.
24
+ * Does NOT invent domain fields. Currently blocked via assertNexumPersistDecoderAvailable().
25
+ */
26
+ export declare function decodeNexumPersist(raw: unknown): MinimalNexumPersistRecord;
27
+ /**
28
+ * @internal TEST/scaffold only — not a substitute for the missing normative schema.
29
+ * Rejects unknown contract versions; does not claim full memorix-nexum-persist/1 compliance.
30
+ */
31
+ export declare function decodeNexumPersistEnvelopeUnchecked(raw: unknown): MinimalNexumPersistRecord;
32
+ //# sourceMappingURL=decoders.d.ts.map