@x12i/memorix-service 0.2.0 → 3.0.1

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 CHANGED
@@ -1,21 +1,19 @@
1
- # @x12i/memorix-service
1
+ # `@x12i/memorix-service`
2
2
 
3
3
  Sole production **HTTP composition root** over accepted Memorix packages.
4
4
 
5
- ## Scope
5
+ Remote apps should **call** this service over HTTP — not reinvent wiring by installing every engine. Running the process (or a hosted deployment) is the product surface.
6
6
 
7
- Every `/api/*` request requires:
8
-
9
- - `x-memorix-org-id` — organization data universe
10
- - `x-memorix-agent-ids` — comma-separated agent ids (effective metadata)
11
-
12
- Singular `agentId` headers are rejected.
7
+ ## Install / run
13
8
 
14
- ## Run
9
+ ```bash
10
+ npm install @x12i/memorix-service@3.0.0 # composition library / CLI
11
+ ```
15
12
 
16
13
  Prefer the monorepo stack (service + Studio + ops-source):
17
14
 
18
15
  ```bash
16
+ # from repo root
19
17
  node scripts/dev-stack.mjs
20
18
  ```
21
19
 
@@ -26,28 +24,79 @@ MEMORIX_SERVICE_MODE=prod MONGO_URI=mongodb://127.0.0.1:27017 npm run serve
26
24
  MEMORIX_SERVICE_MODE=dev npm run dev # metadata in-memory; durable routes 503 without Mongo
27
25
  ```
28
26
 
29
- Default port: **5000** (`MEMORIX_SERVICE_PORT`, Memorix strip 5000–5099, even = API).
30
- OpenAPI: `GET /api/openapi.json` → http://127.0.0.1:5000/api/openapi.json
27
+ | | |
28
+ |--|--|
29
+ | Default port | **5100** (`MEMORIX_SERVICE_PORT`) |
30
+ | OpenAPI | `GET /api/openapi.json` |
31
31
 
32
- ## Route families
32
+ ## Library exports
33
+
34
+ When embedding the composition root in-process:
35
+
36
+ ```ts
37
+ import {
38
+ createMemorixPlatform,
39
+ createMemorixServiceApp,
40
+ startMemorixServiceHttp,
41
+ } from "@x12i/memorix-service";
42
+ ```
43
+
44
+ ## Scope headers
33
45
 
34
- `/api/metadata` · `/api/data` · `/api/relationships` · `/api/memory` · `/api/pipelines` · `/api/operations` · `/api/workflow` · `/api/intelligence`
46
+ Every `/api/*` request requires:
47
+
48
+ ```http
49
+ x-memorix-org-id: g12ops-demo
50
+ x-memorix-agent-ids: ops
51
+ ```
52
+
53
+ Singular `agentId` headers are rejected. `agentIds[]` selects **effective metadata**; `orgId` selects the **data** universe.
54
+
55
+ ### Minimal curl
35
56
 
36
- Metadata highlights:
57
+ ```bash
58
+ curl -s http://127.0.0.1:5100/health
59
+ curl -s http://127.0.0.1:5100/api/diagnostics/scope \
60
+ -H 'x-memorix-org-id: g12ops-demo' \
61
+ -H 'x-memorix-agent-ids: ops'
62
+ ```
37
63
 
38
- - `GET /api/metadata/kinds` — built-in kinds + effective custom kind-declarations
39
- - `GET /api/metadata/kinds/:kind` — items for a built-in or namespaced custom kind
40
- - Custom kinds are **store/resolve only** (engines do not interpret them)
64
+ ## Route families
65
+
66
+ | Family | Role |
67
+ |--------|------|
68
+ | `/api/metadata` | Kinds, definitions, install/publish |
69
+ | `/api/data` | Content get/list/write, compose, abstract |
70
+ | `/api/relationships` | Query / discover / verify / rebuild (**no** ad-hoc link PUT) |
71
+ | `/api/memory` | Pull, raw, sources, runs |
72
+ | `/api/pipelines` | Definitions, start, runs, retry/resume |
73
+ | `/api/operations` | Operational helpers |
74
+ | `/api/workflow` | Workflow sibling content |
75
+ | `/api/intelligence` | Profiles / proposals (never auto-install) |
76
+ | `/api/data-journey` | Evidence cone + expected-vs-filled coverage |
77
+
78
+ ### Data journey (read-only)
79
+
80
+ | Method | Path |
81
+ |--------|------|
82
+ | `GET` | `/api/data-journey/object-types` |
83
+ | `GET` | `/api/data-journey/journeys` |
84
+ | `POST` | `/api/data-journey/matrix/query` |
85
+ | `POST` | `/api/data-journey/matrix/columns/query` |
86
+ | `POST` | `/api/data-journey/matrix/cells/query` |
87
+ | `GET` | `/api/data-journey/evidence/:evidenceRef` |
88
+ | `GET` | `/api/data-journey/expected-slots` |
89
+ | `POST` | `/api/data-journey/coverage` |
41
90
 
42
91
  ## Hard rules
43
92
 
44
93
  - Prod rejects missing Mongo and in-memory durable fallbacks
45
- - No ad-hoc relationship link mutation (`/api/relationships/links` → 405)
94
+ - `/api/relationships/links` → **405** (no ad-hoc link mutation)
46
95
  - Intelligence never auto-installs/publishes
47
96
  - Only `credentialRef` may cross Memory APIs
48
97
 
49
- Ebooks: [Platform Overview](../new-ebooks/00-platform-overview/) · [Runtime Data Client](../new-ebooks/02-runtime-data-client/)
50
-
51
- ---
98
+ ## Docs
52
99
 
53
- **Ebooks:** [https://ebooks.memorix.x12i.com](https://ebooks.memorix.x12i.com) · in-repo [`../new-ebooks/`](../new-ebooks/)
100
+ - [`documentation/http-api.md`](../documentation/http-api.md) · OpenAPI in-repo [`openapi/openapi.json`](./openapi/openapi.json)
101
+ - Ebooks: [Platform Overview](../new-ebooks/00-platform-overview/) · [Services](../new-ebooks/07-services/) · [Runtime Data Client](../new-ebooks/02-runtime-data-client/)
102
+ - Hub: [https://ebooks.memorix.x12i.com](https://ebooks.memorix.x12i.com)
package/dist/app.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAIA,OAAO,OAAO,EAAE,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAGxD,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AAavB,MAAM,MAAM,8BAA8B,GAAG,YAAY,GAAG;IAC1D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B,CAAC;AAEF,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,8BAA8B,GACnC,OAAO,CAAC;IAAE,GAAG,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE,CAAC,CAiD9D;AAED,MAAM,MAAM,0BAA0B,GAAG,8BAA8B,GAAG;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,0BAA0B;;;;;GAM7E"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAIA,OAAO,OAAO,EAAE,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAIxD,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AAevB,MAAM,MAAM,8BAA8B,GAAG,YAAY,GAAG;IAC1D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B,CAAC;AAEF,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,8BAA8B,GACnC,OAAO,CAAC;IAAE,GAAG,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE,CAAC,CAuE9D;AAED,MAAM,MAAM,0BAA0B,GAAG,8BAA8B,GAAG;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,0BAA0B;;;;;GAM7E"}
package/dist/app.js CHANGED
@@ -4,6 +4,7 @@ import { dirname, resolve } from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
5
  import Fastify from "fastify";
6
6
  import cors from "@fastify/cors";
7
+ import { attachFastifyLiveView } from "@x12i/api-live-view/fastify";
7
8
  import { mapErrorToHttp, redactSecrets } from "./errors.js";
8
9
  import { createMemorixPlatform, } from "./platform.js";
9
10
  import { resolveScope } from "./request-scope.js";
@@ -15,6 +16,8 @@ import { registerPipelineRoutes } from "./routes/pipelines.js";
15
16
  import { registerOperationsRoutes } from "./routes/operations.js";
16
17
  import { registerWorkflowRoutes } from "./routes/workflow.js";
17
18
  import { registerIntelligenceRoutes } from "./routes/intelligence.js";
19
+ import { registerDataJourneyRoutes } from "./routes/data-journey.js";
20
+ import { memorixLiveRing } from "./live.js";
18
21
  const __dirname = dirname(fileURLToPath(import.meta.url));
19
22
  export async function createMemorixServiceApp(opts) {
20
23
  const platform = opts.platform ?? (await createMemorixPlatform(opts));
@@ -27,6 +30,26 @@ export async function createMemorixServiceApp(opts) {
27
30
  req.correlationId = correlationId;
28
31
  reply.header("x-correlation-id", correlationId);
29
32
  });
33
+ const port = Number(process.env.MEMORIX_SERVICE_PORT ?? 5100);
34
+ await attachFastifyLiveView(app, {
35
+ ring: memorixLiveRing,
36
+ service: {
37
+ id: "@x12i/memorix-service",
38
+ title: "Memorix Service",
39
+ kind: "api",
40
+ port,
41
+ env: "MEMORIX_SERVICE_PORT",
42
+ origin: `http://127.0.0.1:${port}/`,
43
+ healthPath: "/health",
44
+ docsUrl: `http://127.0.0.1:${port}/api/openapi.json`,
45
+ description: "Sole HTTP composition root",
46
+ },
47
+ getHealth: async () => ({
48
+ ok: true,
49
+ service: "@x12i/memorix-service",
50
+ mode: platform.mode,
51
+ }),
52
+ });
30
53
  app.setErrorHandler((err, req, reply) => {
31
54
  const correlationId = req.correlationId ?? randomUUID();
32
55
  const mapped = mapErrorToHttp(err, correlationId);
@@ -55,11 +78,12 @@ export async function createMemorixServiceApp(opts) {
55
78
  await registerOperationsRoutes(app, platform);
56
79
  await registerWorkflowRoutes(app, platform);
57
80
  await registerIntelligenceRoutes(app, platform);
81
+ await registerDataJourneyRoutes(app, platform);
58
82
  return { app, platform };
59
83
  }
60
84
  export async function startMemorixServiceHttp(opts) {
61
85
  const { app, platform } = await createMemorixServiceApp(opts);
62
- const port = opts.port ?? Number(process.env.MEMORIX_SERVICE_PORT ?? 5000);
86
+ const port = opts.port ?? Number(process.env.MEMORIX_SERVICE_PORT ?? 5100);
63
87
  const host = opts.host ?? "127.0.0.1";
64
88
  await app.listen({ port, host });
65
89
  return { app, platform, port, host };
package/dist/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { type JourneyBasis, type JourneyObservation, type MatrixGranularity, type MatrixResponse, type PartialTruthReason } from "@x12i/memorix-data-journey";
2
+ import type { MemorixPlatform } from "../platform.js";
3
+ import type { MemorixScope } from "../scope.js";
4
+ /**
5
+ * Collect journey observations for run and/or record basis.
6
+ * Prefers live ports; optional fixtureName loads golden observations (Studio demos / tests).
7
+ */
8
+ export declare function collectJourneyObservations(platform: MemorixPlatform, scope: MemorixScope, input: {
9
+ objectType: string;
10
+ runId?: string;
11
+ recordId?: string;
12
+ fixtureName?: string;
13
+ includeCompose?: boolean;
14
+ }): Promise<{
15
+ observations: JourneyObservation[];
16
+ partialReasons: PartialTruthReason[];
17
+ basis: JourneyBasis;
18
+ }>;
19
+ export declare function queryJourneyMatrix(platform: MemorixPlatform, scope: MemorixScope, body: {
20
+ objectType?: string;
21
+ basis?: {
22
+ kind?: string;
23
+ runId?: string;
24
+ recordId?: string;
25
+ fixtureName?: string;
26
+ };
27
+ granularity?: MatrixGranularity;
28
+ includeValues?: boolean;
29
+ includeSystem?: boolean;
30
+ includeRawProperties?: boolean;
31
+ expandPath?: string;
32
+ includeCompose?: boolean;
33
+ }): Promise<MatrixResponse & {
34
+ observations?: JourneyObservation[];
35
+ }>;
36
+ export declare function resolveJourneyEvidence(observations: JourneyObservation[], evidenceRef: string, includeValues: boolean): {
37
+ origin: import("@x12i/memorix-data-journey").CellOrigin;
38
+ path: string;
39
+ valueKind?: import("@x12i/memorix-data-journey").CellValueKind;
40
+ visibility: import("@x12i/memorix-data-journey").CellVisibility;
41
+ contentType?: string;
42
+ recordId?: string;
43
+ revision?: number;
44
+ dataCategory?: string;
45
+ service?: string;
46
+ phase?: string;
47
+ runId?: string;
48
+ attemptId?: string;
49
+ artifactRef?: string;
50
+ mutationRef?: string;
51
+ persistedAtThisCheckpoint?: boolean;
52
+ } | null;
53
+ //# sourceMappingURL=collect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect.d.ts","sourceRoot":"","sources":["../../src/journey/collect.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA0ChD;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE;IACL,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GACA,OAAO,CAAC;IACT,YAAY,EAAE,kBAAkB,EAAE,CAAC;IACnC,cAAc,EAAE,kBAAkB,EAAE,CAAC;IACrC,KAAK,EAAE,YAAY,CAAC;CACrB,CAAC,CAyLD;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE;IACJ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE;QACN,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GACA,OAAO,CAAC,cAAc,GAAG;IAAE,YAAY,CAAC,EAAE,kBAAkB,EAAE,CAAA;CAAE,CAAC,CA6BnE;AAED,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,kBAAkB,EAAE,EAClC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,OAAO;;;;;;;;;;;;;;;;SASvB"}
@@ -0,0 +1,220 @@
1
+ import { attemptToObservations, composeToObservations, linkToDatabaseObservation, loadFixtureObservations, projectMatrix, queryEvidence, recordToDatabaseObservation, } from "@x12i/memorix-data-journey";
2
+ import { ServiceError } from "../errors.js";
3
+ function isDataRef(v) {
4
+ return (typeof v === "object" &&
5
+ v !== null &&
6
+ "artifactId" in v &&
7
+ typeof v.artifactId === "string");
8
+ }
9
+ async function resolveAttemptOutput(platform, scope, output) {
10
+ if (output === undefined)
11
+ return {};
12
+ if (!isDataRef(output))
13
+ return { resolved: output };
14
+ const artifactId = String(output.artifactId);
15
+ try {
16
+ const ledger = platform.pipelineLedgerFor(scope.orgId);
17
+ const art = await ledger.artifacts?.get(scope.orgId, artifactId);
18
+ if (art?.data !== undefined)
19
+ return { resolved: art.data };
20
+ }
21
+ catch {
22
+ /* fall through */
23
+ }
24
+ return {
25
+ partial: {
26
+ code: "missing-artifact",
27
+ message: `DataRef artifact ${artifactId} could not be resolved`,
28
+ },
29
+ };
30
+ }
31
+ /**
32
+ * Collect journey observations for run and/or record basis.
33
+ * Prefers live ports; optional fixtureName loads golden observations (Studio demos / tests).
34
+ */
35
+ export async function collectJourneyObservations(platform, scope, input) {
36
+ if (input.fixtureName) {
37
+ const observations = loadFixtureObservations(input.fixtureName).filter((o) => o.objectType === input.objectType);
38
+ return {
39
+ observations,
40
+ partialReasons: [],
41
+ basis: {
42
+ kind: input.runId ? "run" : "record",
43
+ runId: input.runId ?? "run-proc-2",
44
+ recordId: input.recordId ?? "PROC-2",
45
+ resolvedAt: new Date().toISOString(),
46
+ },
47
+ };
48
+ }
49
+ const ports = platform.portsFor(scope);
50
+ const observations = [];
51
+ const partialReasons = [];
52
+ let seq = 10;
53
+ const now = new Date().toISOString();
54
+ let runId = input.runId;
55
+ if (!runId && input.recordId) {
56
+ // latest-run: pick most recent run that mentions this org
57
+ const runs = await ports.pipeline.listRuns({ limit: 50 });
58
+ runId = runs[0]?.runId;
59
+ }
60
+ if (runId) {
61
+ const attempts = await ports.pipeline.getStepAttempts(runId);
62
+ attempts.sort((a, b) => String(a.startedAt).localeCompare(String(b.startedAt)) ||
63
+ a.attemptNumber - b.attemptNumber);
64
+ for (const attempt of attempts) {
65
+ const { resolved, partial } = await resolveAttemptOutput(platform, scope, attempt.output);
66
+ if (partial)
67
+ partialReasons.push(partial);
68
+ const role = attempt.stepKind === "relationship-discover"
69
+ ? "relationship-candidate"
70
+ : attempt.stepKind === "compose"
71
+ ? "composition"
72
+ : attempt.stepKind === "map-normalize"
73
+ ? "mapped"
74
+ : attempt.stepKind;
75
+ const { observations: obs, partialReasons: pr } = attemptToObservations({
76
+ attemptId: attempt.attemptId,
77
+ runId: attempt.runId,
78
+ stepId: attempt.stepId,
79
+ stepKind: attempt.stepKind,
80
+ attemptNumber: attempt.attemptNumber,
81
+ status: attempt.status,
82
+ output: attempt.output,
83
+ mutationRefs: attempt.mutationRefs,
84
+ startedAt: attempt.startedAt,
85
+ finishedAt: attempt.finishedAt,
86
+ error: attempt.error,
87
+ }, {
88
+ objectType: input.objectType,
89
+ recordId: input.recordId,
90
+ sequence: seq,
91
+ resolvedOutput: resolved,
92
+ outputRole: role,
93
+ targetContentType: attempt.stepKind === "write-record" ? "snapshots" : undefined,
94
+ relationshipGroup: "link",
95
+ });
96
+ observations.push(...obs);
97
+ partialReasons.push(...pr);
98
+ seq += 10;
99
+ }
100
+ }
101
+ if (input.recordId) {
102
+ const composed = await ports.reader.composeSubject(scope, {
103
+ recordId: input.recordId,
104
+ objectType: input.objectType,
105
+ });
106
+ const contents = composed
107
+ .contents;
108
+ if (contents) {
109
+ for (const [ct, records] of Object.entries(contents)) {
110
+ const list = Array.isArray(records) ? records : [records];
111
+ for (const rec of list) {
112
+ if (!rec || typeof rec !== "object")
113
+ continue;
114
+ observations.push(recordToDatabaseObservation(rec, {
115
+ observationId: `db-${input.recordId}-${ct}-${seq}`,
116
+ sequence: seq,
117
+ occurredAt: now,
118
+ phase: ct === "raw" ? "memory-raw" : `${ct}-stored`,
119
+ runId,
120
+ includeValues: false,
121
+ }));
122
+ seq += 1;
123
+ }
124
+ }
125
+ }
126
+ if (input.includeCompose !== false) {
127
+ observations.push(...composeToObservations({
128
+ recordId: input.recordId,
129
+ objectType: input.objectType,
130
+ contents: contents,
131
+ }, {
132
+ sequence: seq,
133
+ occurredAt: now,
134
+ objectType: input.objectType,
135
+ runId,
136
+ }));
137
+ seq += 10;
138
+ }
139
+ try {
140
+ const rels = await ports.reader.getRelationships(scope, input.recordId, {
141
+ include: true,
142
+ });
143
+ for (const item of rels.items ?? []) {
144
+ const link = item;
145
+ if (!link.relationshipId)
146
+ continue;
147
+ observations.push(linkToDatabaseObservation({
148
+ relationshipId: link.relationshipId,
149
+ relationshipDefinitionId: link.relationshipDefinitionId ??
150
+ link.definitionId ??
151
+ "unknown",
152
+ fromRecordId: link.fromRecordId ?? input.recordId,
153
+ toRecordId: link.toRecordId ?? "",
154
+ }, {
155
+ observationId: `rel-${link.relationshipId}`,
156
+ objectType: input.objectType,
157
+ recordId: input.recordId,
158
+ sequence: seq++,
159
+ occurredAt: now,
160
+ group: "link",
161
+ runId,
162
+ }));
163
+ }
164
+ }
165
+ catch {
166
+ /* relationships optional */
167
+ }
168
+ }
169
+ const basis = {
170
+ kind: runId ? (input.runId ? "run" : "latest-run") : "record",
171
+ runId,
172
+ recordId: input.recordId,
173
+ resolvedAt: now,
174
+ };
175
+ if (observations.length === 0) {
176
+ partialReasons.push({
177
+ code: "partial-run",
178
+ message: "no journey observations collected for the requested basis",
179
+ });
180
+ }
181
+ return { observations, partialReasons, basis };
182
+ }
183
+ export async function queryJourneyMatrix(platform, scope, body) {
184
+ if (!body.objectType) {
185
+ throw new ServiceError("VALIDATION", "objectType required", 400);
186
+ }
187
+ const collected = await collectJourneyObservations(platform, scope, {
188
+ objectType: body.objectType,
189
+ runId: body.basis?.runId,
190
+ recordId: body.basis?.recordId,
191
+ fixtureName: body.basis?.fixtureName,
192
+ includeCompose: body.includeCompose,
193
+ });
194
+ const matrix = projectMatrix(collected.observations, {
195
+ objectType: body.objectType,
196
+ basis: {
197
+ ...collected.basis,
198
+ kind: body.basis?.kind ?? collected.basis.kind,
199
+ },
200
+ granularity: body.granularity ?? "root",
201
+ includeValues: body.includeValues ?? false,
202
+ includeSystem: body.includeSystem ?? false,
203
+ includeRawProperties: body.includeRawProperties ?? false,
204
+ expandPath: body.expandPath,
205
+ scope: { orgId: scope.orgId, agentIds: scope.agentIds },
206
+ partialReasons: collected.partialReasons,
207
+ });
208
+ return matrix;
209
+ }
210
+ export function resolveJourneyEvidence(observations, evidenceRef, includeValues) {
211
+ const detail = queryEvidence(observations, evidenceRef);
212
+ if (!detail)
213
+ return null;
214
+ if (!includeValues) {
215
+ const { value: _v, ...rest } = detail;
216
+ return rest;
217
+ }
218
+ return detail;
219
+ }
220
+ //# sourceMappingURL=collect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect.js","sourceRoot":"","sources":["../../src/journey/collect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { type JourneyBasis, type ViewDefinitionLike } from "@x12i/memorix-data-journey";
2
+ import type { MemorixPlatform } from "../platform.js";
3
+ import type { MemorixScope } from "../scope.js";
4
+ /** Views from effective metadata (Catalox-backed install). */
5
+ export declare function viewsFromEffectiveMetadata(platform: MemorixPlatform, scope: MemorixScope): ViewDefinitionLike[];
6
+ export declare function queryJourneyCoverage(platform: MemorixPlatform, scope: MemorixScope, body: {
7
+ objectType?: string;
8
+ basis?: {
9
+ kind?: string;
10
+ runId?: string;
11
+ recordId?: string;
12
+ fixtureName?: string;
13
+ };
14
+ viewIds?: string[];
15
+ /** Inline descriptor snapshot (tests / fixture override). */
16
+ views?: ViewDefinitionLike[];
17
+ includeRawProperties?: boolean;
18
+ includeMatrix?: boolean;
19
+ granularity?: "root" | "content" | "property";
20
+ }): Promise<{
21
+ matrix?: import("@x12i/memorix-data-journey").MatrixResponse | undefined;
22
+ scope: {
23
+ orgId: string;
24
+ agentIds: string[];
25
+ };
26
+ objectType: string;
27
+ basis: JourneyBasis;
28
+ truth: import("@x12i/memorix-data-journey").MatrixTruth;
29
+ expectedSlots: import("@x12i/memorix-data-journey").ExpectedSlot[];
30
+ coverage: import("@x12i/memorix-data-journey").ExpectedCoverage;
31
+ }>;
32
+ export declare function listExpectedSlots(platform: MemorixPlatform, scope: MemorixScope, opts: {
33
+ objectType: string;
34
+ viewIds?: string[];
35
+ fixtureName?: string;
36
+ views?: ViewDefinitionLike[];
37
+ }): {
38
+ scope: {
39
+ orgId: string;
40
+ agentIds: string[];
41
+ };
42
+ objectType: string;
43
+ expectedSlots: import("@x12i/memorix-data-journey").ExpectedSlot[];
44
+ expectedPaths: string[];
45
+ };
46
+ //# sourceMappingURL=coverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../src/journey/coverage.ts"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAgBhD,8DAA8D;AAC9D,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,YAAY,GAClB,kBAAkB,EAAE,CAWtB;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE;IACJ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE;QACN,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC7B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;CAC/C;;;;;;;;;;;GA6DF;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE;IACJ,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAC9B;;;;;;;;EAsBF"}
@@ -0,0 +1,103 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { coverExpectedAgainstMatrix, expectedPathsFromViews, expectedSlotsFromViews, fixtureRoot, projectMatrix, } from "@x12i/memorix-data-journey";
4
+ import { ServiceError } from "../errors.js";
5
+ import { collectJourneyObservations } from "./collect.js";
6
+ function loadFixtureViews(fixtureName) {
7
+ try {
8
+ const path = resolve(fixtureRoot(fixtureName), "inputs/views.json");
9
+ const doc = JSON.parse(readFileSync(path, "utf8"));
10
+ return doc.viewDefinitions ?? [];
11
+ }
12
+ catch {
13
+ return [];
14
+ }
15
+ }
16
+ /** Views from effective metadata (Catalox-backed install). */
17
+ export function viewsFromEffectiveMetadata(platform, scope) {
18
+ const effective = platform.metadata.resolveEffective(scope.agentIds);
19
+ return (effective.effective ?? [])
20
+ .filter((e) => e.kind === "views")
21
+ .map((e) => {
22
+ const d = (e.definition ?? {});
23
+ return {
24
+ ...d,
25
+ id: d.id ?? e.id,
26
+ };
27
+ });
28
+ }
29
+ export async function queryJourneyCoverage(platform, scope, body) {
30
+ if (!body.objectType) {
31
+ throw new ServiceError("VALIDATION", "objectType required", 400);
32
+ }
33
+ if (body.basis?.kind === "fixture" && !body.basis.fixtureName) {
34
+ body.basis.fixtureName = "procedures-proc-2";
35
+ body.basis.recordId = body.basis.recordId ?? "PROC-2";
36
+ body.basis.runId = body.basis.runId ?? "run-proc-2";
37
+ }
38
+ let views = body.views ?? [];
39
+ if (views.length === 0 && body.basis?.fixtureName) {
40
+ views = loadFixtureViews(body.basis.fixtureName);
41
+ }
42
+ if (views.length === 0) {
43
+ views = viewsFromEffectiveMetadata(platform, scope);
44
+ }
45
+ const slots = expectedSlotsFromViews(views, {
46
+ objectType: body.objectType,
47
+ viewIds: body.viewIds,
48
+ });
49
+ const expectedPaths = slots.map((s) => s.path);
50
+ const collected = await collectJourneyObservations(platform, scope, {
51
+ objectType: body.objectType,
52
+ runId: body.basis?.runId,
53
+ recordId: body.basis?.recordId,
54
+ fixtureName: body.basis?.fixtureName,
55
+ });
56
+ const basis = {
57
+ ...collected.basis,
58
+ kind: body.basis?.kind ??
59
+ collected.basis.kind,
60
+ };
61
+ const matrix = projectMatrix(collected.observations, {
62
+ objectType: body.objectType,
63
+ basis,
64
+ granularity: body.granularity ?? "property",
65
+ includeRawProperties: body.includeRawProperties ?? true,
66
+ includeValues: false,
67
+ scope: { orgId: scope.orgId, agentIds: scope.agentIds },
68
+ partialReasons: collected.partialReasons,
69
+ });
70
+ const coverage = coverExpectedAgainstMatrix(expectedPaths, matrix);
71
+ return {
72
+ scope: { orgId: scope.orgId, agentIds: scope.agentIds },
73
+ objectType: body.objectType,
74
+ basis: matrix.basis,
75
+ truth: matrix.truth,
76
+ expectedSlots: slots,
77
+ coverage,
78
+ ...(body.includeMatrix ? { matrix } : {}),
79
+ };
80
+ }
81
+ export function listExpectedSlots(platform, scope, opts) {
82
+ let views = opts.views ?? [];
83
+ if (views.length === 0 && opts.fixtureName) {
84
+ views = loadFixtureViews(opts.fixtureName);
85
+ }
86
+ if (views.length === 0) {
87
+ views = viewsFromEffectiveMetadata(platform, scope);
88
+ }
89
+ const slots = expectedSlotsFromViews(views, {
90
+ objectType: opts.objectType,
91
+ viewIds: opts.viewIds,
92
+ });
93
+ return {
94
+ scope: { orgId: scope.orgId, agentIds: scope.agentIds },
95
+ objectType: opts.objectType,
96
+ expectedSlots: slots,
97
+ expectedPaths: expectedPathsFromViews(views, {
98
+ objectType: opts.objectType,
99
+ viewIds: opts.viewIds,
100
+ }),
101
+ };
102
+ }
103
+ //# sourceMappingURL=coverage.js.map