@x12i/memorix-service 3.3.0 → 3.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -6
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +10 -0
- package/dist/app.js.map +1 -1
- package/dist/blob-store/config.d.ts +31 -0
- package/dist/blob-store/config.d.ts.map +1 -0
- package/dist/blob-store/config.js +68 -0
- package/dist/blob-store/config.js.map +1 -0
- package/dist/blob-store/disk.d.ts +10 -0
- package/dist/blob-store/disk.d.ts.map +1 -0
- package/dist/blob-store/disk.js +104 -0
- package/dist/blob-store/disk.js.map +1 -0
- package/dist/blob-store/index.d.ts +6 -0
- package/dist/blob-store/index.d.ts.map +1 -0
- package/dist/blob-store/index.js +6 -0
- package/dist/blob-store/index.js.map +1 -0
- package/dist/blob-store/memory.d.ts +4 -0
- package/dist/blob-store/memory.d.ts.map +1 -0
- package/dist/blob-store/memory.js +47 -0
- package/dist/blob-store/memory.js.map +1 -0
- package/dist/blob-store/s3.d.ts +52 -0
- package/dist/blob-store/s3.d.ts.map +1 -0
- package/dist/blob-store/s3.js +151 -0
- package/dist/blob-store/s3.js.map +1 -0
- package/dist/blob-store/types.d.ts +30 -0
- package/dist/blob-store/types.d.ts.map +1 -0
- package/dist/blob-store/types.js +38 -0
- package/dist/blob-store/types.js.map +1 -0
- package/dist/catalog-store-cli.d.ts.map +1 -1
- package/dist/catalog-store-cli.js +35 -4
- package/dist/catalog-store-cli.js.map +1 -1
- package/dist/connector-ops/checkpoint-store.d.ts +7 -0
- package/dist/connector-ops/checkpoint-store.d.ts.map +1 -0
- package/dist/connector-ops/checkpoint-store.js +135 -0
- package/dist/connector-ops/checkpoint-store.js.map +1 -0
- package/dist/connector-ops/checkpoint-types.d.ts +46 -0
- package/dist/connector-ops/checkpoint-types.d.ts.map +1 -0
- package/dist/connector-ops/checkpoint-types.js +14 -0
- package/dist/connector-ops/checkpoint-types.js.map +1 -0
- package/dist/connector-ops/continuous-types.d.ts +141 -0
- package/dist/connector-ops/continuous-types.d.ts.map +1 -0
- package/dist/connector-ops/continuous-types.js +13 -0
- package/dist/connector-ops/continuous-types.js.map +1 -0
- package/dist/connector-ops/coordinator.d.ts +88 -0
- package/dist/connector-ops/coordinator.d.ts.map +1 -0
- package/dist/connector-ops/coordinator.js +174 -0
- package/dist/connector-ops/coordinator.js.map +1 -0
- package/dist/connector-ops/index.d.ts +6 -0
- package/dist/connector-ops/index.d.ts.map +1 -1
- package/dist/connector-ops/index.js +6 -0
- package/dist/connector-ops/index.js.map +1 -1
- package/dist/connector-ops/run-store.d.ts +16 -0
- package/dist/connector-ops/run-store.d.ts.map +1 -0
- package/dist/connector-ops/run-store.js +249 -0
- package/dist/connector-ops/run-store.js.map +1 -0
- package/dist/connector-ops/schedule-lease-store.d.ts +8 -0
- package/dist/connector-ops/schedule-lease-store.d.ts.map +1 -0
- package/dist/connector-ops/schedule-lease-store.js +318 -0
- package/dist/connector-ops/schedule-lease-store.js.map +1 -0
- package/dist/incremental-state/index.d.ts +3 -0
- package/dist/incremental-state/index.d.ts.map +1 -0
- package/dist/incremental-state/index.js +3 -0
- package/dist/incremental-state/index.js.map +1 -0
- package/dist/incremental-state/state-store.d.ts +7 -0
- package/dist/incremental-state/state-store.d.ts.map +1 -0
- package/dist/incremental-state/state-store.js +183 -0
- package/dist/incremental-state/state-store.js.map +1 -0
- package/dist/incremental-state/types.d.ts +104 -0
- package/dist/incremental-state/types.d.ts.map +1 -0
- package/dist/incremental-state/types.js +8 -0
- package/dist/incremental-state/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/integrations/index.d.ts +3 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +3 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/instance-store.d.ts +5 -0
- package/dist/integrations/instance-store.d.ts.map +1 -0
- package/dist/integrations/instance-store.js +327 -0
- package/dist/integrations/instance-store.js.map +1 -0
- package/dist/integrations/types.d.ts +92 -0
- package/dist/integrations/types.d.ts.map +1 -0
- package/dist/integrations/types.js +40 -0
- package/dist/integrations/types.js.map +1 -0
- package/dist/magit/magit-pack-service.d.ts +187 -3
- package/dist/magit/magit-pack-service.d.ts.map +1 -1
- package/dist/magit/magit-pack-service.js +401 -8
- package/dist/magit/magit-pack-service.js.map +1 -1
- package/dist/openapi/openapi.json +1348 -2
- package/dist/platform.d.ts +44 -1
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +172 -1
- package/dist/platform.js.map +1 -1
- package/dist/restricted-store/crypto.d.ts +10 -0
- package/dist/restricted-store/crypto.d.ts.map +1 -0
- package/dist/restricted-store/crypto.js +43 -0
- package/dist/restricted-store/crypto.js.map +1 -0
- package/dist/restricted-store/index.d.ts +4 -0
- package/dist/restricted-store/index.d.ts.map +1 -0
- package/dist/restricted-store/index.js +4 -0
- package/dist/restricted-store/index.js.map +1 -0
- package/dist/restricted-store/object-store.d.ts +12 -0
- package/dist/restricted-store/object-store.d.ts.map +1 -0
- package/dist/restricted-store/object-store.js +233 -0
- package/dist/restricted-store/object-store.js.map +1 -0
- package/dist/restricted-store/types.d.ts +78 -0
- package/dist/restricted-store/types.d.ts.map +1 -0
- package/dist/restricted-store/types.js +12 -0
- package/dist/restricted-store/types.js.map +1 -0
- package/dist/routes/continuous-acquisition.d.ts +5 -0
- package/dist/routes/continuous-acquisition.d.ts.map +1 -0
- package/dist/routes/continuous-acquisition.js +259 -0
- package/dist/routes/continuous-acquisition.js.map +1 -0
- package/dist/routes/incremental-state.d.ts +5 -0
- package/dist/routes/incremental-state.d.ts.map +1 -0
- package/dist/routes/incremental-state.js +173 -0
- package/dist/routes/incremental-state.js.map +1 -0
- package/dist/routes/integrations.d.ts +5 -0
- package/dist/routes/integrations.d.ts.map +1 -0
- package/dist/routes/integrations.js +126 -0
- package/dist/routes/integrations.js.map +1 -0
- package/dist/routes/metadata.d.ts.map +1 -1
- package/dist/routes/metadata.js +328 -4
- package/dist/routes/metadata.js.map +1 -1
- package/dist/routes/restricted-store.d.ts +5 -0
- package/dist/routes/restricted-store.d.ts.map +1 -0
- package/dist/routes/restricted-store.js +117 -0
- package/dist/routes/restricted-store.js.map +1 -0
- package/openapi/openapi.json +1348 -2
- package/package.json +3 -2
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { ServiceError } from "../errors.js";
|
|
2
|
+
import { BREAK_GLASS_HEADER, BREAK_GLASS_REASON_HEADER, } from "../restricted-store/index.js";
|
|
3
|
+
import { resolveConnectorOpsOrg } from "./connector-ops.js";
|
|
4
|
+
function header(headers, name) {
|
|
5
|
+
const v = headers[name] ?? headers[name.toLowerCase()];
|
|
6
|
+
if (Array.isArray(v))
|
|
7
|
+
return v[0];
|
|
8
|
+
return typeof v === "string" ? v : undefined;
|
|
9
|
+
}
|
|
10
|
+
function requireBreakGlass(req) {
|
|
11
|
+
const grant = header(req.headers, BREAK_GLASS_HEADER) ??
|
|
12
|
+
header(req.headers, "x-memorix-break-glass");
|
|
13
|
+
const g = grant?.trim().toLowerCase() ?? "";
|
|
14
|
+
if (g !== "1" && g !== "true") {
|
|
15
|
+
throw new ServiceError("BREAK_GLASS_REQUIRED", "full restricted body requires break-glass grant (x-memorix-break-glass: true)", 403);
|
|
16
|
+
}
|
|
17
|
+
const reason = header(req.headers, BREAK_GLASS_REASON_HEADER) ??
|
|
18
|
+
header(req.headers, "x-memorix-break-glass-reason") ??
|
|
19
|
+
"";
|
|
20
|
+
if (!reason.trim()) {
|
|
21
|
+
throw new ServiceError("BREAK_GLASS_REASON_REQUIRED", "x-memorix-break-glass-reason is required for full body access", 400);
|
|
22
|
+
}
|
|
23
|
+
const actor = header(req.headers, "x-memorix-actor") ??
|
|
24
|
+
header(req.headers, "x-actor") ??
|
|
25
|
+
undefined;
|
|
26
|
+
return { actor, reason: reason.trim() };
|
|
27
|
+
}
|
|
28
|
+
/** FG-A3 restricted encrypted object store. */
|
|
29
|
+
export async function registerRestrictedStoreRoutes(app, platform) {
|
|
30
|
+
const prefix = "/api/restricted-store/v1";
|
|
31
|
+
app.put(`${prefix}/orgs/:orgId/objects`, async (req, reply) => {
|
|
32
|
+
const orgId = resolveConnectorOpsOrg(req);
|
|
33
|
+
const body = (req.body ?? {});
|
|
34
|
+
try {
|
|
35
|
+
const meta = await platform.restrictedObjectsFor(orgId).put(body);
|
|
36
|
+
return reply.code(201).send(meta);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
throw new ServiceError("VALIDATION_ERROR", err instanceof Error ? err.message : String(err), 400);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
app.get(`${prefix}/orgs/:orgId/objects/:objectId/metadata`, async (req) => {
|
|
43
|
+
const orgId = resolveConnectorOpsOrg(req);
|
|
44
|
+
const objectId = req.params.objectId?.trim() ?? "";
|
|
45
|
+
if (!objectId) {
|
|
46
|
+
throw new ServiceError("VALIDATION_ERROR", "objectId required", 400);
|
|
47
|
+
}
|
|
48
|
+
const meta = await platform.restrictedObjectsFor(orgId).getMeta(objectId);
|
|
49
|
+
if (!meta) {
|
|
50
|
+
throw new ServiceError("NOT_FOUND", "restricted object not found", 404);
|
|
51
|
+
}
|
|
52
|
+
// Redacted by construction — no body fields.
|
|
53
|
+
return meta;
|
|
54
|
+
});
|
|
55
|
+
app.get(`${prefix}/orgs/:orgId/objects/:objectId/content`, async (req) => {
|
|
56
|
+
const orgId = resolveConnectorOpsOrg(req);
|
|
57
|
+
const objectId = req.params.objectId?.trim() ?? "";
|
|
58
|
+
if (!objectId) {
|
|
59
|
+
throw new ServiceError("VALIDATION_ERROR", "objectId required", 400);
|
|
60
|
+
}
|
|
61
|
+
const bg = requireBreakGlass(req);
|
|
62
|
+
let result;
|
|
63
|
+
try {
|
|
64
|
+
result = await platform.restrictedObjectsFor(orgId).getContent(objectId);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
throw new ServiceError("RESTRICTED_READ_FAILED", err instanceof Error ? err.message : String(err), 500);
|
|
68
|
+
}
|
|
69
|
+
if (!result) {
|
|
70
|
+
throw new ServiceError("NOT_FOUND", "restricted object not found", 404);
|
|
71
|
+
}
|
|
72
|
+
await platform.restrictedObjectsFor(orgId).recordAccessAudit({
|
|
73
|
+
objectId,
|
|
74
|
+
contentHash: result.meta.contentHash,
|
|
75
|
+
actor: bg.actor,
|
|
76
|
+
reason: bg.reason,
|
|
77
|
+
action: "content-get",
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
objectId: result.meta.objectId,
|
|
81
|
+
contentHash: result.meta.contentHash,
|
|
82
|
+
sizeBytes: result.meta.sizeBytes,
|
|
83
|
+
contentType: result.meta.contentType,
|
|
84
|
+
classification: result.meta.classification,
|
|
85
|
+
/** Full body as base64 — only on break-glass path. */
|
|
86
|
+
bodyBase64: result.body.toString("base64"),
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
app.delete(`${prefix}/orgs/:orgId/objects/:objectId`, async (req, reply) => {
|
|
90
|
+
const orgId = resolveConnectorOpsOrg(req);
|
|
91
|
+
const objectId = req.params.objectId?.trim() ?? "";
|
|
92
|
+
if (!objectId) {
|
|
93
|
+
throw new ServiceError("VALIDATION_ERROR", "objectId required", 400);
|
|
94
|
+
}
|
|
95
|
+
const ok = await platform.restrictedObjectsFor(orgId).delete(objectId);
|
|
96
|
+
if (!ok) {
|
|
97
|
+
throw new ServiceError("NOT_FOUND", "restricted object not found", 404);
|
|
98
|
+
}
|
|
99
|
+
return reply.code(204).send();
|
|
100
|
+
});
|
|
101
|
+
app.post(`${prefix}/orgs/:orgId/purge-expired`, async (req) => {
|
|
102
|
+
const orgId = resolveConnectorOpsOrg(req);
|
|
103
|
+
const purged = await platform.restrictedObjectsFor(orgId).purgeExpired();
|
|
104
|
+
return { orgId, purged };
|
|
105
|
+
});
|
|
106
|
+
app.get(`${prefix}/orgs/:orgId/access-audits`, async (req) => {
|
|
107
|
+
const orgId = resolveConnectorOpsOrg(req);
|
|
108
|
+
const q = (req.query ?? {});
|
|
109
|
+
const objectId = typeof q.objectId === "string" ? q.objectId.trim() : undefined;
|
|
110
|
+
const limit = q.limit != null ? Number(q.limit) : undefined;
|
|
111
|
+
const audits = await platform
|
|
112
|
+
.restrictedObjectsFor(orgId)
|
|
113
|
+
.listAccessAudits({ objectId, limit });
|
|
114
|
+
return { orgId, audits };
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=restricted-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restricted-store.js","sourceRoot":"","sources":["../../src/routes/restricted-store.ts"],"names":[],"mappings":"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"}
|