@x12i/memorix-service 3.0.2 → 3.0.4
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 +26 -10
- package/dist/access-gate.d.ts +15 -0
- package/dist/access-gate.d.ts.map +1 -0
- package/dist/access-gate.js +38 -0
- package/dist/access-gate.js.map +1 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +4 -0
- package/dist/app.js.map +1 -1
- package/dist/callback-grant.d.ts +16 -0
- package/dist/callback-grant.d.ts.map +1 -0
- package/dist/callback-grant.js +72 -0
- package/dist/callback-grant.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/isolation.d.ts +9 -25
- package/dist/isolation.d.ts.map +1 -1
- package/dist/isolation.js +19 -59
- package/dist/isolation.js.map +1 -1
- package/dist/known-packs.d.ts +1 -1
- package/dist/known-packs.d.ts.map +1 -1
- package/dist/known-packs.js +3 -2
- package/dist/known-packs.js.map +1 -1
- package/dist/live.d.ts +8 -0
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +49 -0
- package/dist/live.js.map +1 -1
- package/dist/openapi/openapi.json +1465 -213
- package/dist/platform.d.ts +20 -1
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +134 -9
- package/dist/platform.js.map +1 -1
- package/dist/relationships/operator-links.d.ts +1 -1
- package/dist/relationships/operator-links.js +1 -1
- package/dist/routes/connector-invocations.d.ts +7 -0
- package/dist/routes/connector-invocations.d.ts.map +1 -0
- package/dist/routes/connector-invocations.js +216 -0
- package/dist/routes/connector-invocations.js.map +1 -0
- package/dist/routes/data.d.ts.map +1 -1
- package/dist/routes/data.js +4 -0
- package/dist/routes/data.js.map +1 -1
- package/dist/routes/memory.d.ts.map +1 -1
- package/dist/routes/memory.js +719 -7
- package/dist/routes/memory.js.map +1 -1
- package/dist/routes/metadata.d.ts.map +1 -1
- package/dist/routes/metadata.js +2 -1
- package/dist/routes/metadata.js.map +1 -1
- package/dist/routes/operations.d.ts.map +1 -1
- package/dist/routes/operations.js +3 -1
- package/dist/routes/operations.js.map +1 -1
- package/dist/routes/pipelines.d.ts.map +1 -1
- package/dist/routes/pipelines.js +67 -0
- package/dist/routes/pipelines.js.map +1 -1
- package/dist/routes/relationships.d.ts.map +1 -1
- package/dist/routes/relationships.js +3 -0
- package/dist/routes/relationships.js.map +1 -1
- package/openapi/openapi.json +1465 -213
- package/package.json +15 -13
package/README.md
CHANGED
|
@@ -7,10 +7,10 @@ Remote apps should **call** this service over HTTP — not reinvent wiring by in
|
|
|
7
7
|
## Install / run
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
npm install @x12i/memorix-service@3.0.
|
|
10
|
+
npm install @x12i/memorix-service@3.0.3 # composition library / CLI
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
Prefer the monorepo stack (service + Studio +
|
|
13
|
+
Prefer the monorepo stack (service + Studio + opx-source):
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
16
|
# from repo root
|
|
@@ -26,8 +26,12 @@ MEMORIX_SERVICE_MODE=dev npm run dev # metadata in-memory; durable routes 503
|
|
|
26
26
|
|
|
27
27
|
| | |
|
|
28
28
|
|--|--|
|
|
29
|
-
| Default port | **5100** (`MEMORIX_SERVICE_PORT`) |
|
|
29
|
+
| Default port | **5100** (`MEMORIX_SERVICE_PORT`, zone `memorix`) |
|
|
30
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).
|
|
31
35
|
|
|
32
36
|
## Library exports
|
|
33
37
|
|
|
@@ -46,8 +50,8 @@ import {
|
|
|
46
50
|
Every `/api/*` request requires:
|
|
47
51
|
|
|
48
52
|
```http
|
|
49
|
-
x-memorix-org-id:
|
|
50
|
-
x-memorix-agent-ids:
|
|
53
|
+
x-memorix-org-id: sandboxdemo
|
|
54
|
+
x-memorix-agent-ids: opx
|
|
51
55
|
```
|
|
52
56
|
|
|
53
57
|
Singular `agentId` headers are rejected. `agentIds[]` selects **effective metadata**; `orgId` selects the **data** universe.
|
|
@@ -57,8 +61,8 @@ Singular `agentId` headers are rejected. `agentIds[]` selects **effective metada
|
|
|
57
61
|
```bash
|
|
58
62
|
curl -s http://127.0.0.1:5100/health
|
|
59
63
|
curl -s http://127.0.0.1:5100/api/diagnostics/scope \
|
|
60
|
-
-H 'x-memorix-org-id:
|
|
61
|
-
-H 'x-memorix-agent-ids:
|
|
64
|
+
-H 'x-memorix-org-id: sandboxdemo' \
|
|
65
|
+
-H 'x-memorix-agent-ids: opx'
|
|
62
66
|
```
|
|
63
67
|
|
|
64
68
|
## Route families
|
|
@@ -68,13 +72,24 @@ curl -s http://127.0.0.1:5100/api/diagnostics/scope \
|
|
|
68
72
|
| `/api/metadata` | Kinds, definitions, install/publish |
|
|
69
73
|
| `/api/data` | Content get/list/write, compose, abstract |
|
|
70
74
|
| `/api/relationships` | Query / discover / verify / rebuild (**no** ad-hoc link PUT) |
|
|
71
|
-
| `/api/memory` | Pull, raw, sources, runs |
|
|
75
|
+
| `/api/memory` | Pull, raw, sources, **checkpoints**, schedules, runs, `commit-page`, connection probe |
|
|
72
76
|
| `/api/pipelines` | Definitions, start, runs, retry/resume |
|
|
73
77
|
| `/api/operations` | Operational helpers |
|
|
74
78
|
| `/api/workflow` | Workflow sibling content |
|
|
75
79
|
| `/api/intelligence` | Profiles / proposals (never auto-install) |
|
|
76
80
|
| `/api/data-journey` | Evidence cone + expected-vs-filled coverage |
|
|
77
81
|
|
|
82
|
+
### Memory (operator + called-service)
|
|
83
|
+
|
|
84
|
+
| Method | Path | Notes |
|
|
85
|
+
|--------|------|-------|
|
|
86
|
+
| `GET` | `/api/memory/sources/{sourceId}/connection` | Probe configured URL |
|
|
87
|
+
| `GET`/`PUT`/`POST` | `…/checkpoints` (+ `/reset`) | Source position per OT × route |
|
|
88
|
+
| `POST` | `…/commit-page` | Model B atomic land + checkpoint |
|
|
89
|
+
| `POST` | `/api/memory/pull` | **Operator-only** — rejected when `x-memorix-invocation-grant` is present |
|
|
90
|
+
|
|
91
|
+
Called services with `memorixAccess` receive an HMAC grant scoped to `explore` · `checkpoints` · `raw`. Prefer **`@x12i/memorix-sdk`** (`/client` / `/worker`) over raw fetch.
|
|
92
|
+
|
|
78
93
|
### Data journey (read-only)
|
|
79
94
|
|
|
80
95
|
| Method | Path |
|
|
@@ -98,5 +113,6 @@ curl -s http://127.0.0.1:5100/api/diagnostics/scope \
|
|
|
98
113
|
## Docs
|
|
99
114
|
|
|
100
115
|
- [`documentation/http-api.md`](../documentation/http-api.md) · OpenAPI in-repo [`openapi/openapi.json`](./openapi/openapi.json)
|
|
101
|
-
-
|
|
102
|
-
-
|
|
116
|
+
- Capability SDK: [`@x12i/memorix-sdk`](../memorix-sdk/) · HTTP client: [`@x12i/memorix-client`](../memorix-client/)
|
|
117
|
+
- Ebooks: [Platform Overview](../memorix-docs/00-platform-overview/) · [Services](../memorix-docs/07-services/) · [Runtime Data Client](../memorix-docs/02-runtime-data-client/)
|
|
118
|
+
- Hub: [https://docs.memorix.x12i.com](https://docs.memorix.x12i.com) · npm `@x12i/memorix-docs`
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enforce callback grants on Explore / Memory / checkpoint routes.
|
|
3
|
+
* Product hosts without a grant keep full org-scoped access.
|
|
4
|
+
*/
|
|
5
|
+
import type { FastifyRequest } from "fastify";
|
|
6
|
+
import type { MemorixServiceAccess } from "@x12i/memorix-pipeline/v2";
|
|
7
|
+
import { type CallbackGrantPayload } from "./callback-grant.js";
|
|
8
|
+
export declare function readInvocationGrant(req: FastifyRequest): CallbackGrantPayload | null;
|
|
9
|
+
export declare function requireCallbackAccess(req: FastifyRequest, surface: MemorixServiceAccess): void;
|
|
10
|
+
/**
|
|
11
|
+
* Operator/platform-only routes (e.g. Memory pull). Called-service grants
|
|
12
|
+
* never include pull — reject whenever an invocation grant is present.
|
|
13
|
+
*/
|
|
14
|
+
export declare function forbidCallbackGrant(req: FastifyRequest): void;
|
|
15
|
+
//# sourceMappingURL=access-gate.d.ts.map
|
|
@@ -0,0 +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;AAEtE,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,qBAAqB,CAAC;AAG7B,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;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAQ7D"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ServiceError } from "./errors.js";
|
|
2
|
+
import { grantHasAccess, verifyCallbackGrant, } from "./callback-grant.js";
|
|
3
|
+
import { resolveScope } from "./request-scope.js";
|
|
4
|
+
export function readInvocationGrant(req) {
|
|
5
|
+
const raw = req.headers["x-memorix-invocation-grant"];
|
|
6
|
+
const token = Array.isArray(raw) ? raw[0] : raw;
|
|
7
|
+
if (!token || typeof token !== "string")
|
|
8
|
+
return null;
|
|
9
|
+
return verifyCallbackGrant(token);
|
|
10
|
+
}
|
|
11
|
+
export function requireCallbackAccess(req, surface) {
|
|
12
|
+
const grant = readInvocationGrant(req);
|
|
13
|
+
if (!grant)
|
|
14
|
+
return; // product host — no grant restriction
|
|
15
|
+
const scope = resolveScope(req);
|
|
16
|
+
if (grant.orgId !== scope.orgId) {
|
|
17
|
+
throw new ServiceError("ACCESS_DENIED", "invocation grant orgId mismatch", 403);
|
|
18
|
+
}
|
|
19
|
+
const grantAgents = [...grant.agentIds].sort().join(",");
|
|
20
|
+
const scopeAgents = [...scope.agentIds].sort().join(",");
|
|
21
|
+
if (grantAgents !== scopeAgents) {
|
|
22
|
+
throw new ServiceError("ACCESS_DENIED", "invocation grant agentIds mismatch", 403);
|
|
23
|
+
}
|
|
24
|
+
if (!grantHasAccess(grant, surface)) {
|
|
25
|
+
throw new ServiceError("ACCESS_DENIED", `invocation grant does not include "${surface}"`, 403);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Operator/platform-only routes (e.g. Memory pull). Called-service grants
|
|
30
|
+
* never include pull — reject whenever an invocation grant is present.
|
|
31
|
+
*/
|
|
32
|
+
export function forbidCallbackGrant(req) {
|
|
33
|
+
const grant = readInvocationGrant(req);
|
|
34
|
+
if (!grant)
|
|
35
|
+
return;
|
|
36
|
+
throw new ServiceError("ACCESS_DENIED", "invocation grant cannot call operator-only Memory pull; use explore / checkpoints / raw / commit-page", 403);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=access-gate.js.map
|
|
@@ -0,0 +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,EACL,cAAc,EACd,mBAAmB,GAEpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,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,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,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;;;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"}
|
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;
|
|
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;AAgBvB,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,CA0D5E;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
|
@@ -12,6 +12,7 @@ import { registerMetadataRoutes } from "./routes/metadata.js";
|
|
|
12
12
|
import { registerDataRoutes } from "./routes/data.js";
|
|
13
13
|
import { registerRelationshipRoutes } from "./routes/relationships.js";
|
|
14
14
|
import { registerMemoryRoutes } from "./routes/memory.js";
|
|
15
|
+
import { registerConnectorInvocationRoutes } from "./routes/connector-invocations.js";
|
|
15
16
|
import { registerPipelineRoutes } from "./routes/pipelines.js";
|
|
16
17
|
import { registerOperationsRoutes } from "./routes/operations.js";
|
|
17
18
|
import { registerWorkflowRoutes } from "./routes/workflow.js";
|
|
@@ -60,11 +61,14 @@ export async function createMemorixServiceApp(opts) {
|
|
|
60
61
|
await registerDataRoutes(app, platform);
|
|
61
62
|
await registerRelationshipRoutes(app, platform);
|
|
62
63
|
await registerMemoryRoutes(app, platform);
|
|
64
|
+
await registerConnectorInvocationRoutes(app, platform);
|
|
63
65
|
await registerPipelineRoutes(app, platform);
|
|
64
66
|
await registerOperationsRoutes(app, platform);
|
|
65
67
|
await registerWorkflowRoutes(app, platform);
|
|
66
68
|
await registerIntelligenceRoutes(app, platform);
|
|
67
69
|
await registerDataJourneyRoutes(app, platform);
|
|
70
|
+
// Minute-resolution Memory pull schedule ticker (collector-only; not pipelines).
|
|
71
|
+
platform.startMemoryScheduleTicker({ intervalMs: 60_000 });
|
|
68
72
|
return { app, platform, port: core.port };
|
|
69
73
|
}
|
|
70
74
|
export async function startMemorixServiceHttp(opts) {
|
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,16 @@
|
|
|
1
|
+
import type { MemorixServiceAccess } from "@x12i/memorix-pipeline/v2";
|
|
2
|
+
export type CallbackGrantPayload = {
|
|
3
|
+
orgId: string;
|
|
4
|
+
agentIds: string[];
|
|
5
|
+
access: MemorixServiceAccess[];
|
|
6
|
+
runId: string;
|
|
7
|
+
stepId: string;
|
|
8
|
+
exp: number;
|
|
9
|
+
};
|
|
10
|
+
export declare function resolveCallbackHmacSecret(): string;
|
|
11
|
+
export declare function issueCallbackGrant(input: Omit<CallbackGrantPayload, "exp"> & {
|
|
12
|
+
ttlMs?: number;
|
|
13
|
+
}, secret?: string): string;
|
|
14
|
+
export declare function verifyCallbackGrant(token: string, secret?: string): CallbackGrantPayload | null;
|
|
15
|
+
export declare function grantHasAccess(grant: CallbackGrantPayload, surface: MemorixServiceAccess): boolean;
|
|
16
|
+
//# sourceMappingURL=callback-grant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callback-grant.d.ts","sourceRoot":"","sources":["../src/callback-grant.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAIF,wBAAgB,yBAAyB,IAAI,MAAM,CAMlD;AAiBD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE,KAAK,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAC7D,MAAM,SAA8B,GACnC,MAAM,CAcR;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,MAAM,SAA8B,GACnC,oBAAoB,GAAG,IAAI,CA0B7B;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAET"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-issued HMAC callback grants for bi-directional workers.
|
|
3
|
+
* The grant is the source of truth; clients must not escalate access by mutating arrays.
|
|
4
|
+
*/
|
|
5
|
+
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
6
|
+
const DEFAULT_TTL_MS = 60 * 60 * 1000;
|
|
7
|
+
export function resolveCallbackHmacSecret() {
|
|
8
|
+
return (process.env.MEMORIX_CALLBACK_HMAC_SECRET?.trim() ||
|
|
9
|
+
process.env.MEMORIX_SERVICE_SECRET?.trim() ||
|
|
10
|
+
"memorix-dev-callback-secret");
|
|
11
|
+
}
|
|
12
|
+
function b64url(buf) {
|
|
13
|
+
const b = typeof buf === "string" ? Buffer.from(buf, "utf8") : buf;
|
|
14
|
+
return b
|
|
15
|
+
.toString("base64")
|
|
16
|
+
.replace(/\+/g, "-")
|
|
17
|
+
.replace(/\//g, "_")
|
|
18
|
+
.replace(/=+$/, "");
|
|
19
|
+
}
|
|
20
|
+
function fromB64url(s) {
|
|
21
|
+
const pad = s.length % 4 === 0 ? "" : "=".repeat(4 - (s.length % 4));
|
|
22
|
+
const b64 = s.replace(/-/g, "+").replace(/_/g, "/") + pad;
|
|
23
|
+
return Buffer.from(b64, "base64");
|
|
24
|
+
}
|
|
25
|
+
export function issueCallbackGrant(input, secret = resolveCallbackHmacSecret()) {
|
|
26
|
+
const payload = {
|
|
27
|
+
orgId: input.orgId,
|
|
28
|
+
agentIds: [...input.agentIds],
|
|
29
|
+
access: [...input.access],
|
|
30
|
+
runId: input.runId,
|
|
31
|
+
stepId: input.stepId,
|
|
32
|
+
exp: Date.now() + (input.ttlMs ?? DEFAULT_TTL_MS),
|
|
33
|
+
};
|
|
34
|
+
const body = b64url(JSON.stringify(payload));
|
|
35
|
+
const sig = b64url(createHmac("sha256", secret).update(body).digest());
|
|
36
|
+
return `${body}.${sig}`;
|
|
37
|
+
}
|
|
38
|
+
export function verifyCallbackGrant(token, secret = resolveCallbackHmacSecret()) {
|
|
39
|
+
const parts = token.split(".");
|
|
40
|
+
if (parts.length !== 2)
|
|
41
|
+
return null;
|
|
42
|
+
const [body, sig] = parts;
|
|
43
|
+
if (!body || !sig)
|
|
44
|
+
return null;
|
|
45
|
+
const expected = b64url(createHmac("sha256", secret).update(body).digest());
|
|
46
|
+
try {
|
|
47
|
+
const a = Buffer.from(sig);
|
|
48
|
+
const b = Buffer.from(expected);
|
|
49
|
+
if (a.length !== b.length || !timingSafeEqual(a, b))
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
let payload;
|
|
56
|
+
try {
|
|
57
|
+
payload = JSON.parse(fromB64url(body).toString("utf8"));
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
if (!payload?.orgId || !Array.isArray(payload.agentIds) || !Array.isArray(payload.access)) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
if (typeof payload.exp !== "number" || Date.now() > payload.exp)
|
|
66
|
+
return null;
|
|
67
|
+
return payload;
|
|
68
|
+
}
|
|
69
|
+
export function grantHasAccess(grant, surface) {
|
|
70
|
+
return grant.access.includes(surface);
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=callback-grant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callback-grant.js","sourceRoot":"","sources":["../src/callback-grant.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,5 +3,5 @@ export { resolveScope } from "./request-scope.js";
|
|
|
3
3
|
export { ServiceError, mapErrorToHttp, redactSecrets, type ServiceErrorBody, } from "./errors.js";
|
|
4
4
|
export { createMemorixPlatform, PlatformStartupError, type MemorixPlatform, type PlatformDeps, type RuntimeMode, type OrgPorts, } from "./platform.js";
|
|
5
5
|
export { createMemorixServiceApp, startMemorixServiceHttp, type CreateMemorixServiceAppOptions, type StartMemorixServiceOptions, } from "./app.js";
|
|
6
|
-
export {
|
|
6
|
+
export { generateSandboxOrgId, beginIsolationSession, cleanupIsolationSession, isolationEvidence, assertSafeSandboxOrgId, SANDBOX_ORG_PATTERN, SANDBOX_ORG_PREFIX, IsolationError, type IsolationSession, } from "./isolation.js";
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,cAAc,EACd,aAAa,EACb,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,QAAQ,GACd,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,KAAK,8BAA8B,EACnC,KAAK,0BAA0B,GAChC,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,cAAc,EACd,aAAa,EACb,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,QAAQ,GACd,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,KAAK,8BAA8B,EACnC,KAAK,0BAA0B,GAChC,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,KAAK,gBAAgB,GACtB,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,5 +3,5 @@ export { resolveScope } from "./request-scope.js";
|
|
|
3
3
|
export { ServiceError, mapErrorToHttp, redactSecrets, } from "./errors.js";
|
|
4
4
|
export { createMemorixPlatform, PlatformStartupError, } from "./platform.js";
|
|
5
5
|
export { createMemorixServiceApp, startMemorixServiceHttp, } from "./app.js";
|
|
6
|
-
export {
|
|
6
|
+
export { generateSandboxOrgId, beginIsolationSession, cleanupIsolationSession, isolationEvidence, assertSafeSandboxOrgId, SANDBOX_ORG_PATTERN, SANDBOX_ORG_PREFIX, IsolationError, } from "./isolation.js";
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,GAErB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,cAAc,EACd,aAAa,GAEd,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GAKrB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,uBAAuB,EACvB,uBAAuB,GAGxB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,GAErB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,cAAc,EACd,aAAa,GAEd,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GAKrB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,uBAAuB,EACvB,uBAAuB,GAGxB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,GAEf,MAAM,gBAAgB,CAAC"}
|
package/dist/isolation.d.ts
CHANGED
|
@@ -1,16 +1,12 @@
|
|
|
1
1
|
import type { MongoClient } from "mongodb";
|
|
2
|
-
export declare const
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const G12_ORG_PREFIX = "g12ops";
|
|
5
|
-
export declare const G10_ORG_PATTERN: RegExp;
|
|
6
|
-
export declare const G11_ORG_PATTERN: RegExp;
|
|
7
|
-
export declare const G12_ORG_PATTERN: RegExp;
|
|
8
|
-
export declare const ACCEPTANCE_ORG_PATTERN: RegExp;
|
|
2
|
+
export declare const SANDBOX_ORG_PREFIX = "sandbox";
|
|
3
|
+
export declare const SANDBOX_ORG_PATTERN: RegExp;
|
|
9
4
|
export declare const FORBIDDEN_ORG_SUBSTRINGS: readonly ["neo", "fieldstone"];
|
|
10
5
|
export type DatabaseKindName = "entity" | "event" | "knowledge" | "operational" | "metadata";
|
|
11
6
|
export type IsolationSession = {
|
|
12
7
|
orgId: string;
|
|
13
|
-
|
|
8
|
+
/** Default `["opx"]`; KnowX acceptance uses `["knowx"]` (inherits opx via parent). */
|
|
9
|
+
agentIds: readonly string[];
|
|
14
10
|
allowedDatabaseNames: string[];
|
|
15
11
|
createdDatabaseNames: string[];
|
|
16
12
|
preflightExisting: string[];
|
|
@@ -21,13 +17,8 @@ export declare class IsolationError extends Error {
|
|
|
21
17
|
readonly code = "DB_ISOLATION_VIOLATION";
|
|
22
18
|
constructor(message: string);
|
|
23
19
|
}
|
|
24
|
-
export declare function
|
|
25
|
-
export declare function
|
|
26
|
-
export declare function assertSafeG12OrgId(orgId: string): void;
|
|
27
|
-
export declare function assertSafeAcceptanceOrgId(orgId: string, gate?: "g10" | "g11" | "g12" | "any"): void;
|
|
28
|
-
export declare function generateG10OrgId(token?: string): string;
|
|
29
|
-
export declare function generateG11OrgId(token?: string): string;
|
|
30
|
-
export declare function generateG12OrgId(token?: string): string;
|
|
20
|
+
export declare function assertSafeSandboxOrgId(orgId: string): void;
|
|
21
|
+
export declare function generateSandboxOrgId(token?: string): string;
|
|
31
22
|
export declare function allowedDatabasesForOrg(orgId: string): string[];
|
|
32
23
|
/** Read-only list of DB names that already exist for this org prefix. */
|
|
33
24
|
export declare function preflightOrgDatabases(client: MongoClient, orgId: string): Promise<{
|
|
@@ -37,22 +28,15 @@ export declare function preflightOrgDatabases(client: MongoClient, orgId: string
|
|
|
37
28
|
export declare function beginIsolationSession(client: MongoClient, opts?: {
|
|
38
29
|
token?: string;
|
|
39
30
|
maxAttempts?: number;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
export declare function beginG11IsolationSession(client: MongoClient, opts?: {
|
|
43
|
-
token?: string;
|
|
44
|
-
maxAttempts?: number;
|
|
45
|
-
}): Promise<IsolationSession>;
|
|
46
|
-
export declare function beginG12IsolationSession(client: MongoClient, opts?: {
|
|
47
|
-
token?: string;
|
|
48
|
-
maxAttempts?: number;
|
|
31
|
+
/** Defaults to `["opx"]`. Use `["knowx"]` for KnowX pack acceptance. */
|
|
32
|
+
agentIds?: readonly string[];
|
|
49
33
|
}): Promise<IsolationSession>;
|
|
50
34
|
export declare function recordCreatedDatabase(session: IsolationSession, dbName: string): void;
|
|
51
35
|
/** Drop only DBs recorded in this session's creation ledger (collections then empty DB if permitted). */
|
|
52
36
|
export declare function cleanupIsolationSession(client: MongoClient, session: IsolationSession): Promise<string[]>;
|
|
53
37
|
export declare function isolationEvidence(session: IsolationSession, extra?: Record<string, unknown>): {
|
|
54
38
|
orgId: string;
|
|
55
|
-
agentIds: [
|
|
39
|
+
agentIds: readonly string[];
|
|
56
40
|
allowedDatabaseNames: string[];
|
|
57
41
|
preflightExisting: string[];
|
|
58
42
|
createdDatabaseNames: string[];
|
package/dist/isolation.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isolation.d.ts","sourceRoot":"","sources":["../src/isolation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"isolation.d.ts","sourceRoot":"","sources":["../src/isolation.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAC5C,eAAO,MAAM,mBAAmB,QAAuB,CAAC;AACxD,eAAO,MAAM,wBAAwB,gCAAiC,CAAC;AAEvE,MAAM,MAAM,gBAAgB,GACxB,QAAQ,GACR,OAAO,GACP,WAAW,GACX,aAAa,GACb,UAAU,CAAC;AAEf,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,sFAAsF;IACtF,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,sBAAsB,EAAE,IAAI,CAAC;CAC9B,CAAC;AAEF,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,4BAA4B;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAe1D;AAED,wBAAgB,oBAAoB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAS9D;AAED,yEAAyE;AACzE,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CASpD;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,WAAW,EACnB,IAAI,CAAC,EAAE;IACL,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B,GACA,OAAO,CAAC,gBAAgB,CAAC,CAoB3B;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAQrF;AAED,yGAAyG;AACzG,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,MAAM,EAAE,CAAC,CA2BnB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;EAY3F"}
|
package/dist/isolation.js
CHANGED
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Database isolation guard for
|
|
3
|
-
* Org
|
|
2
|
+
* Database isolation guard for sandbox acceptance drills.
|
|
3
|
+
* Org pattern: sandbox* — never neo/fieldstone/prior customer orgs.
|
|
4
|
+
* Agent ids are orthogonal to org id (default ops; KnowX sessions use knowx).
|
|
4
5
|
* Cleanup may only drop DBs recorded in this run's creation ledger.
|
|
5
6
|
*/
|
|
6
7
|
import { randomBytes } from "node:crypto";
|
|
7
8
|
import { databaseNameFor } from "@x12i/memorix-data";
|
|
8
|
-
export const
|
|
9
|
-
export const
|
|
10
|
-
export const G12_ORG_PREFIX = "g12ops";
|
|
11
|
-
export const G10_ORG_PATTERN = /^g10ops[a-z0-9]+$/;
|
|
12
|
-
export const G11_ORG_PATTERN = /^g11ops[a-z0-9]+$/;
|
|
13
|
-
export const G12_ORG_PATTERN = /^g12ops[a-z0-9]+$/;
|
|
14
|
-
export const ACCEPTANCE_ORG_PATTERN = /^g1[012]ops[a-z0-9]+$/;
|
|
9
|
+
export const SANDBOX_ORG_PREFIX = "sandbox";
|
|
10
|
+
export const SANDBOX_ORG_PATTERN = /^sandbox[a-z0-9]+$/;
|
|
15
11
|
export const FORBIDDEN_ORG_SUBSTRINGS = ["neo", "fieldstone"];
|
|
16
12
|
export class IsolationError extends Error {
|
|
17
13
|
code = "DB_ISOLATION_VIOLATION";
|
|
@@ -20,25 +16,9 @@ export class IsolationError extends Error {
|
|
|
20
16
|
this.name = "IsolationError";
|
|
21
17
|
}
|
|
22
18
|
}
|
|
23
|
-
export function
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
export function assertSafeG11OrgId(orgId) {
|
|
27
|
-
assertSafeAcceptanceOrgId(orgId, "g11");
|
|
28
|
-
}
|
|
29
|
-
export function assertSafeG12OrgId(orgId) {
|
|
30
|
-
assertSafeAcceptanceOrgId(orgId, "g12");
|
|
31
|
-
}
|
|
32
|
-
export function assertSafeAcceptanceOrgId(orgId, gate = "any") {
|
|
33
|
-
const pattern = gate === "g10"
|
|
34
|
-
? G10_ORG_PATTERN
|
|
35
|
-
: gate === "g11"
|
|
36
|
-
? G11_ORG_PATTERN
|
|
37
|
-
: gate === "g12"
|
|
38
|
-
? G12_ORG_PATTERN
|
|
39
|
-
: ACCEPTANCE_ORG_PATTERN;
|
|
40
|
-
if (!pattern.test(orgId)) {
|
|
41
|
-
throw new IsolationError(`orgId must match ${pattern}: got ${JSON.stringify(orgId)}`);
|
|
19
|
+
export function assertSafeSandboxOrgId(orgId) {
|
|
20
|
+
if (!SANDBOX_ORG_PATTERN.test(orgId)) {
|
|
21
|
+
throw new IsolationError(`orgId must match ${SANDBOX_ORG_PATTERN}: got ${JSON.stringify(orgId)}`);
|
|
42
22
|
}
|
|
43
23
|
const lower = orgId.toLowerCase();
|
|
44
24
|
for (const bad of FORBIDDEN_ORG_SUBSTRINGS) {
|
|
@@ -50,24 +30,14 @@ export function assertSafeAcceptanceOrgId(orgId, gate = "any") {
|
|
|
50
30
|
throw new IsolationError(`forbidden orgId ${orgId}`);
|
|
51
31
|
}
|
|
52
32
|
}
|
|
53
|
-
export function
|
|
54
|
-
return generateAcceptanceOrgId("g10ops", token);
|
|
55
|
-
}
|
|
56
|
-
export function generateG11OrgId(token) {
|
|
57
|
-
return generateAcceptanceOrgId("g11ops", token);
|
|
58
|
-
}
|
|
59
|
-
export function generateG12OrgId(token) {
|
|
60
|
-
return generateAcceptanceOrgId("g12ops", token);
|
|
61
|
-
}
|
|
62
|
-
function generateAcceptanceOrgId(prefix, token) {
|
|
33
|
+
export function generateSandboxOrgId(token) {
|
|
63
34
|
const t = (token ?? randomBytes(6).toString("hex")).toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
64
|
-
const orgId = `${
|
|
65
|
-
|
|
66
|
-
assertSafeAcceptanceOrgId(orgId, gate);
|
|
35
|
+
const orgId = `${SANDBOX_ORG_PREFIX}${t}`;
|
|
36
|
+
assertSafeSandboxOrgId(orgId);
|
|
67
37
|
return orgId;
|
|
68
38
|
}
|
|
69
39
|
export function allowedDatabasesForOrg(orgId) {
|
|
70
|
-
|
|
40
|
+
assertSafeSandboxOrgId(orgId);
|
|
71
41
|
return [
|
|
72
42
|
databaseNameFor(orgId, "entity"),
|
|
73
43
|
databaseNameFor(orgId, "event"),
|
|
@@ -78,7 +48,7 @@ export function allowedDatabasesForOrg(orgId) {
|
|
|
78
48
|
}
|
|
79
49
|
/** Read-only list of DB names that already exist for this org prefix. */
|
|
80
50
|
export async function preflightOrgDatabases(client, orgId) {
|
|
81
|
-
|
|
51
|
+
assertSafeSandboxOrgId(orgId);
|
|
82
52
|
const allowed = new Set(allowedDatabasesForOrg(orgId));
|
|
83
53
|
const admin = client.db().admin();
|
|
84
54
|
const { databases } = await admin.listDatabases();
|
|
@@ -89,21 +59,17 @@ export async function preflightOrgDatabases(client, orgId) {
|
|
|
89
59
|
}
|
|
90
60
|
export async function beginIsolationSession(client, opts) {
|
|
91
61
|
const max = opts?.maxAttempts ?? 8;
|
|
92
|
-
const
|
|
62
|
+
const agentIds = opts?.agentIds?.length ? [...opts.agentIds] : ["opx"];
|
|
93
63
|
for (let i = 0; i < max; i++) {
|
|
94
64
|
const token = opts?.token && i === 0 ? opts.token : undefined;
|
|
95
|
-
const orgId =
|
|
96
|
-
? generateG12OrgId(token)
|
|
97
|
-
: prefix === "g11ops"
|
|
98
|
-
? generateG11OrgId(token)
|
|
99
|
-
: generateG10OrgId(token);
|
|
65
|
+
const orgId = generateSandboxOrgId(token);
|
|
100
66
|
const { existing, conflict } = await preflightOrgDatabases(client, orgId);
|
|
101
67
|
if (conflict)
|
|
102
68
|
continue;
|
|
103
69
|
const allowed = allowedDatabasesForOrg(orgId);
|
|
104
70
|
return {
|
|
105
71
|
orgId,
|
|
106
|
-
agentIds
|
|
72
|
+
agentIds,
|
|
107
73
|
allowedDatabaseNames: allowed,
|
|
108
74
|
createdDatabaseNames: [],
|
|
109
75
|
preflightExisting: existing,
|
|
@@ -111,16 +77,10 @@ export async function beginIsolationSession(client, opts) {
|
|
|
111
77
|
zeroPreexistingMutated: true,
|
|
112
78
|
};
|
|
113
79
|
}
|
|
114
|
-
throw new IsolationError(`could not allocate unused
|
|
115
|
-
}
|
|
116
|
-
export async function beginG11IsolationSession(client, opts) {
|
|
117
|
-
return beginIsolationSession(client, { ...opts, prefix: "g11ops" });
|
|
118
|
-
}
|
|
119
|
-
export async function beginG12IsolationSession(client, opts) {
|
|
120
|
-
return beginIsolationSession(client, { ...opts, prefix: "g12ops" });
|
|
80
|
+
throw new IsolationError(`could not allocate unused sandbox orgId after retries`);
|
|
121
81
|
}
|
|
122
82
|
export function recordCreatedDatabase(session, dbName) {
|
|
123
|
-
|
|
83
|
+
assertSafeSandboxOrgId(session.orgId);
|
|
124
84
|
if (!session.allowedDatabaseNames.includes(dbName)) {
|
|
125
85
|
throw new IsolationError(`cannot create database outside ledger allow-list: ${dbName}`);
|
|
126
86
|
}
|
|
@@ -130,7 +90,7 @@ export function recordCreatedDatabase(session, dbName) {
|
|
|
130
90
|
}
|
|
131
91
|
/** Drop only DBs recorded in this session's creation ledger (collections then empty DB if permitted). */
|
|
132
92
|
export async function cleanupIsolationSession(client, session) {
|
|
133
|
-
|
|
93
|
+
assertSafeSandboxOrgId(session.orgId);
|
|
134
94
|
const dropped = [];
|
|
135
95
|
for (const name of session.createdDatabaseNames) {
|
|
136
96
|
if (!name.startsWith(session.orgId + "_")) {
|
package/dist/isolation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isolation.js","sourceRoot":"","sources":["../src/isolation.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"isolation.js","sourceRoot":"","sources":["../src/isolation.ts"],"names":[],"mappings":"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"}
|
package/dist/known-packs.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { MetadataPack } from "@x12i/memorix-metadata";
|
|
2
|
-
/** Load a known disk pack (
|
|
2
|
+
/** Load a known disk pack (opx, knowx) for explicit install — never auto-installs. */
|
|
3
3
|
export declare function loadKnownMetadataPack(packId: string): MetadataPack;
|
|
4
4
|
export declare function listKnownPackIds(): string[];
|
|
5
5
|
//# sourceMappingURL=known-packs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"known-packs.d.ts","sourceRoot":"","sources":["../src/known-packs.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"known-packs.d.ts","sourceRoot":"","sources":["../src/known-packs.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAW3D,sFAAsF;AACtF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAkBlE;AAED,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C"}
|
package/dist/known-packs.js
CHANGED
|
@@ -5,9 +5,10 @@ import { ServiceError } from "./errors.js";
|
|
|
5
5
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
6
6
|
const REPO_ROOT = resolve(__dirname, "../..");
|
|
7
7
|
const KNOWN_PACKS = {
|
|
8
|
-
|
|
8
|
+
opx: resolve(REPO_ROOT, "memorix-metadata/examples/opx/normalized/pack.json"),
|
|
9
|
+
knowx: resolve(REPO_ROOT, "memorix-metadata/examples/knowx/normalized/pack.json"),
|
|
9
10
|
};
|
|
10
|
-
/** Load a known disk pack (
|
|
11
|
+
/** Load a known disk pack (opx, knowx) for explicit install — never auto-installs. */
|
|
11
12
|
export function loadKnownMetadataPack(packId) {
|
|
12
13
|
const path = KNOWN_PACKS[packId];
|
|
13
14
|
if (!path) {
|
package/dist/known-packs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"known-packs.js","sourceRoot":"","sources":["../src/known-packs.ts"],"names":[],"mappings":"AAAA,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;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAE9C,MAAM,WAAW,GAA2B;IAC1C,GAAG,EAAE,OAAO,CAAC,SAAS,EAAE,oDAAoD,CAAC;
|
|
1
|
+
{"version":3,"file":"known-packs.js","sourceRoot":"","sources":["../src/known-packs.ts"],"names":[],"mappings":"AAAA,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;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAE9C,MAAM,WAAW,GAA2B;IAC1C,GAAG,EAAE,OAAO,CAAC,SAAS,EAAE,oDAAoD,CAAC;IAC7E,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,sDAAsD,CAAC;CAClF,CAAC;AAEF,sFAAsF;AACtF,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,YAAY,CACpB,cAAc,EACd,mBAAmB,MAAM,aAAa,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC3E,GAAG,CACJ,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAiB,CAAC;IAChE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,YAAY,CACpB,kBAAkB,EAClB,uBAAuB,MAAM,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACpF,GAAG,CACJ,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAClC,CAAC"}
|