@x12i/memorix-service 3.6.4 → 3.7.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.
Files changed (50) hide show
  1. package/README.md +223 -191
  2. package/dist/access-gate.d.ts +11 -0
  3. package/dist/access-gate.d.ts.map +1 -1
  4. package/dist/access-gate.js +33 -0
  5. package/dist/access-gate.js.map +1 -1
  6. package/dist/app.d.ts +2 -0
  7. package/dist/app.d.ts.map +1 -1
  8. package/dist/app.js +16 -1
  9. package/dist/app.js.map +1 -1
  10. package/dist/caller-identity.d.ts +37 -0
  11. package/dist/caller-identity.d.ts.map +1 -0
  12. package/dist/caller-identity.js +77 -0
  13. package/dist/caller-identity.js.map +1 -0
  14. package/dist/catalog-store-cli.js +11 -11
  15. package/dist/cli.d.ts.map +1 -1
  16. package/dist/cli.js +7 -5
  17. package/dist/cli.js.map +1 -1
  18. package/dist/deployment-identity.d.ts +19 -0
  19. package/dist/deployment-identity.d.ts.map +1 -0
  20. package/dist/deployment-identity.js +105 -0
  21. package/dist/deployment-identity.js.map +1 -0
  22. package/dist/errors.d.ts.map +1 -1
  23. package/dist/errors.js +68 -0
  24. package/dist/errors.js.map +1 -1
  25. package/dist/index.d.ts +4 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +4 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/live.d.ts.map +1 -1
  30. package/dist/live.js +1 -0
  31. package/dist/live.js.map +1 -1
  32. package/dist/magit/magit-pack-service.d.ts +1 -1
  33. package/dist/magit/magit-pack-service.js +4 -4
  34. package/dist/openapi/openapi.json +393 -2
  35. package/dist/platform.d.ts +2 -0
  36. package/dist/platform.d.ts.map +1 -1
  37. package/dist/platform.js +28 -6
  38. package/dist/platform.js.map +1 -1
  39. package/dist/request-countex.d.ts +56 -0
  40. package/dist/request-countex.d.ts.map +1 -0
  41. package/dist/request-countex.js +206 -0
  42. package/dist/request-countex.js.map +1 -0
  43. package/dist/routes/data.d.ts.map +1 -1
  44. package/dist/routes/data.js +2 -1
  45. package/dist/routes/data.js.map +1 -1
  46. package/dist/routes/metadata.d.ts.map +1 -1
  47. package/dist/routes/metadata.js +27 -1
  48. package/dist/routes/metadata.js.map +1 -1
  49. package/openapi/openapi.json +393 -2
  50. package/package.json +109 -108
package/README.md CHANGED
@@ -1,191 +1,223 @@
1
- # `@x12i/memorix-service`
2
-
3
- Sole production **HTTP composition root** over accepted Memorix packages.
4
-
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
-
7
- ## Install / run
8
-
9
- ```bash
10
- npm install @x12i/memorix-service@3.6.0 # composition library / CLI
11
- ```
12
-
13
- Prefer the monorepo stack (service + Studio + opx-source):
14
-
15
- ```bash
16
- # from repo root
17
- node scripts/dev-stack.mjs
18
- ```
19
-
20
- Or this package alone:
21
-
22
- ```bash
23
- MEMORIX_SERVICE_MODE=prod MONGO_URI=mongodb://127.0.0.1:27017 npm run serve
24
- MEMORIX_SERVICE_MODE=dev npm run dev # metadata in-memory; durable routes 503 without Mongo
25
- ```
26
-
27
- | | |
28
- |--|--|
29
- | Default port | **5100** (`MEMORIX_SERVICE_PORT`, zone `memorix`) |
30
- | OpenAPI | `GET /api/openapi.json` |
31
- | Live view | `GET /_live` (`@x12i/core-service` → `@x12i/api-live-view`) |
32
- | Health | `GET /health` |
33
-
34
- Compliance: this process uses **`@x12i/core-service`** (zone port, health, live view, correlation-id).
35
-
36
- ## Dual-mode org blob plane (cloud / on-prem)
37
-
38
- Not Magit. When storing **org/connector object payloads** that would use cloud buckets,
39
- on-prem must use **local disk**.
40
-
41
- | Env | Effect |
42
- |-----|--------|
43
- | `MEMORIX_BLOB_BACKEND` | `disk` / `onprem` (default) or `s3` / `cloud` |
44
- | `MEMORIX_BLOB_ROOT` | Disk root for on-prem (default `.memorix-blobs`) |
45
- | `MEMORIX_S3_BUCKET` | Required when backend=`s3` |
46
- | `MEMORIX_RESTRICTED_KEK` | Optional AES-GCM KEK for disk-encrypted restricted bodies |
47
-
48
- Used by **`/api/restricted-store/v1`** (FG-A3). See
49
- [restricted-store.md](../docs/connector-framework/restricted-store.md) and
50
- [integration-registry.md](../docs/connector-framework/integration-registry.md).
51
-
52
- ## Magit package catalog
53
-
54
- Default-on when durable Mongo is configured (`METADATA_MAGIT=0` disables).
55
-
56
- | Mode | Config |
57
- |------|--------|
58
- | **A typed store** | `MAGIT_PACKAGE_STORE_SELECTOR` + `MAGIT_PACKAGE_TYPE_ID` |
59
- | **B flat catalog** | both unset |
60
-
61
- Requires `@x12i/magit@2.14.0`. Defaults: `MAGIT_CATALOG_TENANT=x12i`, `MAGIT_CATALOG_REPO=memorix`.
62
-
63
- Ops (provision / verify / recover / channels / smoke): see
64
- [documentation/magit-typed-store-runbook.md](../documentation/magit-typed-store-runbook.md).
65
-
66
- ```bash
67
- npm run catalog:provision -- --out /secure/magit-store.env --confirm-allowed-kinds
68
- npm run catalog:verify
69
- npm run catalog:recover -- --store-id st_… --out /secure/magit-store.env
70
- npm run catalog:list
71
- npm run magit:cross-env-smoke
72
- npm run magit:cross-env-smoke -- --publish
73
- ```
74
-
75
- **Owner mint:** repo `memorix`, Package stores **empty** until the store exists.
76
- **Consumer:** store grant + `repoIds: []` (Repositories unchecked).
77
- Channels and release sets need Mode A + publisher token to promote; consumers only resolve.
78
-
79
- Env examples: [memorix-service/.env.example](./.env.example). Selector never appears in Studio or `GET /api/diagnostics/scope`.
80
-
81
- ## Library exports
82
-
83
- When embedding the composition root in-process:
84
-
85
- ```ts
86
- import {
87
- createMemorixPlatform,
88
- createMemorixServiceApp,
89
- startMemorixServiceHttp,
90
- } from "@x12i/memorix-service";
91
- ```
92
-
93
- ## Scope headers
94
-
95
- Every `/api/*` request requires:
96
-
97
- ```http
98
- x-memorix-org-id: sandboxdemo
99
- x-memorix-agent-ids: opx
100
- ```
101
-
102
- Singular `agentId` headers are rejected. `agentIds[]` selects **effective metadata**; `orgId` selects the **data** universe.
103
-
104
- ### Org identity is case-insensitive (MX-ORG-01)
105
-
106
- Org ids are canonicalized with trim + `toLocaleLowerCase("en-US")`. Matching is
107
- case-insensitive (`TGI` / `tgi` / `Tgi` are the same org). `scope.orgId`,
108
- `addressing.orgId`, and storage keys always use that canonical form, so writers
109
- and readers that differ only by case share one tenant bag. Empty / missing org
110
- is still rejected (400).
111
-
112
- ### Minimal curl
113
-
114
- ```bash
115
- curl -s http://127.0.0.1:5100/health
116
- curl -s http://127.0.0.1:5100/api/diagnostics/scope \
117
- -H 'x-memorix-org-id: sandboxdemo' \
118
- -H 'x-memorix-agent-ids: opx'
119
- ```
120
-
121
- ## Route families
122
-
123
- | Family | Role |
124
- |--------|------|
125
- | `/api/metadata` | Kinds, definitions, install/publish, pack versions (Magit default-on; `METADATA_MAGIT=0` disables) |
126
- | `/api/data` | Content get/list/write, compose, abstract |
127
- | `/api/relationships` | Query / discover / verify / rebuild (**no** ad-hoc link PUT) |
128
- | `/api/memory` | Pull, raw, sources, **checkpoints**, schedules, runs, `commit-page`, connection probe |
129
- | `/api/pipelines` | Definitions, start, runs, retry/resume |
130
- | `/api/operations` | Operational helpers |
131
- | `/api/workflow` | Workflow sibling content |
132
- | `/api/intelligence` | Profiles / proposals (never auto-install) |
133
- | `/api/data-journey` | Evidence cone + expected-vs-filled coverage |
134
- | `/api/ai-services` | Companion AI-services (function / skill / task / graph) — list, items, invoke proxy |
135
-
136
- ### AI-services companions
137
-
138
- Point memorix-service at FR-compliant processes via env (`FUNCX_URL`, `AI_SKILLS_URL`, `AI_TASKS_URL`, `GRAPH_ENGINE_URL`).
139
- Stack: AI companions are **on by default**; skip with `--no-ai-services` or `AI_SERVICES=0`.
140
-
141
- ### Vendor pipeline workers (opt-in)
142
-
143
- Archetype-A HTTP companions invoke via `POST {origin}/pipeline`. Inject **base origin only** (no `/pipeline` path). Soft-skip when URL unset; fail-closed when set (`src/optional-companion-url.ts`).
144
-
145
- | Suite | Stack flag | Client env |
146
- |-------|------------|------------|
147
- | Exellix Apollo + M365 | `--exellix-connectors` / `EXELLIX_CONNECTORS=1` | `EXELLIX_APOLLO_READ_URL`, `EXELLIX_APOLLO_ACTIONS_URL`, `EXELLIX_M365_USER_READ_URL`, `EXELLIX_M365_USER_ACTION_URL` (ports 9711–9722, zone `exellix-connectors`) |
148
- | Neo security workers | `--neo-connectors` / `NEO_CONNECTORS=1` | `NEO_FIREWALL_URL`, `NEO_XDR_URL`, `NEO_NESSUS_URL`, `NEO_ENTRA_URL`, `NEO_SPLUNK_URL`, `NEO_CROWDSTRIKE_URL` (frozen ports; no zone remap) |
149
- | Neo status UI | `--neo-status-ui` / `NEO_STATUS_UI=1` | `NEO_STATUS_UI_URL` (:9001) |
150
-
151
- Optional hard gates: `EXELLIX_CONNECTORS_REQUIRED=1`, `NEO_CONNECTORS_REQUIRED=1`.
152
-
153
- **Neo packages** ship on GitHub Packages. Local install needs `.npmrc` scope + `NODE_AUTH_TOKEN` (see [`.npmrc.example`](../.npmrc.example)).
154
-
155
- ### Memory (operator + called-service)
156
-
157
- | Method | Path | Notes |
158
- |--------|------|-------|
159
- | `GET` | `/api/memory/sources/{sourceId}/connection` | Probe configured URL |
160
- | `GET`/`PUT`/`POST` | `…/checkpoints` (+ `/reset`) | Source position per OT × route |
161
- | `POST` | `…/commit-page` | Model B atomic land + checkpoint |
162
- | `POST` | `/api/memory/pull` | **Operator-only** rejected when `x-memorix-invocation-grant` is present |
163
-
164
- Called services with `memorixAccess` receive an HMAC grant scoped to `explore` · `checkpoints` · `raw`. Prefer **`@x12i/memorix-sdk`** (`/client` / `/worker`) over raw fetch.
165
-
166
- ### Data journey (read-only)
167
-
168
- | Method | Path |
169
- |--------|------|
170
- | `GET` | `/api/data-journey/object-types` |
171
- | `GET` | `/api/data-journey/journeys` |
172
- | `POST` | `/api/data-journey/matrix/query` |
173
- | `POST` | `/api/data-journey/matrix/columns/query` |
174
- | `POST` | `/api/data-journey/matrix/cells/query` |
175
- | `GET` | `/api/data-journey/evidence/:evidenceRef` |
176
- | `GET` | `/api/data-journey/expected-slots` |
177
- | `POST` | `/api/data-journey/coverage` |
178
-
179
- ## Hard rules
180
-
181
- - Prod rejects missing Mongo and in-memory durable fallbacks
182
- - `/api/relationships/links` → **405** (no ad-hoc link mutation)
183
- - Intelligence never auto-installs/publishes
184
- - Only `credentialRef` may cross Memory APIs
185
-
186
- ## Docs
187
-
188
- - [`documentation/http-api.md`](../documentation/http-api.md) · OpenAPI in-repo [`openapi/openapi.json`](./openapi/openapi.json)
189
- - Capability SDK: [`@x12i/memorix-sdk`](../memorix-sdk/) · HTTP client: [`@x12i/memorix-client`](../memorix-client/)
190
- - Ebooks: [Platform Overview](../memorix-docs/00-platform-overview/) · [Services](../memorix-docs/07-services/) · [Runtime Data Client](../memorix-docs/02-runtime-data-client/)
191
- - Hub: [https://docs.memorix.x12i.com](https://docs.memorix.x12i.com) · npm `@x12i/memorix-docs`
1
+ # `@x12i/memorix-service`
2
+
3
+ Sole production **HTTP composition root** over accepted Memorix packages.
4
+
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
+
7
+ ## Install / run
8
+
9
+ ```bash
10
+ npm install @x12i/memorix-service@3.6.0 # composition library / CLI
11
+ ```
12
+
13
+ Prefer the monorepo stack (service + Studio + opx-source):
14
+
15
+ ```bash
16
+ # from repo root
17
+ node scripts/dev-stack.mjs
18
+ ```
19
+
20
+ Or this package alone:
21
+
22
+ ```bash
23
+ MEMORIX_SERVICE_MODE=prod MONGO_URI=mongodb://127.0.0.1:27017 npm run serve
24
+ MEMORIX_SERVICE_MODE=dev npm run dev # metadata in-memory; durable routes 503 without Mongo
25
+ ```
26
+
27
+ | | |
28
+ |--|--|
29
+ | Default port | **5100** (`MEMORIX_SERVICE_PORT`, zone `memorix`) |
30
+ | OpenAPI | `GET /api/openapi.json` |
31
+ | Live view | `GET /_live` (`@x12i/core-service` → `@x12i/api-live-view`) |
32
+ | Health | `GET /health` |
33
+
34
+ Compliance: this process uses **`@x12i/core-service`** (zone port, health, live view, correlation-id).
35
+
36
+ ## Dual-mode org blob plane (cloud / on-prem)
37
+
38
+ Not Magit. When storing **org/connector object payloads** that would use cloud buckets,
39
+ on-prem must use **local disk**.
40
+
41
+ | Env | Effect |
42
+ |-----|--------|
43
+ | `MEMORIX_BLOB_BACKEND` | `disk` / `onprem` (default) or `s3` / `cloud` |
44
+ | `MEMORIX_BLOB_ROOT` | Disk root for on-prem (default `.memorix-blobs`) |
45
+ | `MEMORIX_S3_BUCKET` | Required when backend=`s3` |
46
+ | `MEMORIX_RESTRICTED_KEK` | Optional AES-GCM KEK for disk-encrypted restricted bodies |
47
+
48
+ Used by **`/api/restricted-store/v1`** (FG-A3). See
49
+ [restricted-store.md](../docs/connector-framework/restricted-store.md) and
50
+ [integration-registry.md](../docs/connector-framework/integration-registry.md).
51
+
52
+ ## Magit package catalog
53
+
54
+ Default-on when durable Mongo is configured (`METADATA_MAGIT=0` disables).
55
+
56
+ | Mode | Config |
57
+ |------|--------|
58
+ | **A typed store** | `MAGIT_PACKAGE_STORE_SELECTOR` + `MAGIT_PACKAGE_TYPE_ID` |
59
+ | **B flat catalog** | both unset |
60
+
61
+ Requires `@x12i/magit@2.14.0`. Defaults: `MAGIT_CATALOG_TENANT=x12i`, `MAGIT_CATALOG_REPO=memorix`.
62
+
63
+ Ops (provision / verify / recover / channels / smoke): see
64
+ [documentation/magit-typed-store-runbook.md](../documentation/magit-typed-store-runbook.md).
65
+
66
+ ```bash
67
+ npm run catalog:provision -- --out /secure/magit-store.env --confirm-allowed-kinds
68
+ npm run catalog:verify
69
+ npm run catalog:recover -- --store-id st_… --out /secure/magit-store.env
70
+ npm run catalog:list
71
+ npm run magit:cross-env-smoke
72
+ npm run magit:cross-env-smoke -- --publish
73
+ ```
74
+
75
+ **Owner mint:** repo `memorix`, Package stores **empty** until the store exists.
76
+ **Consumer:** store grant + `repoIds: []` (Repositories unchecked).
77
+ Channels and release sets need Mode A + publisher token to promote; consumers only resolve.
78
+
79
+ Env examples: [memorix-service/.env.example](./.env.example). Selector never appears in Studio or `GET /api/diagnostics/scope`.
80
+
81
+ ## Library exports
82
+
83
+ When embedding the composition root in-process:
84
+
85
+ ```ts
86
+ import {
87
+ createMemorixPlatform,
88
+ createMemorixServiceApp,
89
+ startMemorixServiceHttp,
90
+ } from "@x12i/memorix-service";
91
+ ```
92
+
93
+ ## Scope headers
94
+
95
+ Every `/api/*` request requires:
96
+
97
+ ```http
98
+ x-memorix-org-id: sandboxdemo
99
+ x-memorix-agent-ids: opx
100
+ ```
101
+
102
+ Singular `agentId` headers are rejected. `agentIds[]` selects **effective metadata**; `orgId` selects the **data** universe.
103
+
104
+ ### Org identity is case-insensitive (MX-ORG-01)
105
+
106
+ Org ids are canonicalized with trim + `toLocaleLowerCase("en-US")`. Matching is
107
+ case-insensitive (`TGI` / `tgi` / `Tgi` are the same org). `scope.orgId`,
108
+ `addressing.orgId`, and storage keys always use that canonical form, so writers
109
+ and readers that differ only by case share one tenant bag. Empty / missing org
110
+ is still rejected (400).
111
+
112
+ ### Deployment writer / reader (MX-AUTH-01)
113
+
114
+ Default: **off** (scope headers only). To separate Synapix lander (writer) from
115
+ map-store (read-only):
116
+
117
+ ```bash
118
+ MEMORIX_DEPLOYMENT_AUTH=required # or optional
119
+ MEMORIX_DEPLOYMENT_HMAC_SECRET=… # optional; falls back to callback/service secret
120
+ ```
121
+
122
+ Mint tokens (same process secret):
123
+
124
+ ```ts
125
+ import { issueDeploymentIdentity } from "@x12i/memorix-service";
126
+ const writer = issueDeploymentIdentity({ orgId: "tgi", role: "writer" });
127
+ const reader = issueDeploymentIdentity({ orgId: "tgi", role: "reader" });
128
+ ```
129
+
130
+ Send `x-memorix-deployment-identity: <token>` on every product call. Readers may
131
+ GET/list/compose; only writers may POST content / install metadata.
132
+
133
+ ### Content miss status (MX-CONTENT-01)
134
+
135
+ `GET /api/data/content?…&id=` for a missing record returns **404** `READ_NOT_FOUND`
136
+ (not 500).
137
+
138
+ ### Metadata hot-reload (MX-META-01)
139
+
140
+ After pack install the live catalog is flushed and OrgPorts cleared — no restart
141
+ required in-process. Ops may also call `POST /api/metadata/reload` with
142
+ `{ "confirm": true }` (e.g. after Magit apply on another worker).
143
+
144
+ ### Minimal curl
145
+
146
+ ```bash
147
+ curl -s http://127.0.0.1:5100/health
148
+ curl -s http://127.0.0.1:5100/api/diagnostics/scope \
149
+ -H 'x-memorix-org-id: sandboxdemo' \
150
+ -H 'x-memorix-agent-ids: opx'
151
+ ```
152
+
153
+ ## Route families
154
+
155
+ | Family | Role |
156
+ |--------|------|
157
+ | `/api/metadata` | Kinds, definitions, install/publish, pack versions (Magit default-on; `METADATA_MAGIT=0` disables) |
158
+ | `/api/data` | Content get/list/write, compose, abstract |
159
+ | `/api/relationships` | Query / discover / verify / rebuild (**no** ad-hoc link PUT) |
160
+ | `/api/memory` | Pull, raw, sources, **checkpoints**, schedules, runs, `commit-page`, connection probe |
161
+ | `/api/pipelines` | Definitions, start, runs, retry/resume |
162
+ | `/api/operations` | Operational helpers |
163
+ | `/api/workflow` | Workflow sibling content |
164
+ | `/api/intelligence` | Profiles / proposals (never auto-install) |
165
+ | `/api/data-journey` | Evidence cone + expected-vs-filled coverage |
166
+ | `/api/ai-services` | Companion AI-services (function / skill / task / graph) — list, items, invoke proxy |
167
+
168
+ ### AI-services companions
169
+
170
+ Point memorix-service at FR-compliant processes via env (`FUNCX_URL`, `AI_SKILLS_URL`, `AI_TASKS_URL`, `GRAPH_ENGINE_URL`).
171
+ Stack: AI companions are **on by default**; skip with `--no-ai-services` or `AI_SERVICES=0`.
172
+
173
+ ### Vendor pipeline workers (opt-in)
174
+
175
+ Archetype-A HTTP companions invoke via `POST {origin}/pipeline`. Inject **base origin only** (no `/pipeline` path). Soft-skip when URL unset; fail-closed when set (`src/optional-companion-url.ts`).
176
+
177
+ | Suite | Stack flag | Client env |
178
+ |-------|------------|------------|
179
+ | Exellix Apollo + M365 | `--exellix-connectors` / `EXELLIX_CONNECTORS=1` | `EXELLIX_APOLLO_READ_URL`, `EXELLIX_APOLLO_ACTIONS_URL`, `EXELLIX_M365_USER_READ_URL`, `EXELLIX_M365_USER_ACTION_URL` (ports 9711–9722, zone `exellix-connectors`) |
180
+ | Neo security workers | `--neo-connectors` / `NEO_CONNECTORS=1` | `NEO_FIREWALL_URL`, `NEO_XDR_URL`, `NEO_NESSUS_URL`, `NEO_ENTRA_URL`, `NEO_SPLUNK_URL`, `NEO_CROWDSTRIKE_URL` (zone **neo-proagentics** **10000–10100**) |
181
+ | Neo status UI | `--neo-status-ui` / `NEO_STATUS_UI=1` | `NEO_STATUS_UI_URL` (:10001) |
182
+
183
+ Optional hard gates: `EXELLIX_CONNECTORS_REQUIRED=1`, `NEO_CONNECTORS_REQUIRED=1`.
184
+
185
+ **Neo packages** ship on GitHub Packages. Local install needs `.npmrc` scope + `NODE_AUTH_TOKEN` (see [`.npmrc.example`](../.npmrc.example)).
186
+
187
+ ### Memory (operator + called-service)
188
+
189
+ | Method | Path | Notes |
190
+ |--------|------|-------|
191
+ | `GET` | `/api/memory/sources/{sourceId}/connection` | Probe configured URL |
192
+ | `GET`/`PUT`/`POST` | `…/checkpoints` (+ `/reset`) | Source position per OT × route |
193
+ | `POST` | `…/commit-page` | Model B atomic land + checkpoint |
194
+ | `POST` | `/api/memory/pull` | **Operator-only** — rejected when `x-memorix-invocation-grant` is present |
195
+
196
+ Called services with `memorixAccess` receive an HMAC grant scoped to `explore` · `checkpoints` · `raw`. Prefer **`@x12i/memorix-sdk`** (`/client` / `/worker`) over raw fetch.
197
+
198
+ ### Data journey (read-only)
199
+
200
+ | Method | Path |
201
+ |--------|------|
202
+ | `GET` | `/api/data-journey/object-types` |
203
+ | `GET` | `/api/data-journey/journeys` |
204
+ | `POST` | `/api/data-journey/matrix/query` |
205
+ | `POST` | `/api/data-journey/matrix/columns/query` |
206
+ | `POST` | `/api/data-journey/matrix/cells/query` |
207
+ | `GET` | `/api/data-journey/evidence/:evidenceRef` |
208
+ | `GET` | `/api/data-journey/expected-slots` |
209
+ | `POST` | `/api/data-journey/coverage` |
210
+
211
+ ## Hard rules
212
+
213
+ - Prod rejects missing Mongo and in-memory durable fallbacks
214
+ - `/api/relationships/links` → **405** (no ad-hoc link mutation)
215
+ - Intelligence never auto-installs/publishes
216
+ - Only `credentialRef` may cross Memory APIs
217
+
218
+ ## Docs
219
+
220
+ - [`documentation/http-api.md`](../documentation/http-api.md) · OpenAPI in-repo [`openapi/openapi.json`](./openapi/openapi.json)
221
+ - Capability SDK: [`@x12i/memorix-sdk`](../memorix-sdk/) · HTTP client: [`@x12i/memorix-client`](../memorix-client/)
222
+ - Ebooks: [Platform Overview](../memorix-docs/00-platform-overview/) · [Services](../memorix-docs/07-services/) · [Runtime Data Client](../memorix-docs/02-runtime-data-client/)
223
+ - Hub: [https://docs.memorix.x12i.com](https://docs.memorix.x12i.com) · npm `@x12i/memorix-docs`
@@ -1,11 +1,22 @@
1
1
  /**
2
2
  * Enforce callback grants on Explore / Memory / checkpoint routes.
3
3
  * Product hosts without a grant keep full org-scoped access.
4
+ *
5
+ * MX-AUTH-01: optional deployment writer/reader identities (see
6
+ * `requireDeploymentAccess`) — default off for lab compatibility.
4
7
  */
5
8
  import type { FastifyRequest } from "fastify";
6
9
  import type { MemorixServiceAccess } from "@x12i/memorix-pipeline/v2";
7
10
  import { type CallbackGrantPayload } from "./callback-grant.js";
11
+ import { type DeploymentAccessKind } from "./deployment-identity.js";
8
12
  export declare function readInvocationGrant(req: FastifyRequest): CallbackGrantPayload | null;
13
+ /**
14
+ * MX-AUTH-01 — gate product APIs by deployment role when auth mode is on.
15
+ * - off (default): no check
16
+ * - optional: missing token allowed; present token must match org + role
17
+ * - required: valid writer/reader token required
18
+ */
19
+ export declare function requireDeploymentAccess(req: FastifyRequest, access: DeploymentAccessKind): void;
9
20
  export declare function requireCallbackAccess(req: FastifyRequest, surface: MemorixServiceAccess): void;
10
21
  /**
11
22
  * Fail-closed grant for MGC landing ports (raw-records, target-receipts, artifacts).
@@ -1 +1 @@
1
- {"version":3,"file":"access-gate.d.ts","sourceRoot":"","sources":["../src/access-gate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAGtE,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,qBAAqB,CAAC;AAI7B,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,cAAc,GAClB,oBAAoB,GAAG,IAAI,CAK7B;AAED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,oBAAoB,GAC5B,IAAI,CA2BN;AAWD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,GAAG;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAiCA;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAQ7D"}
1
+ {"version":3,"file":"access-gate.d.ts","sourceRoot":"","sources":["../src/access-gate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAGtE,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAKL,KAAK,oBAAoB,EAC1B,MAAM,0BAA0B,CAAC;AAIlC,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,cAAc,GAClB,oBAAoB,GAAG,IAAI,CAK7B;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,oBAAoB,GAC3B,IAAI,CAwCN;AAED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,oBAAoB,GAC5B,IAAI,CA+BN;AAWD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,GAAG;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAiCA;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAQ7D"}
@@ -1,6 +1,7 @@
1
1
  import { ServiceError } from "./errors.js";
2
2
  import { decodeLandingGrantToken } from "./mgc-landing-stores.js";
3
3
  import { grantHasAccess, verifyCallbackGrant, } from "./callback-grant.js";
4
+ import { identityAllows, readDeploymentTokenFromHeaders, resolveDeploymentAuthMode, verifyDeploymentIdentity, } from "./deployment-identity.js";
4
5
  import { resolveScope } from "./request-scope.js";
5
6
  import { orgIdsEqual, normalizeOrgId } from "./scope.js";
6
7
  export function readInvocationGrant(req) {
@@ -10,7 +11,39 @@ export function readInvocationGrant(req) {
10
11
  return null;
11
12
  return verifyCallbackGrant(token);
12
13
  }
14
+ /**
15
+ * MX-AUTH-01 — gate product APIs by deployment role when auth mode is on.
16
+ * - off (default): no check
17
+ * - optional: missing token allowed; present token must match org + role
18
+ * - required: valid writer/reader token required
19
+ */
20
+ export function requireDeploymentAccess(req, access) {
21
+ const mode = resolveDeploymentAuthMode();
22
+ if (mode === "off")
23
+ return;
24
+ const token = readDeploymentTokenFromHeaders(req.headers);
25
+ if (!token) {
26
+ if (mode === "optional")
27
+ return;
28
+ throw new ServiceError("ACCESS_DENIED", "x-memorix-deployment-identity required (writer or reader)", 401);
29
+ }
30
+ const identity = verifyDeploymentIdentity(token);
31
+ if (!identity) {
32
+ throw new ServiceError("ACCESS_DENIED", "deployment identity invalid or expired", 401);
33
+ }
34
+ const scope = resolveScope(req);
35
+ if (!orgIdsEqual(identity.orgId, scope.orgId)) {
36
+ throw new ServiceError("ACCESS_DENIED", "deployment identity orgId mismatch", 403);
37
+ }
38
+ if (!identityAllows(identity, access)) {
39
+ throw new ServiceError("ACCESS_DENIED", `deployment role "${identity.role}" cannot ${access}`, 403);
40
+ }
41
+ }
13
42
  export function requireCallbackAccess(req, surface) {
43
+ // Explore surfaces are reads; raw/checkpoints stay grant-scoped separately.
44
+ if (surface === "explore") {
45
+ requireDeploymentAccess(req, "read");
46
+ }
14
47
  const grant = readInvocationGrant(req);
15
48
  if (!grant)
16
49
  return; // product host — no grant restriction
@@ -1 +1 @@
1
- {"version":3,"file":"access-gate.js","sourceRoot":"","sources":["../src/access-gate.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EACL,cAAc,EACd,mBAAmB,GAEpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEzD,MAAM,UAAU,mBAAmB,CACjC,GAAmB;IAEnB,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAChD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrD,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,GAAmB,EACnB,OAA6B;IAE7B,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,sCAAsC;IAC1D,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,YAAY,CACpB,eAAe,EACf,iCAAiC,EACjC,GAAG,CACJ,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzD,IAAI,WAAW,KAAK,WAAW,EAAE,CAAC;QAChC,MAAM,IAAI,YAAY,CACpB,eAAe,EACf,oCAAoC,EACpC,GAAG,CACJ,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,YAAY,CACpB,eAAe,EACf,sCAAsC,OAAO,GAAG,EAChD,GAAG,CACJ,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAClB,GAAmB,EACnB,IAAY;IAEZ,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACjE,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAmB;IAMrD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,4BAA4B,CAAC,CAAC;IAC7D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,YAAY,CACpB,eAAe,EACf,qCAAqC,EACrC,GAAG,CACJ,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,YAAY,CAAC,eAAe,EAAE,0BAA0B,EAAE,GAAG,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACrD,MAAM,IAAI,YAAY,CAAC,eAAe,EAAE,0BAA0B,EAAE,GAAG,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,SAAS,GACb,WAAW,CAAC,GAAG,EAAE,mBAAmB,CAAC;QACrC,WAAW,CAAC,GAAG,EAAE,kBAAkB,CAAC;QACpC,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC/B,IAAI,SAAS,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,YAAY,CACpB,eAAe,EACf,iCAAiC,EACjC,GAAG,CACJ,CAAC;IACJ,CAAC;IACD,OAAO;QACL,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC;QAClC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;KACpE,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAmB;IACrD,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,MAAM,IAAI,YAAY,CACpB,eAAe,EACf,uGAAuG,EACvG,GAAG,CACJ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"access-gate.js","sourceRoot":"","sources":["../src/access-gate.ts"],"names":[],"mappings":"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"}
package/dist/app.d.ts CHANGED
@@ -2,6 +2,8 @@ import Fastify, { type FastifyInstance } from "fastify";
2
2
  import { type MemorixPlatform, type PlatformDeps } from "./platform.js";
3
3
  export type CreateMemorixServiceAppOptions = PlatformDeps & {
4
4
  logger?: boolean;
5
+ /** When true (CLI serve), skip per-request access log lines; use /_live counters. */
6
+ disableRequestLogging?: boolean;
5
7
  platform?: MemorixPlatform;
6
8
  };
7
9
  export declare function createMemorixServiceApp(opts: CreateMemorixServiceAppOptions): Promise<{
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;AAIxD,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AA6BvB,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,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAwG5E;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;AAmCvB,MAAM,MAAM,8BAA8B,GAAG,YAAY,GAAG;IAC1D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qFAAqF;IACrF,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,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,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAwH5E;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
@@ -32,12 +32,26 @@ import { registerAiServicesRoutes } from "./routes/ai-services.js";
32
32
  import { createSimulationController } from "./simulation.js";
33
33
  import { memorixLiveRing } from "./live.js";
34
34
  import { resolveConfiguredAiServiceOrigins } from "./ai-services/config.js";
35
+ import { enforceCallerOnRequest } from "./caller-identity.js";
36
+ import { attachRequestCountex, createRequestCountex, registerRequestStatsRoute, } from "./request-countex.js";
35
37
  const __dirname = dirname(fileURLToPath(import.meta.url));
36
38
  export async function createMemorixServiceApp(opts) {
37
39
  const platform = opts.platform ?? (await createMemorixPlatform(opts));
38
40
  const simulation = createSimulationController();
39
- const app = Fastify({ logger: opts.logger ?? false });
41
+ const app = Fastify({
42
+ logger: opts.logger ?? false,
43
+ // Prefer /_live Counters over per-request Pino spam.
44
+ disableRequestLogging: opts.disableRequestLogging ?? true,
45
+ });
40
46
  await app.register(cors, { origin: true });
47
+ // MX-CALLER-01: every /api/* request must identify the calling app.
48
+ app.addHook("onRequest", async (req) => {
49
+ enforceCallerOnRequest(req);
50
+ });
51
+ const requestCountex = await createRequestCountex({
52
+ mongoUri: opts.mongoUri ?? process.env.MONGO_URI?.trim(),
53
+ });
54
+ attachRequestCountex(app, requestCountex);
41
55
  const healthPayload = async () => {
42
56
  const sim = simulation.getState();
43
57
  return {
@@ -70,6 +84,7 @@ export async function createMemorixServiceApp(opts) {
70
84
  },
71
85
  getHealth: healthPayload,
72
86
  });
87
+ registerRequestStatsRoute(app, requestCountex);
73
88
  app.setErrorHandler((err, req, reply) => {
74
89
  const correlationId = req.correlationId ?? randomUUID();
75
90
  const mapped = mapErrorToHttp(err, correlationId);
package/dist/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,OAAiC,MAAM,SAAS,CAAC;AACxD,OAAO,IAAI,MAAM,eAAe,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EACL,qBAAqB,GAGtB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,iCAAiC,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,mCAAmC,EAAE,MAAM,oCAAoC,CAAC;AACzF,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,iCAAiC,EAAE,MAAM,yBAAyB,CAAC;AAE5E,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAO1D,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,IAAoC;IAEpC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,0BAA0B,EAAE,CAAC;IAChD,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;IACtD,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3C,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;QAC/B,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;QAClC,OAAO;YACL,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,uBAAuB;YAChC,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,cAAc,EAAE;gBACd,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,OAAO;aACd;YACD,UAAU,EAAE;gBACV,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,aAAa,EAAE,GAAG,CAAC,aAAa;gBAChC,SAAS,EAAE,GAAG,CAAC,SAAS;aACzB;SACF,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,GAAY,EAAE;QACjD,IAAI,EAAE,eAAe;QACrB,QAAQ,EAAE;YACR,EAAE,EAAE,uBAAuB;YAC3B,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,sBAAsB;YAC/B,QAAQ,EAAE,mBAAmB;YAC7B,WAAW,EAAE,4BAA4B;SAC1C;QACD,SAAS,EAAE,aAAa;KACzB,CAAC,CAAC;IAEH,GAAG,CAAC,eAAe,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACtC,MAAM,aAAa,GAChB,GAAkC,CAAC,aAAa,IAAI,UAAU,EAAE,CAAC;QACpE,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAA6B,CAAC;QACjF,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;IAE1C,GAAG,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QACjD,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxC,OAAO,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,wBAAwB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACzC,OAAO;YACL,KAAK;YACL,QAAQ,EAAE;gBACR,GAAG,IAAI;gBACP,UAAU,EAAE,iCAAiC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC1D,aAAa,EAAE,CAAC,CAAC,aAAa;oBAC9B,GAAG,EAAE,CAAC,CAAC,GAAG;oBACV,GAAG,EAAE,CAAC,CAAC,GAAG;oBACV,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;oBAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;iBAC3B,CAAC,CAAC;aACJ;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,wBAAwB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC1C,MAAM,sBAAsB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC5C,MAAM,qBAAqB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC3C,MAAM,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACxC,MAAM,0BAA0B,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAChD,MAAM,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,wBAAwB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,iCAAiC,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACvD,MAAM,0BAA0B,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAChD,MAAM,mCAAmC,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACzD,MAAM,yBAAyB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,6BAA6B,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACnD,MAAM,8BAA8B,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACpD,MAAM,sBAAsB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC5C,MAAM,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACxC,MAAM,wBAAwB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,sBAAsB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC5C,MAAM,0BAA0B,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAChD,MAAM,yBAAyB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,wBAAwB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAE9C,iFAAiF;IACjF,QAAQ,CAAC,yBAAyB,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3D,wDAAwD;IACxD,QAAQ,CAAC,mBAAmB,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;IACrD,4EAA4E;IAC5E,QAAQ,CAAC,gCAAgC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;IAElE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AAC5C,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAgC;IAC5E,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC;IACtC,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACjC,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * MX-CALLER-01 — mandatory product caller identity.
3
+ *
4
+ * Every `/api/*` request must send `x-memorix-caller` identifying the app
5
+ * that is pushing or fetching (e.g. synapix-lander, map-store, memorix-studio).
6
+ * Scope headers (org/agents) are separate; this names the HTTP client.
7
+ */
8
+ import type { FastifyRequest } from "fastify";
9
+ export declare const CALLER_HEADER = "x-memorix-caller";
10
+ /** Max length after trim. */
11
+ export declare const CALLER_MAX_LEN = 128;
12
+ /**
13
+ * Starts with alphanumeric or `@` (scoped package ids); then alnum, `.` `_` `@` `/` `-`.
14
+ * Examples: synapix-lander, map-store, memorix-studio, @x12i/memorix-client
15
+ */
16
+ export declare const CALLER_PATTERN: RegExp;
17
+ export declare function readCallerFromHeaders(headers: Record<string, string | string[] | undefined>): string | undefined;
18
+ export declare function normalizeCaller(raw: string): string;
19
+ export declare function validateCallerValue(raw: string | undefined): {
20
+ ok: true;
21
+ caller: string;
22
+ } | {
23
+ ok: false;
24
+ code: "CALLER_REQUIRED" | "CALLER_INVALID";
25
+ message: string;
26
+ };
27
+ /** True when the path is a product API that requires caller identity. */
28
+ export declare function pathRequiresCaller(urlPath: string): boolean;
29
+ /**
30
+ * Read + validate caller from the request. Throws ServiceError on failure.
31
+ * Returns the canonical caller string when valid.
32
+ */
33
+ export declare function requireCaller(req: FastifyRequest): string;
34
+ /** Fastify onRequest: enforce caller on /api/* only. */
35
+ export declare function enforceCallerOnRequest(req: FastifyRequest): void;
36
+ export declare function getRequestCaller(req: FastifyRequest): string | undefined;
37
+ //# sourceMappingURL=caller-identity.d.ts.map