@x12i/memorix-package-seed 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +114 -0
- package/dist/agent-merge.d.ts +17 -0
- package/dist/agent-merge.d.ts.map +1 -0
- package/dist/agent-merge.js +94 -0
- package/dist/agent-merge.js.map +1 -0
- package/dist/catalox.d.ts +21 -0
- package/dist/catalox.d.ts.map +1 -0
- package/dist/catalox.js +37 -0
- package/dist/catalox.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +161 -0
- package/dist/cli.js.map +1 -0
- package/dist/constants.d.ts +13 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +37 -0
- package/dist/constants.js.map +1 -0
- package/dist/ensure-seeded.d.ts +36 -0
- package/dist/ensure-seeded.d.ts.map +1 -0
- package/dist/ensure-seeded.js +335 -0
- package/dist/ensure-seeded.js.map +1 -0
- package/dist/errors.d.ts +13 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +13 -0
- package/dist/errors.js.map +1 -0
- package/dist/hash.d.ts +6 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +27 -0
- package/dist/hash.js.map +1 -0
- package/dist/identity.d.ts +8 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +60 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/lease.d.ts +17 -0
- package/dist/lease.d.ts.map +1 -0
- package/dist/lease.js +113 -0
- package/dist/lease.js.map +1 -0
- package/dist/ledger.d.ts +20 -0
- package/dist/ledger.d.ts.map +1 -0
- package/dist/ledger.js +48 -0
- package/dist/ledger.js.map +1 -0
- package/dist/manifest.d.ts +9 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +275 -0
- package/dist/manifest.js.map +1 -0
- package/dist/platform-core.d.ts +19 -0
- package/dist/platform-core.d.ts.map +1 -0
- package/dist/platform-core.js +68 -0
- package/dist/platform-core.js.map +1 -0
- package/dist/secrets.d.ts +2 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +34 -0
- package/dist/secrets.js.map +1 -0
- package/dist/types.d.ts +115 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/writers/inventory-agents.d.ts +3 -0
- package/dist/writers/inventory-agents.d.ts.map +1 -0
- package/dist/writers/inventory-agents.js +102 -0
- package/dist/writers/inventory-agents.js.map +1 -0
- package/dist/writers/native-items.d.ts +6 -0
- package/dist/writers/native-items.d.ts.map +1 -0
- package/dist/writers/native-items.js +63 -0
- package/dist/writers/native-items.js.map +1 -0
- package/dist/writers/orchestration.d.ts +5 -0
- package/dist/writers/orchestration.d.ts.map +1 -0
- package/dist/writers/orchestration.js +102 -0
- package/dist/writers/orchestration.js.map +1 -0
- package/dist/writers/pipeline-services.d.ts +3 -0
- package/dist/writers/pipeline-services.d.ts.map +1 -0
- package/dist/writers/pipeline-services.js +52 -0
- package/dist/writers/pipeline-services.js.map +1 -0
- package/dist/writers/registry.d.ts +5 -0
- package/dist/writers/registry.d.ts.map +1 -0
- package/dist/writers/registry.js +81 -0
- package/dist/writers/registry.js.map +1 -0
- package/dist/writers/worker-bases.d.ts +3 -0
- package/dist/writers/worker-bases.d.ts.map +1 -0
- package/dist/writers/worker-bases.js +36 -0
- package/dist/writers/worker-bases.js.map +1 -0
- package/package.json +62 -0
package/dist/lease.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { DEFAULT_LEASE_POLL_MS, DEFAULT_LEASE_TTL_MS, DEFAULT_LEASE_WAIT_MS, MEMORIX_PACKAGE_SEED_LEASES_COLLECTION, } from "./constants.js";
|
|
3
|
+
import { MemorixPackageSeedError } from "./errors.js";
|
|
4
|
+
export async function acquireSeedLease(db, key, options = {}) {
|
|
5
|
+
const ttlMs = options.ttlMs ?? DEFAULT_LEASE_TTL_MS;
|
|
6
|
+
const waitMs = options.waitMs ?? DEFAULT_LEASE_WAIT_MS;
|
|
7
|
+
const pollMs = options.pollMs ?? DEFAULT_LEASE_POLL_MS;
|
|
8
|
+
const col = db.collection(MEMORIX_PACKAGE_SEED_LEASES_COLLECTION);
|
|
9
|
+
const owner = randomUUID();
|
|
10
|
+
const started = Date.now();
|
|
11
|
+
let fence = 0;
|
|
12
|
+
while (Date.now() - started <= waitMs) {
|
|
13
|
+
const now = new Date();
|
|
14
|
+
const leaseUntil = new Date(now.getTime() + ttlMs);
|
|
15
|
+
const acquired = await col.findOneAndUpdate({
|
|
16
|
+
_id: key,
|
|
17
|
+
$or: [
|
|
18
|
+
{ leaseUntil: { $lte: now } },
|
|
19
|
+
{ leaseUntil: { $exists: false } },
|
|
20
|
+
],
|
|
21
|
+
}, {
|
|
22
|
+
$set: { owner, leaseUntil },
|
|
23
|
+
$inc: { fence: 1 },
|
|
24
|
+
$setOnInsert: { _id: key },
|
|
25
|
+
}, { upsert: true, returnDocument: "after" });
|
|
26
|
+
if (acquired && acquired.owner === owner) {
|
|
27
|
+
fence = acquired.fence;
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
// create if missing without race win
|
|
31
|
+
const existing = await col.findOne({ _id: key });
|
|
32
|
+
if (!existing) {
|
|
33
|
+
try {
|
|
34
|
+
await col.insertOne({
|
|
35
|
+
_id: key,
|
|
36
|
+
owner,
|
|
37
|
+
fence: 1,
|
|
38
|
+
leaseUntil,
|
|
39
|
+
});
|
|
40
|
+
fence = 1;
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
/* raced */
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
await new Promise((r) => setTimeout(r, pollMs));
|
|
48
|
+
}
|
|
49
|
+
if (!fence) {
|
|
50
|
+
throw new MemorixPackageSeedError({
|
|
51
|
+
code: "APPLY_FAILED",
|
|
52
|
+
message: `Timed out acquiring seed lease for ${key}`,
|
|
53
|
+
field: "lease",
|
|
54
|
+
value: key,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
const abort = new AbortController();
|
|
58
|
+
let stopped = false;
|
|
59
|
+
const heartbeat = async () => {
|
|
60
|
+
if (stopped)
|
|
61
|
+
return false;
|
|
62
|
+
const now = new Date();
|
|
63
|
+
const leaseUntil = new Date(now.getTime() + ttlMs);
|
|
64
|
+
const updated = await col.findOneAndUpdate({ _id: key, owner, fence }, { $set: { leaseUntil } }, { returnDocument: "after" });
|
|
65
|
+
if (!updated) {
|
|
66
|
+
abort.abort();
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
return true;
|
|
70
|
+
};
|
|
71
|
+
const interval = setInterval(() => {
|
|
72
|
+
void heartbeat();
|
|
73
|
+
}, Math.max(250, Math.floor(ttlMs / 3)));
|
|
74
|
+
const checkFence = async () => {
|
|
75
|
+
const current = await col.findOne({ _id: key });
|
|
76
|
+
if (!current || current.owner !== owner || current.fence !== fence) {
|
|
77
|
+
abort.abort();
|
|
78
|
+
throw new MemorixPackageSeedError({
|
|
79
|
+
code: "LEASE_LOST",
|
|
80
|
+
message: `Lost seed lease for ${key}`,
|
|
81
|
+
field: "lease",
|
|
82
|
+
value: key,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
if (abort.signal.aborted) {
|
|
86
|
+
throw new MemorixPackageSeedError({
|
|
87
|
+
code: "LEASE_LOST",
|
|
88
|
+
message: `Seed lease aborted for ${key}`,
|
|
89
|
+
field: "lease",
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
const release = async () => {
|
|
94
|
+
stopped = true;
|
|
95
|
+
clearInterval(interval);
|
|
96
|
+
await col.deleteOne({ _id: key, owner, fence });
|
|
97
|
+
};
|
|
98
|
+
const stop = () => {
|
|
99
|
+
stopped = true;
|
|
100
|
+
clearInterval(interval);
|
|
101
|
+
};
|
|
102
|
+
return {
|
|
103
|
+
key,
|
|
104
|
+
owner,
|
|
105
|
+
fence,
|
|
106
|
+
release,
|
|
107
|
+
heartbeat,
|
|
108
|
+
checkFence,
|
|
109
|
+
abortSignal: abort.signal,
|
|
110
|
+
stop,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=lease.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lease.js","sourceRoot":"","sources":["../src/lease.ts"],"names":[],"mappings":"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"}
|
package/dist/ledger.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { CataloxBound } from "@x12i/catalox";
|
|
2
|
+
import type { PackageSeedLedgerItem, PlaneWriteReport } from "./types.js";
|
|
3
|
+
export declare function readLedgerItem(catalox: CataloxBound, packageId: string, targetAgentId: string): Promise<PackageSeedLedgerItem | null>;
|
|
4
|
+
export declare function writeLedgerItem(catalox: CataloxBound, item: PackageSeedLedgerItem): Promise<void>;
|
|
5
|
+
export declare function buildLedgerItem(input: {
|
|
6
|
+
packageId: string;
|
|
7
|
+
primaryAgentId: string;
|
|
8
|
+
targetAgentId: string;
|
|
9
|
+
packageVersion: string;
|
|
10
|
+
seedRevision: string;
|
|
11
|
+
payloadHash: string;
|
|
12
|
+
contentHash: string;
|
|
13
|
+
status: PackageSeedLedgerItem["status"];
|
|
14
|
+
attempts: number;
|
|
15
|
+
appliedBy?: string;
|
|
16
|
+
planes?: PlaneWriteReport[];
|
|
17
|
+
lastError?: PackageSeedLedgerItem["lastError"];
|
|
18
|
+
}): PackageSeedLedgerItem;
|
|
19
|
+
export declare function deleteLedgerItem(catalox: CataloxBound, packageId: string, targetAgentId: string): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=ledger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../src/ledger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAKlD,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE1E,wBAAsB,cAAc,CAClC,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAUvC;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,IAAI,CAAC,CASf;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC5B,SAAS,CAAC,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;CAChD,GAAG,qBAAqB,CAoBxB;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAUf"}
|
package/dist/ledger.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { MEMORIX_PACKAGE_SEED_LEDGER_CATALOG, } from "./constants.js";
|
|
2
|
+
import { ledgerItemId } from "./hash.js";
|
|
3
|
+
export async function readLedgerItem(catalox, packageId, targetAgentId) {
|
|
4
|
+
const id = ledgerItemId(packageId, targetAgentId);
|
|
5
|
+
const result = await catalox.getCatalogItem(MEMORIX_PACKAGE_SEED_LEDGER_CATALOG, id);
|
|
6
|
+
if (result.outcome === "not_found" || result.outcome === "mapping_blocked") {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
return (result.item.data ?? result.item);
|
|
10
|
+
}
|
|
11
|
+
export async function writeLedgerItem(catalox, item) {
|
|
12
|
+
const { id, ...rest } = item;
|
|
13
|
+
await catalox.upsertNativeCatalogItem(MEMORIX_PACKAGE_SEED_LEDGER_CATALOG, {
|
|
14
|
+
...rest,
|
|
15
|
+
id,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
export function buildLedgerItem(input) {
|
|
19
|
+
const now = new Date().toISOString();
|
|
20
|
+
return {
|
|
21
|
+
id: ledgerItemId(input.packageId, input.targetAgentId),
|
|
22
|
+
kind: "package-seed-ledger",
|
|
23
|
+
packageId: input.packageId,
|
|
24
|
+
primaryAgentId: input.primaryAgentId,
|
|
25
|
+
targetAgentId: input.targetAgentId,
|
|
26
|
+
packageVersion: input.packageVersion,
|
|
27
|
+
seedRevision: input.seedRevision,
|
|
28
|
+
payloadHash: input.payloadHash,
|
|
29
|
+
contentHash: input.contentHash,
|
|
30
|
+
status: input.status,
|
|
31
|
+
attempts: input.attempts,
|
|
32
|
+
updatedAt: now,
|
|
33
|
+
appliedAt: input.status === "applied" ? now : undefined,
|
|
34
|
+
appliedBy: input.appliedBy,
|
|
35
|
+
planes: input.planes,
|
|
36
|
+
lastError: input.lastError,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export async function deleteLedgerItem(catalox, packageId, targetAgentId) {
|
|
40
|
+
const id = ledgerItemId(packageId, targetAgentId);
|
|
41
|
+
try {
|
|
42
|
+
await catalox.deleteNativeCatalogItem(MEMORIX_PACKAGE_SEED_LEDGER_CATALOG, id);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
/* ignore missing */
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=ledger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../src/ledger.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mCAAmC,GACpC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGzC,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAqB,EACrB,SAAiB,EACjB,aAAqB;IAErB,MAAM,EAAE,GAAG,YAAY,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CACzC,mCAAmC,EACnC,EAAE,CACH,CAAC;IACF,IAAI,MAAM,CAAC,OAAO,KAAK,WAAW,IAAI,MAAM,CAAC,OAAO,KAAK,iBAAiB,EAAE,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAA0B,CAAC;AACpE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAqB,EACrB,IAA2B;IAE3B,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IAC7B,MAAM,OAAO,CAAC,uBAAuB,CACnC,mCAAmC,EACnC;QACE,GAAG,IAAI;QACP,EAAE;KACwB,CAC7B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAa/B;IACC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO;QACL,EAAE,EAAE,YAAY,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC;QACtD,IAAI,EAAE,qBAAqB;QAC3B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;QACvD,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAqB,EACrB,SAAiB,EACjB,aAAqB;IAErB,MAAM,EAAE,GAAG,YAAY,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,uBAAuB,CACnC,mCAAmC,EACnC,EAAE,CACH,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;IACtB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { LoadedPackageSeed, PackageSeedIdentity } from "./types.js";
|
|
2
|
+
export declare function loadPackageSeedJson(seedDir: string): PackageSeedIdentity | null;
|
|
3
|
+
export declare function loadManifestFromDir(seedDir: string, options?: {
|
|
4
|
+
identity?: PackageSeedIdentity;
|
|
5
|
+
cliAgentId?: string;
|
|
6
|
+
}): LoadedPackageSeed;
|
|
7
|
+
export declare function loadIdentityFromPackageJson(packageJsonPath: string): Pick<PackageSeedIdentity, "packageId" | "packageVersion">;
|
|
8
|
+
export declare function resolveSeedDirBeside(packageRoot: string): string;
|
|
9
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EAGpB,MAAM,YAAY,CAAC;AAgDpB,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,GACd,mBAAmB,GAAG,IAAI,CAI5B;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;CAChB,GACL,iBAAiB,CAwNnB;AAED,wBAAgB,2BAA2B,CACzC,eAAe,EAAE,MAAM,GACtB,IAAI,CAAC,mBAAmB,EAAE,WAAW,GAAG,gBAAgB,CAAC,CAY3D;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEhE"}
|
package/dist/manifest.js
ADDED
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { existsSync, readFileSync, readdirSync, realpathSync, statSync } from "node:fs";
|
|
2
|
+
import { dirname, isAbsolute, join, resolve, sep } from "node:path";
|
|
3
|
+
import { BUILTIN_PLANE_KINDS, MAX_PACK_BYTES, MAX_PLANE_FILE_BYTES, MAX_PLANES, MAX_TOTAL_ITEMS, } from "./constants.js";
|
|
4
|
+
import { MemorixPackageSeedError } from "./errors.js";
|
|
5
|
+
import { hashCanonical } from "./hash.js";
|
|
6
|
+
import { assertIdentitiesMatch, normalizeIdentity, } from "./identity.js";
|
|
7
|
+
import { mergePlaneItems } from "./agent-merge.js";
|
|
8
|
+
import { assertNoSecrets } from "./secrets.js";
|
|
9
|
+
function readJsonFile(path) {
|
|
10
|
+
const size = statSync(path).size;
|
|
11
|
+
if (size > MAX_PLANE_FILE_BYTES) {
|
|
12
|
+
throw new MemorixPackageSeedError({
|
|
13
|
+
code: "PAYLOAD_TOO_LARGE",
|
|
14
|
+
message: `File exceeds ${MAX_PLANE_FILE_BYTES} bytes: ${path}`,
|
|
15
|
+
field: path,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
19
|
+
}
|
|
20
|
+
function assertSafeRelativePath(seedDir, relativePath) {
|
|
21
|
+
if (!relativePath || isAbsolute(relativePath) || relativePath.includes("\0")) {
|
|
22
|
+
throw new MemorixPackageSeedError({
|
|
23
|
+
code: "INVALID_PATH",
|
|
24
|
+
message: `Unsafe plane path: ${relativePath}`,
|
|
25
|
+
field: "file",
|
|
26
|
+
value: relativePath,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const seedRoot = realpathSync(seedDir);
|
|
30
|
+
const resolved = resolve(seedRoot, relativePath);
|
|
31
|
+
const real = existsSync(resolved) ? realpathSync(resolved) : resolved;
|
|
32
|
+
if (real !== seedRoot && !real.startsWith(seedRoot + sep)) {
|
|
33
|
+
throw new MemorixPackageSeedError({
|
|
34
|
+
code: "INVALID_PATH",
|
|
35
|
+
message: `Plane path escapes seed root: ${relativePath}`,
|
|
36
|
+
field: "file",
|
|
37
|
+
value: relativePath,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return real;
|
|
41
|
+
}
|
|
42
|
+
function asArray(value, label) {
|
|
43
|
+
if (!Array.isArray(value)) {
|
|
44
|
+
throw new MemorixPackageSeedError({
|
|
45
|
+
code: "INVALID_PLANE",
|
|
46
|
+
message: `${label} must be a JSON array`,
|
|
47
|
+
field: label,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
export function loadPackageSeedJson(seedDir) {
|
|
53
|
+
const path = join(seedDir, "package-seed.json");
|
|
54
|
+
if (!existsSync(path))
|
|
55
|
+
return null;
|
|
56
|
+
return readJsonFile(path);
|
|
57
|
+
}
|
|
58
|
+
export function loadManifestFromDir(seedDir, options = {}) {
|
|
59
|
+
const absoluteSeedDir = resolve(seedDir);
|
|
60
|
+
if (!existsSync(absoluteSeedDir) || !statSync(absoluteSeedDir).isDirectory()) {
|
|
61
|
+
throw new MemorixPackageSeedError({
|
|
62
|
+
code: "INVALID_PATH",
|
|
63
|
+
message: `Seed directory not found: ${absoluteSeedDir}`,
|
|
64
|
+
field: "seedsDir",
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
const packageSeed = loadPackageSeedJson(absoluteSeedDir);
|
|
68
|
+
const manifestPath = join(absoluteSeedDir, "package-seed.manifest.json");
|
|
69
|
+
if (!existsSync(manifestPath)) {
|
|
70
|
+
throw new MemorixPackageSeedError({
|
|
71
|
+
code: "INVALID_MANIFEST",
|
|
72
|
+
message: `Missing package-seed.manifest.json in ${absoluteSeedDir}`,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
const manifest = readJsonFile(manifestPath);
|
|
76
|
+
if (manifest.schemaVersion !== 1) {
|
|
77
|
+
throw new MemorixPackageSeedError({
|
|
78
|
+
code: "INVALID_MANIFEST",
|
|
79
|
+
message: `Unsupported schemaVersion: ${String(manifest.schemaVersion)}`,
|
|
80
|
+
field: "schemaVersion",
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
if (!manifest.seedRevision?.trim()) {
|
|
84
|
+
throw new MemorixPackageSeedError({
|
|
85
|
+
code: "INVALID_MANIFEST",
|
|
86
|
+
message: "manifest.seedRevision is required",
|
|
87
|
+
field: "seedRevision",
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
if (!Array.isArray(manifest.planes) || manifest.planes.length === 0) {
|
|
91
|
+
throw new MemorixPackageSeedError({
|
|
92
|
+
code: "INVALID_MANIFEST",
|
|
93
|
+
message: "manifest.planes must be a non-empty array",
|
|
94
|
+
field: "planes",
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
if (manifest.planes.length > MAX_PLANES) {
|
|
98
|
+
throw new MemorixPackageSeedError({
|
|
99
|
+
code: "PAYLOAD_TOO_LARGE",
|
|
100
|
+
message: `Too many planes (max ${MAX_PLANES})`,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
const identity = normalizeIdentity({
|
|
104
|
+
packageId: options.identity?.packageId ?? packageSeed?.packageId ?? manifest.packageId,
|
|
105
|
+
packageVersion: options.identity?.packageVersion ??
|
|
106
|
+
packageSeed?.packageVersion ??
|
|
107
|
+
"0.0.0",
|
|
108
|
+
agentId: options.cliAgentId ??
|
|
109
|
+
options.identity?.agentId ??
|
|
110
|
+
packageSeed?.agentId ??
|
|
111
|
+
manifest.agentId,
|
|
112
|
+
targetAgentIds: options.identity?.targetAgentIds ??
|
|
113
|
+
packageSeed?.targetAgentIds ??
|
|
114
|
+
manifest.targetAgentIds,
|
|
115
|
+
});
|
|
116
|
+
if (packageSeed) {
|
|
117
|
+
assertIdentitiesMatch(identity, {
|
|
118
|
+
...packageSeed,
|
|
119
|
+
targetAgentIds: packageSeed.targetAgentIds ?? identity.targetAgentIds,
|
|
120
|
+
}, "package-seed.json");
|
|
121
|
+
}
|
|
122
|
+
assertIdentitiesMatch(identity, {
|
|
123
|
+
packageId: manifest.packageId,
|
|
124
|
+
packageVersion: identity.packageVersion,
|
|
125
|
+
agentId: manifest.agentId,
|
|
126
|
+
targetAgentIds: manifest.targetAgentIds ?? identity.targetAgentIds,
|
|
127
|
+
}, "package-seed.manifest.json");
|
|
128
|
+
if (options.cliAgentId && options.cliAgentId !== identity.agentId) {
|
|
129
|
+
throw new MemorixPackageSeedError({
|
|
130
|
+
code: "IDENTITY_MISMATCH",
|
|
131
|
+
message: `--agent ${options.cliAgentId} does not match identity.agentId ${identity.agentId}`,
|
|
132
|
+
field: "agent",
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
const allowAdditionalAgents = Boolean(manifest.options?.allowAdditionalAgents);
|
|
136
|
+
const planes = [];
|
|
137
|
+
let totalItems = 0;
|
|
138
|
+
let totalBytes = 0;
|
|
139
|
+
const seenKinds = new Set();
|
|
140
|
+
for (const plane of manifest.planes) {
|
|
141
|
+
if (!plane?.kind || !plane.catalogId) {
|
|
142
|
+
throw new MemorixPackageSeedError({
|
|
143
|
+
code: "INVALID_PLANE",
|
|
144
|
+
message: "Each plane requires kind and catalogId",
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
if (!BUILTIN_PLANE_KINDS.includes(plane.kind)) {
|
|
148
|
+
throw new MemorixPackageSeedError({
|
|
149
|
+
code: "UNKNOWN_PLANE_KIND",
|
|
150
|
+
message: `Unknown plane kind: ${plane.kind}`,
|
|
151
|
+
field: "kind",
|
|
152
|
+
value: plane.kind,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
if (plane.file && plane.inline) {
|
|
156
|
+
throw new MemorixPackageSeedError({
|
|
157
|
+
code: "INVALID_PLANE",
|
|
158
|
+
message: `Plane ${plane.kind} cannot set both file and inline`,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
let rawItems;
|
|
162
|
+
let source;
|
|
163
|
+
if (plane.inline) {
|
|
164
|
+
rawItems = asArray(plane.inline, `${plane.kind}.inline`);
|
|
165
|
+
source = "inline";
|
|
166
|
+
}
|
|
167
|
+
else if (plane.file) {
|
|
168
|
+
const filePath = assertSafeRelativePath(absoluteSeedDir, plane.file);
|
|
169
|
+
if (!existsSync(filePath)) {
|
|
170
|
+
throw new MemorixPackageSeedError({
|
|
171
|
+
code: "INVALID_PATH",
|
|
172
|
+
message: `Plane file not found: ${plane.file}`,
|
|
173
|
+
field: "file",
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
totalBytes += statSync(filePath).size;
|
|
177
|
+
rawItems = asArray(readJsonFile(filePath), plane.file);
|
|
178
|
+
source = plane.file;
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
throw new MemorixPackageSeedError({
|
|
182
|
+
code: "INVALID_PLANE",
|
|
183
|
+
message: `Plane ${plane.kind} requires file or inline`,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
assertNoSecrets(rawItems, plane.kind);
|
|
187
|
+
const items = mergePlaneItems(rawItems, identity.agentId, {
|
|
188
|
+
targetAgentIds: identity.targetAgentIds,
|
|
189
|
+
allowAdditionalAgents,
|
|
190
|
+
injectAgents: plane.kind !== "inventory-agents",
|
|
191
|
+
});
|
|
192
|
+
totalItems += items.length;
|
|
193
|
+
if (totalItems > MAX_TOTAL_ITEMS) {
|
|
194
|
+
throw new MemorixPackageSeedError({
|
|
195
|
+
code: "PAYLOAD_TOO_LARGE",
|
|
196
|
+
message: `Too many items (max ${MAX_TOTAL_ITEMS})`,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
const key = `${plane.kind}:${plane.catalogId}:${source ?? "inline"}`;
|
|
200
|
+
if (seenKinds.has(key)) {
|
|
201
|
+
throw new MemorixPackageSeedError({
|
|
202
|
+
code: "INVALID_PLANE",
|
|
203
|
+
message: `Duplicate plane source: ${key}`,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
seenKinds.add(key);
|
|
207
|
+
planes.push({
|
|
208
|
+
kind: plane.kind,
|
|
209
|
+
catalogId: plane.catalogId,
|
|
210
|
+
items,
|
|
211
|
+
options: plane.options,
|
|
212
|
+
source,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
if (totalBytes > MAX_PACK_BYTES) {
|
|
216
|
+
throw new MemorixPackageSeedError({
|
|
217
|
+
code: "PAYLOAD_TOO_LARGE",
|
|
218
|
+
message: `Pack exceeds ${MAX_PACK_BYTES} bytes`,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
const artifactPaths = [];
|
|
222
|
+
const artifactsDir = join(absoluteSeedDir, "artifacts");
|
|
223
|
+
if (existsSync(artifactsDir) && statSync(artifactsDir).isDirectory()) {
|
|
224
|
+
const walk = (dir, rel = "artifacts") => {
|
|
225
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
226
|
+
const abs = join(dir, entry.name);
|
|
227
|
+
const nextRel = `${rel}/${entry.name}`;
|
|
228
|
+
if (entry.isDirectory())
|
|
229
|
+
walk(abs, nextRel);
|
|
230
|
+
else
|
|
231
|
+
artifactPaths.push(nextRel);
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
walk(artifactsDir);
|
|
235
|
+
}
|
|
236
|
+
const payloadHash = hashCanonical({
|
|
237
|
+
packageId: identity.packageId,
|
|
238
|
+
agentId: identity.agentId,
|
|
239
|
+
targetAgentIds: identity.targetAgentIds,
|
|
240
|
+
planes: planes.map((p) => ({
|
|
241
|
+
kind: p.kind,
|
|
242
|
+
catalogId: p.catalogId,
|
|
243
|
+
options: p.options ?? {},
|
|
244
|
+
items: p.items,
|
|
245
|
+
})),
|
|
246
|
+
artifacts: artifactPaths.sort(),
|
|
247
|
+
});
|
|
248
|
+
const contentHash = hashCanonical({
|
|
249
|
+
payloadHash,
|
|
250
|
+
seedRevision: manifest.seedRevision,
|
|
251
|
+
});
|
|
252
|
+
return {
|
|
253
|
+
identity,
|
|
254
|
+
manifest,
|
|
255
|
+
planes,
|
|
256
|
+
seedDir: absoluteSeedDir,
|
|
257
|
+
artifactPaths,
|
|
258
|
+
payloadHash,
|
|
259
|
+
contentHash,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
export function loadIdentityFromPackageJson(packageJsonPath) {
|
|
263
|
+
const pkg = readJsonFile(packageJsonPath);
|
|
264
|
+
if (!pkg.name || !pkg.version) {
|
|
265
|
+
throw new MemorixPackageSeedError({
|
|
266
|
+
code: "INVALID_IDENTITY",
|
|
267
|
+
message: "package.json must include name and version",
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
return { packageId: pkg.name, packageVersion: pkg.version };
|
|
271
|
+
}
|
|
272
|
+
export function resolveSeedDirBeside(packageRoot) {
|
|
273
|
+
return dirname(join(packageRoot, "package-seed.manifest.json"));
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type EnsureSeededOptions } from "./ensure-seeded.js";
|
|
2
|
+
import type { EnsureSeededResult } from "./types.js";
|
|
3
|
+
export declare function setPlatformCoreSeedsDir(dir: string | null): void;
|
|
4
|
+
export declare function resolveDefaultPlatformCoreSeedsDir(processEnv?: NodeJS.ProcessEnv): string | null;
|
|
5
|
+
/**
|
|
6
|
+
* Applies/skips the reusable platform-core pack into the destination agent DB.
|
|
7
|
+
* Does not recursively invoke itself. Uses upgrade when core seedRevision increases.
|
|
8
|
+
* Pack identity stays as authored; only the destination Catalox DB changes.
|
|
9
|
+
*/
|
|
10
|
+
export declare function ensurePlatformCoreSeeded(targetAgentId: string, options?: {
|
|
11
|
+
processEnv?: NodeJS.ProcessEnv;
|
|
12
|
+
mongoUri?: string;
|
|
13
|
+
appId?: string;
|
|
14
|
+
seedsDir?: string;
|
|
15
|
+
actor?: string;
|
|
16
|
+
}): Promise<EnsureSeededResult | null>;
|
|
17
|
+
export declare function attachPlatformCoreBootstrap(options: EnsureSeededOptions): EnsureSeededOptions;
|
|
18
|
+
export declare function assertPlatformCoreAvailable(processEnv?: NodeJS.ProcessEnv): string;
|
|
19
|
+
//# sourceMappingURL=platform-core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-core.d.ts","sourceRoot":"","sources":["../src/platform-core.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIrD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAEhE;AAED,wBAAgB,kCAAkC,CAChD,UAAU,GAAE,MAAM,CAAC,UAAwB,GAC1C,MAAM,GAAG,IAAI,CAef;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CACX,GACL,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAgBpC;AAED,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,mBAAmB,GAC3B,mBAAmB,CAWrB;AAED,wBAAgB,2BAA2B,CACzC,UAAU,GAAE,MAAM,CAAC,UAAwB,GAC1C,MAAM,CAUR"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { MemorixPackageSeedError } from "./errors.js";
|
|
4
|
+
import { ensureSeeded } from "./ensure-seeded.js";
|
|
5
|
+
let platformCoreSeedsDir = null;
|
|
6
|
+
export function setPlatformCoreSeedsDir(dir) {
|
|
7
|
+
platformCoreSeedsDir = dir ? resolve(dir) : null;
|
|
8
|
+
}
|
|
9
|
+
export function resolveDefaultPlatformCoreSeedsDir(processEnv = process.env) {
|
|
10
|
+
if (platformCoreSeedsDir)
|
|
11
|
+
return platformCoreSeedsDir;
|
|
12
|
+
const fromEnv = processEnv.PACKAGE_SEED_PLATFORM_CORE_DIR?.trim();
|
|
13
|
+
if (fromEnv)
|
|
14
|
+
return resolve(fromEnv);
|
|
15
|
+
const candidates = [
|
|
16
|
+
resolve(process.cwd(), ".operational/package-seed-packs/_platform-core"),
|
|
17
|
+
resolve(process.cwd(), "../.operational/package-seed-packs/_platform-core"),
|
|
18
|
+
];
|
|
19
|
+
for (const candidate of candidates) {
|
|
20
|
+
if (existsSync(candidate))
|
|
21
|
+
return candidate;
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Applies/skips the reusable platform-core pack into the destination agent DB.
|
|
27
|
+
* Does not recursively invoke itself. Uses upgrade when core seedRevision increases.
|
|
28
|
+
* Pack identity stays as authored; only the destination Catalox DB changes.
|
|
29
|
+
*/
|
|
30
|
+
export async function ensurePlatformCoreSeeded(targetAgentId, options = {}) {
|
|
31
|
+
const processEnv = options.processEnv ?? process.env;
|
|
32
|
+
const seedsDir = options.seedsDir ?? resolveDefaultPlatformCoreSeedsDir(processEnv);
|
|
33
|
+
if (!seedsDir)
|
|
34
|
+
return null;
|
|
35
|
+
return ensureSeeded({
|
|
36
|
+
seedsDir,
|
|
37
|
+
mode: "upgrade",
|
|
38
|
+
processEnv,
|
|
39
|
+
mongoUri: options.mongoUri,
|
|
40
|
+
appId: options.appId,
|
|
41
|
+
actor: options.actor ?? "platform-core",
|
|
42
|
+
skipPlatformCore: true,
|
|
43
|
+
applyTargetAgentIds: [targetAgentId],
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
export function attachPlatformCoreBootstrap(options) {
|
|
47
|
+
if (options.skipPlatformCore || options.ensurePlatformCore)
|
|
48
|
+
return options;
|
|
49
|
+
return {
|
|
50
|
+
...options,
|
|
51
|
+
ensurePlatformCore: (targetAgentId) => ensurePlatformCoreSeeded(targetAgentId, {
|
|
52
|
+
processEnv: options.processEnv,
|
|
53
|
+
mongoUri: options.mongoUri,
|
|
54
|
+
appId: options.appId,
|
|
55
|
+
}),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export function assertPlatformCoreAvailable(processEnv = process.env) {
|
|
59
|
+
const dir = resolveDefaultPlatformCoreSeedsDir(processEnv);
|
|
60
|
+
if (!dir) {
|
|
61
|
+
throw new MemorixPackageSeedError({
|
|
62
|
+
code: "CORE_BOOTSTRAP_FAILED",
|
|
63
|
+
message: "Platform core pack not found; set PACKAGE_SEED_PLATFORM_CORE_DIR or generate .operational/package-seed-packs/_platform-core",
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return dir;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=platform-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-core.js","sourceRoot":"","sources":["../src/platform-core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,YAAY,EAA4B,MAAM,oBAAoB,CAAC;AAG5E,IAAI,oBAAoB,GAAkB,IAAI,CAAC;AAE/C,MAAM,UAAU,uBAAuB,CAAC,GAAkB;IACxD,oBAAoB,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,aAAgC,OAAO,CAAC,GAAG;IAE3C,IAAI,oBAAoB;QAAE,OAAO,oBAAoB,CAAC;IACtD,MAAM,OAAO,GAAG,UAAU,CAAC,8BAA8B,EAAE,IAAI,EAAE,CAAC;IAClE,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG;QACjB,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gDAAgD,CAAC;QACxE,OAAO,CACL,OAAO,CAAC,GAAG,EAAE,EACb,mDAAmD,CACpD;KACF,CAAC;IACF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAC9C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,aAAqB,EACrB,UAMI,EAAE;IAEN,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC;IACrD,MAAM,QAAQ,GACZ,OAAO,CAAC,QAAQ,IAAI,kCAAkC,CAAC,UAAU,CAAC,CAAC;IACrE,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,OAAO,YAAY,CAAC;QAClB,QAAQ;QACR,IAAI,EAAE,SAAS;QACf,UAAU;QACV,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,eAAe;QACvC,gBAAgB,EAAE,IAAI;QACtB,mBAAmB,EAAE,CAAC,aAAa,CAAC;KACrC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,OAA4B;IAE5B,IAAI,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,kBAAkB;QAAE,OAAO,OAAO,CAAC;IAC3E,OAAO;QACL,GAAG,OAAO;QACV,kBAAkB,EAAE,CAAC,aAAa,EAAE,EAAE,CACpC,wBAAwB,CAAC,aAAa,EAAE;YACtC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC;KACL,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,aAAgC,OAAO,CAAC,GAAG;IAE3C,MAAM,GAAG,GAAG,kCAAkC,CAAC,UAAU,CAAC,CAAC;IAC3D,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,uBAAuB,CAAC;YAChC,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EACL,6HAA6H;SAChI,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"AASA,wBAAgB,eAAe,CAC7B,KAAK,EAAE,OAAO,EACd,IAAI,SAAM,GACT,IAAI,CA4BN"}
|
package/dist/secrets.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { MemorixPackageSeedError } from "./errors.js";
|
|
2
|
+
const SECRET_KEY = /(?:^|[_.-])(password|secret|api[_-]?key|private[_-]?key|access[_-]?token)(?:$|[_.-])/i;
|
|
3
|
+
function isRecord(value) {
|
|
4
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
5
|
+
}
|
|
6
|
+
export function assertNoSecrets(value, path = "$") {
|
|
7
|
+
if (Array.isArray(value)) {
|
|
8
|
+
value.forEach((item, index) => assertNoSecrets(item, `${path}[${index}]`));
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
if (!isRecord(value))
|
|
12
|
+
return;
|
|
13
|
+
for (const [key, child] of Object.entries(value)) {
|
|
14
|
+
const childPath = `${path}.${key}`;
|
|
15
|
+
if (key.endsWith("Ref")) {
|
|
16
|
+
assertNoSecrets(child, childPath);
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
if (SECRET_KEY.test(key)) {
|
|
20
|
+
if ((typeof child === "string" && child.trim().length > 0) ||
|
|
21
|
+
(typeof child === "number" && Number.isFinite(child)) ||
|
|
22
|
+
typeof child === "boolean") {
|
|
23
|
+
throw new MemorixPackageSeedError({
|
|
24
|
+
code: "SECRET_DETECTED",
|
|
25
|
+
message: `Secret-like literal value detected at ${childPath}`,
|
|
26
|
+
field: childPath,
|
|
27
|
+
value: "[redacted]",
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
assertNoSecrets(child, childPath);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,UAAU,GACd,uFAAuF,CAAC;AAE1F,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAAc,EACd,IAAI,GAAG,GAAG;IAEV,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO;IAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC;QACnC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAClC,SAAS;QACX,CAAC;QACD,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,IACE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;gBACtD,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACrD,OAAO,KAAK,KAAK,SAAS,EAC1B,CAAC;gBACD,MAAM,IAAI,uBAAuB,CAAC;oBAChC,IAAI,EAAE,iBAAiB;oBACvB,OAAO,EAAE,yCAAyC,SAAS,EAAE;oBAC7D,KAAK,EAAE,SAAS;oBAChB,KAAK,EAAE,YAAY;iBACpB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACpC,CAAC;AACH,CAAC"}
|