@runcore-sh/runcore 0.1.8 → 0.1.10
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/dist/access/manifest.d.ts +59 -0
- package/dist/access/manifest.d.ts.map +1 -0
- package/dist/access/manifest.js +251 -0
- package/dist/access/manifest.js.map +1 -0
- package/dist/activity/log.d.ts +1 -1
- package/dist/activity/log.d.ts.map +1 -1
- package/dist/agents/autonomous.d.ts.map +1 -1
- package/dist/agents/autonomous.js +38 -0
- package/dist/agents/autonomous.js.map +1 -1
- package/dist/agents/governance.d.ts +70 -0
- package/dist/agents/governance.d.ts.map +1 -0
- package/dist/agents/governance.js +220 -0
- package/dist/agents/governance.js.map +1 -0
- package/dist/agents/governed-spawn.d.ts +83 -0
- package/dist/agents/governed-spawn.d.ts.map +1 -0
- package/dist/agents/governed-spawn.js +186 -0
- package/dist/agents/governed-spawn.js.map +1 -0
- package/dist/agents/heartbeat.d.ts +91 -0
- package/dist/agents/heartbeat.d.ts.map +1 -0
- package/dist/agents/heartbeat.js +323 -0
- package/dist/agents/heartbeat.js.map +1 -0
- package/dist/agents/index.d.ts +4 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +6 -1
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/spawn-policy.d.ts +45 -0
- package/dist/agents/spawn-policy.d.ts.map +1 -0
- package/dist/agents/spawn-policy.js +202 -0
- package/dist/agents/spawn-policy.js.map +1 -0
- package/dist/alert.d.ts +16 -0
- package/dist/alert.d.ts.map +1 -0
- package/dist/alert.js +70 -0
- package/dist/alert.js.map +1 -0
- package/dist/cli.js +261 -32
- package/dist/cli.js.map +1 -1
- package/dist/credentials/store.d.ts +1 -1
- package/dist/credentials/store.d.ts.map +1 -1
- package/dist/credentials/store.js +14 -3
- package/dist/credentials/store.js.map +1 -1
- package/dist/crystallizer.d.ts +56 -0
- package/dist/crystallizer.d.ts.map +1 -0
- package/dist/crystallizer.js +159 -0
- package/dist/crystallizer.js.map +1 -0
- package/dist/distiller.d.ts +48 -0
- package/dist/distiller.d.ts.map +1 -0
- package/dist/distiller.js +140 -0
- package/dist/distiller.js.map +1 -0
- package/dist/files/deep-index.d.ts +59 -0
- package/dist/files/deep-index.d.ts.map +1 -0
- package/dist/files/deep-index.js +337 -0
- package/dist/files/deep-index.js.map +1 -0
- package/dist/files/import.d.ts +44 -0
- package/dist/files/import.d.ts.map +1 -0
- package/dist/files/import.js +213 -0
- package/dist/files/import.js.map +1 -0
- package/dist/files/index-local.d.ts +37 -0
- package/dist/files/index-local.d.ts.map +1 -0
- package/dist/files/index-local.js +198 -0
- package/dist/files/index-local.js.map +1 -0
- package/dist/google/auth.d.ts +2 -0
- package/dist/google/auth.d.ts.map +1 -1
- package/dist/google/auth.js +2 -0
- package/dist/google/auth.js.map +1 -1
- package/dist/integrations/gate.d.ts +40 -0
- package/dist/integrations/gate.d.ts.map +1 -0
- package/dist/integrations/gate.js +100 -0
- package/dist/integrations/gate.js.map +1 -0
- package/dist/lib/audit.d.ts +43 -0
- package/dist/lib/audit.d.ts.map +1 -0
- package/dist/lib/audit.js +120 -0
- package/dist/lib/audit.js.map +1 -0
- package/dist/lib/brain-io.d.ts.map +1 -1
- package/dist/lib/brain-io.js +52 -0
- package/dist/lib/brain-io.js.map +1 -1
- package/dist/lib/dpapi.d.ts +14 -0
- package/dist/lib/dpapi.d.ts.map +1 -0
- package/dist/lib/dpapi.js +104 -0
- package/dist/lib/dpapi.js.map +1 -0
- package/dist/lib/glob-match.d.ts +22 -0
- package/dist/lib/glob-match.d.ts.map +1 -0
- package/dist/lib/glob-match.js +64 -0
- package/dist/lib/glob-match.js.map +1 -0
- package/dist/lib/locked.d.ts +40 -0
- package/dist/lib/locked.d.ts.map +1 -0
- package/dist/lib/locked.js +130 -0
- package/dist/lib/locked.js.map +1 -0
- package/dist/llm/complete.d.ts.map +1 -1
- package/dist/llm/complete.js +5 -2
- package/dist/llm/complete.js.map +1 -1
- package/dist/llm/fetch-guard.d.ts +16 -0
- package/dist/llm/fetch-guard.d.ts.map +1 -0
- package/dist/llm/fetch-guard.js +61 -0
- package/dist/llm/fetch-guard.js.map +1 -0
- package/dist/llm/guard.d.ts +40 -0
- package/dist/llm/guard.d.ts.map +1 -0
- package/dist/llm/guard.js +88 -0
- package/dist/llm/guard.js.map +1 -0
- package/dist/llm/membrane.d.ts +46 -0
- package/dist/llm/membrane.d.ts.map +1 -0
- package/dist/llm/membrane.js +123 -0
- package/dist/llm/membrane.js.map +1 -0
- package/dist/llm/providers/index.d.ts +5 -1
- package/dist/llm/providers/index.d.ts.map +1 -1
- package/dist/llm/providers/index.js +8 -1
- package/dist/llm/providers/index.js.map +1 -1
- package/dist/llm/redact.d.ts +39 -0
- package/dist/llm/redact.d.ts.map +1 -0
- package/dist/llm/redact.js +155 -0
- package/dist/llm/redact.js.map +1 -0
- package/dist/llm/sensitive-registry.d.ts +33 -0
- package/dist/llm/sensitive-registry.d.ts.map +1 -0
- package/dist/llm/sensitive-registry.js +106 -0
- package/dist/llm/sensitive-registry.js.map +1 -0
- package/dist/mcp-server.d.ts +11 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +520 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/mdns.d.ts +17 -0
- package/dist/mdns.d.ts.map +1 -0
- package/dist/mdns.js +110 -0
- package/dist/mdns.js.map +1 -0
- package/dist/nerve/push.d.ts +26 -0
- package/dist/nerve/push.d.ts.map +1 -0
- package/dist/nerve/push.js +170 -0
- package/dist/nerve/push.js.map +1 -0
- package/dist/nerve/state.d.ts +35 -0
- package/dist/nerve/state.d.ts.map +1 -0
- package/dist/nerve/state.js +257 -0
- package/dist/nerve/state.js.map +1 -0
- package/dist/posture/engine.d.ts +41 -0
- package/dist/posture/engine.d.ts.map +1 -0
- package/dist/posture/engine.js +217 -0
- package/dist/posture/engine.js.map +1 -0
- package/dist/posture/index.d.ts +11 -0
- package/dist/posture/index.d.ts.map +1 -0
- package/dist/posture/index.js +10 -0
- package/dist/posture/index.js.map +1 -0
- package/dist/posture/middleware.d.ts +30 -0
- package/dist/posture/middleware.d.ts.map +1 -0
- package/dist/posture/middleware.js +92 -0
- package/dist/posture/middleware.js.map +1 -0
- package/dist/posture/types.d.ts +61 -0
- package/dist/posture/types.d.ts.map +1 -0
- package/dist/posture/types.js +48 -0
- package/dist/posture/types.js.map +1 -0
- package/dist/resend/inbox.d.ts +23 -0
- package/dist/resend/inbox.d.ts.map +1 -0
- package/dist/resend/inbox.js +198 -0
- package/dist/resend/inbox.js.map +1 -0
- package/dist/resend/webhooks.d.ts +30 -0
- package/dist/resend/webhooks.d.ts.map +1 -0
- package/dist/resend/webhooks.js +244 -0
- package/dist/resend/webhooks.js.map +1 -0
- package/dist/server.d.ts +5 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +773 -58
- package/dist/server.js.map +1 -1
- package/dist/settings.d.ts +14 -1
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +32 -1
- package/dist/settings.js.map +1 -1
- package/dist/tier/bond.d.ts +51 -0
- package/dist/tier/bond.d.ts.map +1 -0
- package/dist/tier/bond.js +154 -0
- package/dist/tier/bond.js.map +1 -0
- package/dist/tier/freeze.d.ts +21 -0
- package/dist/tier/freeze.d.ts.map +1 -0
- package/dist/tier/freeze.js +73 -0
- package/dist/tier/freeze.js.map +1 -0
- package/dist/tier/gate.d.ts +11 -0
- package/dist/tier/gate.d.ts.map +1 -0
- package/dist/tier/gate.js +25 -0
- package/dist/tier/gate.js.map +1 -0
- package/dist/tier/heartbeat.d.ts +22 -0
- package/dist/tier/heartbeat.d.ts.map +1 -0
- package/dist/tier/heartbeat.js +128 -0
- package/dist/tier/heartbeat.js.map +1 -0
- package/dist/tier/token.d.ts +22 -0
- package/dist/tier/token.d.ts.map +1 -0
- package/dist/tier/token.js +100 -0
- package/dist/tier/token.js.map +1 -0
- package/dist/tier/types.d.ts +44 -0
- package/dist/tier/types.d.ts.map +1 -0
- package/dist/tier/types.js +61 -0
- package/dist/tier/types.js.map +1 -0
- package/dist/updater.d.ts +32 -0
- package/dist/updater.d.ts.map +1 -0
- package/dist/updater.js +145 -0
- package/dist/updater.js.map +1 -0
- package/dist/vault/policy.d.ts +42 -0
- package/dist/vault/policy.d.ts.map +1 -0
- package/dist/vault/policy.js +159 -0
- package/dist/vault/policy.js.map +1 -0
- package/dist/vault/store.d.ts +6 -0
- package/dist/vault/store.d.ts.map +1 -1
- package/dist/vault/store.js +15 -5
- package/dist/vault/store.js.map +1 -1
- package/dist/vault/transfer.d.ts +33 -0
- package/dist/vault/transfer.d.ts.map +1 -0
- package/dist/vault/transfer.js +187 -0
- package/dist/vault/transfer.js.map +1 -0
- package/dist/voucher.d.ts +39 -0
- package/dist/voucher.d.ts.map +1 -0
- package/dist/voucher.js +105 -0
- package/dist/voucher.js.map +1 -0
- package/dist/webhooks/handlers.d.ts +10 -0
- package/dist/webhooks/handlers.d.ts.map +1 -1
- package/dist/webhooks/handlers.js +53 -0
- package/dist/webhooks/handlers.js.map +1 -1
- package/dist/webhooks/index.d.ts +2 -2
- package/dist/webhooks/index.d.ts.map +1 -1
- package/dist/webhooks/index.js +2 -2
- package/dist/webhooks/index.js.map +1 -1
- package/dist/webhooks/verify.d.ts +8 -0
- package/dist/webhooks/verify.d.ts.map +1 -1
- package/dist/webhooks/verify.js +56 -0
- package/dist/webhooks/verify.js.map +1 -1
- package/package.json +8 -2
- package/public/board.html +8 -3
- package/public/browser.html +8 -3
- package/public/library.html +8 -3
- package/public/observatory.html +8 -3
- package/public/ops.html +8 -3
- package/public/registry.html +627 -0
- package/public/roadmap.html +975 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry heartbeat — periodic check-in for tier >= byok.
|
|
3
|
+
*
|
|
4
|
+
* Reports: version, tier, uptime.
|
|
5
|
+
* Receives: token validity, freeze signals.
|
|
6
|
+
* Non-blocking, best-effort. Failures are logged, not fatal.
|
|
7
|
+
*/
|
|
8
|
+
import { readFileSync } from "node:fs";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
const REGISTRY_URL = "https://runcore.sh/api/registry";
|
|
11
|
+
const HEARTBEAT_INTERVAL_MS = 6 * 60 * 60 * 1000; // 6 hours
|
|
12
|
+
const REVALIDATE_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
13
|
+
let heartbeatTimer = null;
|
|
14
|
+
let revalidateTimer = null;
|
|
15
|
+
let startedAt = Date.now();
|
|
16
|
+
let frozen = false;
|
|
17
|
+
let onFreeze = null;
|
|
18
|
+
let onDowngrade = null;
|
|
19
|
+
export function onFreezeSignal(handler) {
|
|
20
|
+
onFreeze = handler;
|
|
21
|
+
}
|
|
22
|
+
export function onTierDowngrade(handler) {
|
|
23
|
+
onDowngrade = handler;
|
|
24
|
+
}
|
|
25
|
+
export function isFrozen() {
|
|
26
|
+
return frozen;
|
|
27
|
+
}
|
|
28
|
+
function getVersion() {
|
|
29
|
+
try {
|
|
30
|
+
const pkg = JSON.parse(readFileSync(join(import.meta.dirname, "../../package.json"), "utf-8"));
|
|
31
|
+
return pkg.version ?? "unknown";
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return "unknown";
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async function sendHeartbeat(jwt, tier) {
|
|
38
|
+
try {
|
|
39
|
+
const res = await fetch(`${REGISTRY_URL}/heartbeat`, {
|
|
40
|
+
method: "POST",
|
|
41
|
+
headers: {
|
|
42
|
+
"Content-Type": "application/json",
|
|
43
|
+
Authorization: `Bearer ${jwt}`,
|
|
44
|
+
},
|
|
45
|
+
body: JSON.stringify({
|
|
46
|
+
version: getVersion(),
|
|
47
|
+
tier,
|
|
48
|
+
uptime: Math.floor((Date.now() - startedAt) / 1000),
|
|
49
|
+
}),
|
|
50
|
+
signal: AbortSignal.timeout(10_000),
|
|
51
|
+
});
|
|
52
|
+
if (!res.ok)
|
|
53
|
+
return;
|
|
54
|
+
const data = (await res.json());
|
|
55
|
+
if (data.frozen && data.freeze) {
|
|
56
|
+
frozen = true;
|
|
57
|
+
onFreeze?.(data.freeze);
|
|
58
|
+
}
|
|
59
|
+
if (!data.valid) {
|
|
60
|
+
// Token revoked — downgrade to local
|
|
61
|
+
onDowngrade?.("local");
|
|
62
|
+
}
|
|
63
|
+
if (data.tier && data.tier !== tier) {
|
|
64
|
+
// Tier changed (upgrade or downgrade by admin)
|
|
65
|
+
onDowngrade?.(data.tier);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Best effort — swallow network errors
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async function revalidateToken(jwt) {
|
|
73
|
+
try {
|
|
74
|
+
const res = await fetch(`${REGISTRY_URL}/validate`, {
|
|
75
|
+
headers: { Authorization: `Bearer ${jwt}` },
|
|
76
|
+
signal: AbortSignal.timeout(10_000),
|
|
77
|
+
});
|
|
78
|
+
if (!res.ok)
|
|
79
|
+
return false;
|
|
80
|
+
const data = (await res.json());
|
|
81
|
+
return data.valid === true;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return true; // Assume valid if we can't reach registry (offline-first)
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export function startHeartbeat(jwt, tier, root) {
|
|
88
|
+
startedAt = Date.now();
|
|
89
|
+
// Retry bond if not yet confirmed
|
|
90
|
+
if (root) {
|
|
91
|
+
retryBondIfNeeded(root, jwt).catch(() => { });
|
|
92
|
+
}
|
|
93
|
+
// Immediate first heartbeat
|
|
94
|
+
sendHeartbeat(jwt, tier);
|
|
95
|
+
heartbeatTimer = setInterval(() => sendHeartbeat(jwt, tier), HEARTBEAT_INTERVAL_MS);
|
|
96
|
+
heartbeatTimer.unref();
|
|
97
|
+
revalidateTimer = setInterval(async () => {
|
|
98
|
+
const valid = await revalidateToken(jwt);
|
|
99
|
+
if (!valid)
|
|
100
|
+
onDowngrade?.("local");
|
|
101
|
+
}, REVALIDATE_INTERVAL_MS);
|
|
102
|
+
revalidateTimer.unref();
|
|
103
|
+
}
|
|
104
|
+
/** Retry bond announcement if keys exist locally but registry hasn't confirmed. */
|
|
105
|
+
async function retryBondIfNeeded(root, jwt) {
|
|
106
|
+
try {
|
|
107
|
+
const { loadBondKeys, bond } = await import("./bond.js");
|
|
108
|
+
const keys = await loadBondKeys(root);
|
|
109
|
+
if (!keys)
|
|
110
|
+
return; // No keys = not activated yet, nothing to retry
|
|
111
|
+
// Try to announce again — bond() handles the idempotency
|
|
112
|
+
const parts = jwt.split(".");
|
|
113
|
+
const payload = JSON.parse(Buffer.from(parts[1], "base64url").toString("utf-8"));
|
|
114
|
+
await bond(root, jwt, payload.jti);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Best effort
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
export function stopHeartbeat() {
|
|
121
|
+
if (heartbeatTimer)
|
|
122
|
+
clearInterval(heartbeatTimer);
|
|
123
|
+
if (revalidateTimer)
|
|
124
|
+
clearInterval(revalidateTimer);
|
|
125
|
+
heartbeatTimer = null;
|
|
126
|
+
revalidateTimer = null;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=heartbeat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src/tier/heartbeat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Activation token — Ed25519 signed JWT, offline-verifiable.
|
|
3
|
+
*
|
|
4
|
+
* Private key lives in the registry backend (Dash's dead drop / Cloudflare Worker).
|
|
5
|
+
* Public key ships in this package. Tokens validate without network.
|
|
6
|
+
* Revocation is checked periodically (24h) via registry heartbeat.
|
|
7
|
+
*/
|
|
8
|
+
import { type ActivationToken, type TierName } from "./types.js";
|
|
9
|
+
/** Sign a JWT with Ed25519 private key (used by Dash / registry backend) */
|
|
10
|
+
export declare function signToken(payload: ActivationToken, privateKeyPem: string): string;
|
|
11
|
+
/** Load and validate the local activation token. Returns null if none or invalid. */
|
|
12
|
+
export declare function loadActivationToken(root: string): Promise<{
|
|
13
|
+
token: ActivationToken;
|
|
14
|
+
raw: string;
|
|
15
|
+
} | null>;
|
|
16
|
+
/** Store an activation token to disk */
|
|
17
|
+
export declare function saveActivationToken(root: string, jwt: string): Promise<ActivationToken>;
|
|
18
|
+
/** Get the current tier from the stored token, defaulting to "local" */
|
|
19
|
+
export declare function currentTier(root: string): Promise<TierName>;
|
|
20
|
+
/** Set a custom public key (for testing or key rotation) */
|
|
21
|
+
export declare function setPublicKey(pem: string): void;
|
|
22
|
+
//# sourceMappingURL=token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/tier/token.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAsCjE,4EAA4E;AAC5E,wBAAgB,SAAS,CACvB,OAAO,EAAE,eAAe,EACxB,aAAa,EAAE,MAAM,GACpB,MAAM,CAUR;AAED,qFAAqF;AACrF,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,KAAK,EAAE,eAAe,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAqBzD;AAED,wCAAwC;AACxC,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,eAAe,CAAC,CAU1B;AAED,wEAAwE;AACxE,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAGjE;AAED,4DAA4D;AAC5D,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAG9C"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Activation token — Ed25519 signed JWT, offline-verifiable.
|
|
3
|
+
*
|
|
4
|
+
* Private key lives in the registry backend (Dash's dead drop / Cloudflare Worker).
|
|
5
|
+
* Public key ships in this package. Tokens validate without network.
|
|
6
|
+
* Revocation is checked periodically (24h) via registry heartbeat.
|
|
7
|
+
*/
|
|
8
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { createVerify, createSign } from "node:crypto";
|
|
11
|
+
// Ed25519 public key — embedded in package, used for offline token verification.
|
|
12
|
+
// Replace with real key after generating the keypair.
|
|
13
|
+
const PUBLIC_KEY_PEM = `-----BEGIN PUBLIC KEY-----
|
|
14
|
+
MCowBQYDK2VwAyEAPLACENTER_REAL_KEY_HERE_AFTER_KEYGEN=
|
|
15
|
+
-----END PUBLIC KEY-----`;
|
|
16
|
+
const TOKEN_DIR = ".core";
|
|
17
|
+
const TOKEN_FILE = "activation.json";
|
|
18
|
+
function tokenPath(root) {
|
|
19
|
+
return join(root, "brain", TOKEN_DIR, TOKEN_FILE);
|
|
20
|
+
}
|
|
21
|
+
/** Decode a compact JWT (header.payload.signature) without verification */
|
|
22
|
+
function decodePayload(jwt) {
|
|
23
|
+
const parts = jwt.split(".");
|
|
24
|
+
if (parts.length !== 3)
|
|
25
|
+
throw new Error("Invalid token format");
|
|
26
|
+
const payload = Buffer.from(parts[1], "base64url").toString("utf-8");
|
|
27
|
+
return JSON.parse(payload);
|
|
28
|
+
}
|
|
29
|
+
/** Verify Ed25519 signature on a JWT */
|
|
30
|
+
function verifySignature(jwt, publicKey) {
|
|
31
|
+
const parts = jwt.split(".");
|
|
32
|
+
if (parts.length !== 3)
|
|
33
|
+
return false;
|
|
34
|
+
const data = `${parts[0]}.${parts[1]}`;
|
|
35
|
+
const signature = Buffer.from(parts[2], "base64url");
|
|
36
|
+
const verifier = createVerify("Ed25519");
|
|
37
|
+
verifier.update(data);
|
|
38
|
+
try {
|
|
39
|
+
return verifier.verify(publicKey, signature);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** Sign a JWT with Ed25519 private key (used by Dash / registry backend) */
|
|
46
|
+
export function signToken(payload, privateKeyPem) {
|
|
47
|
+
const header = Buffer.from(JSON.stringify({ alg: "EdDSA", typ: "JWT" })).toString("base64url");
|
|
48
|
+
const body = Buffer.from(JSON.stringify(payload)).toString("base64url");
|
|
49
|
+
const data = `${header}.${body}`;
|
|
50
|
+
const signer = createSign("Ed25519");
|
|
51
|
+
signer.update(data);
|
|
52
|
+
const signature = signer.sign(privateKeyPem, "base64url");
|
|
53
|
+
return `${data}.${signature}`;
|
|
54
|
+
}
|
|
55
|
+
/** Load and validate the local activation token. Returns null if none or invalid. */
|
|
56
|
+
export async function loadActivationToken(root) {
|
|
57
|
+
try {
|
|
58
|
+
const raw = (await readFile(tokenPath(root), "utf-8")).trim();
|
|
59
|
+
if (!raw)
|
|
60
|
+
return null;
|
|
61
|
+
if (!verifySignature(raw, PUBLIC_KEY_PEM)) {
|
|
62
|
+
console.warn(" Activation token has invalid signature — ignoring.");
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
const token = decodePayload(raw);
|
|
66
|
+
if (new Date(token.expires) < new Date()) {
|
|
67
|
+
console.warn(" Activation token expired — running as Local tier.");
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
return { token, raw };
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** Store an activation token to disk */
|
|
77
|
+
export async function saveActivationToken(root, jwt) {
|
|
78
|
+
if (!verifySignature(jwt, PUBLIC_KEY_PEM)) {
|
|
79
|
+
throw new Error("Token signature verification failed. Token not saved.");
|
|
80
|
+
}
|
|
81
|
+
const token = decodePayload(jwt);
|
|
82
|
+
const dir = join(root, "brain", TOKEN_DIR);
|
|
83
|
+
await mkdir(dir, { recursive: true });
|
|
84
|
+
await writeFile(tokenPath(root), jwt, "utf-8");
|
|
85
|
+
return token;
|
|
86
|
+
}
|
|
87
|
+
/** Get the current tier from the stored token, defaulting to "local" */
|
|
88
|
+
export async function currentTier(root) {
|
|
89
|
+
const result = await loadActivationToken(root);
|
|
90
|
+
return result?.token.tier ?? "local";
|
|
91
|
+
}
|
|
92
|
+
/** Set a custom public key (for testing or key rotation) */
|
|
93
|
+
export function setPublicKey(pem) {
|
|
94
|
+
// Only used in test — production uses the embedded key
|
|
95
|
+
globalThis.__CORE_TIER_PUBKEY = pem;
|
|
96
|
+
}
|
|
97
|
+
function getPublicKey() {
|
|
98
|
+
return globalThis.__CORE_TIER_PUBKEY ?? PUBLIC_KEY_PEM;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/tier/token.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tier system — capability levels gated by trust.
|
|
3
|
+
*
|
|
4
|
+
* Level 1: Local — brain + Ollama, zero network
|
|
5
|
+
* Level 2: BYOK — full server/UI/mesh, your keys
|
|
6
|
+
* Level 3: Spawn — agent spawning + multi-agent orchestration
|
|
7
|
+
* Level 4: Hosted — runs on Herrman Group infrastructure
|
|
8
|
+
*/
|
|
9
|
+
export type TierName = "local" | "byok" | "spawn" | "hosted";
|
|
10
|
+
export declare const TIER_LEVEL: Record<TierName, number>;
|
|
11
|
+
export interface TierCapabilities {
|
|
12
|
+
brain: boolean;
|
|
13
|
+
memory: boolean;
|
|
14
|
+
ollama: boolean;
|
|
15
|
+
server: boolean;
|
|
16
|
+
ui: boolean;
|
|
17
|
+
mesh: boolean;
|
|
18
|
+
alerting: boolean;
|
|
19
|
+
spawning: boolean;
|
|
20
|
+
governance: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare const TIER_CAPS: Record<TierName, TierCapabilities>;
|
|
23
|
+
export interface ActivationToken {
|
|
24
|
+
/** Unique token ID — used for revocation checks */
|
|
25
|
+
jti: string;
|
|
26
|
+
tier: TierName;
|
|
27
|
+
org: string;
|
|
28
|
+
email: string;
|
|
29
|
+
issued: string;
|
|
30
|
+
expires: string;
|
|
31
|
+
}
|
|
32
|
+
export interface RegistrationRequest {
|
|
33
|
+
name: string;
|
|
34
|
+
email: string;
|
|
35
|
+
instanceId: string;
|
|
36
|
+
requestedAt: string;
|
|
37
|
+
}
|
|
38
|
+
export interface FreezeSignal {
|
|
39
|
+
jti: string;
|
|
40
|
+
reason: string;
|
|
41
|
+
issuedBy: string;
|
|
42
|
+
issuedAt: string;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tier/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE7D,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAK/C,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CA6CxD,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,QAAQ,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tier system — capability levels gated by trust.
|
|
3
|
+
*
|
|
4
|
+
* Level 1: Local — brain + Ollama, zero network
|
|
5
|
+
* Level 2: BYOK — full server/UI/mesh, your keys
|
|
6
|
+
* Level 3: Spawn — agent spawning + multi-agent orchestration
|
|
7
|
+
* Level 4: Hosted — runs on Herrman Group infrastructure
|
|
8
|
+
*/
|
|
9
|
+
export const TIER_LEVEL = {
|
|
10
|
+
local: 1,
|
|
11
|
+
byok: 2,
|
|
12
|
+
spawn: 3,
|
|
13
|
+
hosted: 4,
|
|
14
|
+
};
|
|
15
|
+
export const TIER_CAPS = {
|
|
16
|
+
local: {
|
|
17
|
+
brain: true,
|
|
18
|
+
memory: true,
|
|
19
|
+
ollama: true,
|
|
20
|
+
server: false,
|
|
21
|
+
ui: false,
|
|
22
|
+
mesh: false,
|
|
23
|
+
alerting: false,
|
|
24
|
+
spawning: false,
|
|
25
|
+
governance: false,
|
|
26
|
+
},
|
|
27
|
+
byok: {
|
|
28
|
+
brain: true,
|
|
29
|
+
memory: true,
|
|
30
|
+
ollama: true,
|
|
31
|
+
server: true,
|
|
32
|
+
ui: true,
|
|
33
|
+
mesh: true,
|
|
34
|
+
alerting: true,
|
|
35
|
+
spawning: false,
|
|
36
|
+
governance: false,
|
|
37
|
+
},
|
|
38
|
+
spawn: {
|
|
39
|
+
brain: true,
|
|
40
|
+
memory: true,
|
|
41
|
+
ollama: true,
|
|
42
|
+
server: true,
|
|
43
|
+
ui: true,
|
|
44
|
+
mesh: true,
|
|
45
|
+
alerting: true,
|
|
46
|
+
spawning: true,
|
|
47
|
+
governance: true,
|
|
48
|
+
},
|
|
49
|
+
hosted: {
|
|
50
|
+
brain: true,
|
|
51
|
+
memory: true,
|
|
52
|
+
ollama: true,
|
|
53
|
+
server: true,
|
|
54
|
+
ui: true,
|
|
55
|
+
mesh: true,
|
|
56
|
+
alerting: true,
|
|
57
|
+
spawning: true,
|
|
58
|
+
governance: true,
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tier/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,CAAC,MAAM,UAAU,GAA6B;IAClD,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;CACV,CAAC;AAcF,MAAM,CAAC,MAAM,SAAS,GAAuC;IAC3D,KAAK,EAAE;QACL,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,KAAK;QACb,EAAE,EAAE,KAAK;QACT,IAAI,EAAE,KAAK;QACX,QAAQ,EAAE,KAAK;QACf,QAAQ,EAAE,KAAK;QACf,UAAU,EAAE,KAAK;KAClB;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,IAAI;QACZ,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,IAAI;QACV,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,KAAK;QACf,UAAU,EAAE,KAAK;KAClB;IACD,KAAK,EAAE;QACL,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,IAAI;QACZ,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,IAAI;QACV,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,IAAI;KACjB;IACD,MAAM,EAAE;QACN,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,IAAI;QACZ,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,IAAI;QACV,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,IAAI;KACjB;CACF,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-updater — silent updates for non-UI changes, human approval for UI changes.
|
|
3
|
+
*
|
|
4
|
+
* Rule: if the human can't see it, feel it, or interact with it differently, ship it.
|
|
5
|
+
* Only gate on changes that affect the human's experience.
|
|
6
|
+
*
|
|
7
|
+
* Semver contract:
|
|
8
|
+
* patch (0.0.x) — silent. Bug fixes, security, scoring geometry.
|
|
9
|
+
* minor (0.x.0) — silent. New capabilities activate automatically.
|
|
10
|
+
* major (x.0.0) — ask. UI/nerve/contract changes. Human decides.
|
|
11
|
+
*/
|
|
12
|
+
interface VersionInfo {
|
|
13
|
+
current: string;
|
|
14
|
+
latest: string;
|
|
15
|
+
updateType: "patch" | "minor" | "major" | "none";
|
|
16
|
+
requiresApproval: boolean;
|
|
17
|
+
}
|
|
18
|
+
/** Check for updates and return version info. */
|
|
19
|
+
export declare function checkUpdate(): Promise<VersionInfo | null>;
|
|
20
|
+
/**
|
|
21
|
+
* Run the auto-update cycle. Called after server is running.
|
|
22
|
+
*
|
|
23
|
+
* - patch/minor: apply silently, restart
|
|
24
|
+
* - major: return info for nerve state to surface to human
|
|
25
|
+
*/
|
|
26
|
+
export declare function autoUpdate(): Promise<VersionInfo | null>;
|
|
27
|
+
/**
|
|
28
|
+
* Accept a pending major update. Called when human approves via UI.
|
|
29
|
+
*/
|
|
30
|
+
export declare function acceptMajorUpdate(): Promise<void>;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=updater.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../src/updater.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;IACjD,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AA2CD,iDAAiD;AACjD,wBAAsB,WAAW,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAc/D;AAuCD;;;;;GAKG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAqB9D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CASvD"}
|
package/dist/updater.js
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-updater — silent updates for non-UI changes, human approval for UI changes.
|
|
3
|
+
*
|
|
4
|
+
* Rule: if the human can't see it, feel it, or interact with it differently, ship it.
|
|
5
|
+
* Only gate on changes that affect the human's experience.
|
|
6
|
+
*
|
|
7
|
+
* Semver contract:
|
|
8
|
+
* patch (0.0.x) — silent. Bug fixes, security, scoring geometry.
|
|
9
|
+
* minor (0.x.0) — silent. New capabilities activate automatically.
|
|
10
|
+
* major (x.0.0) — ask. UI/nerve/contract changes. Human decides.
|
|
11
|
+
*/
|
|
12
|
+
import { exec, spawn } from "node:child_process";
|
|
13
|
+
import { readFile } from "node:fs/promises";
|
|
14
|
+
import { createLogger } from "./utils/logger.js";
|
|
15
|
+
const log = createLogger("updater");
|
|
16
|
+
const PKG_NAME = "@runcore-sh/runcore";
|
|
17
|
+
/** Parse semver into [major, minor, patch]. */
|
|
18
|
+
function parseSemver(v) {
|
|
19
|
+
const parts = v.replace(/^v/, "").split(".").map(Number);
|
|
20
|
+
return [parts[0] ?? 0, parts[1] ?? 0, parts[2] ?? 0];
|
|
21
|
+
}
|
|
22
|
+
/** Determine update type between two versions. */
|
|
23
|
+
function compareVersions(current, latest) {
|
|
24
|
+
const [cMaj, cMin, cPat] = parseSemver(current);
|
|
25
|
+
const [lMaj, lMin, lPat] = parseSemver(latest);
|
|
26
|
+
if (lMaj > cMaj)
|
|
27
|
+
return "major";
|
|
28
|
+
if (lMaj === cMaj && lMin > cMin)
|
|
29
|
+
return "minor";
|
|
30
|
+
if (lMaj === cMaj && lMin === cMin && lPat > cPat)
|
|
31
|
+
return "patch";
|
|
32
|
+
return "none";
|
|
33
|
+
}
|
|
34
|
+
/** Read current version from package.json. */
|
|
35
|
+
async function getCurrentVersion() {
|
|
36
|
+
try {
|
|
37
|
+
const pkg = JSON.parse(await readFile(new URL("../package.json", import.meta.url), "utf-8"));
|
|
38
|
+
return pkg.version ?? "0.0.0";
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return "0.0.0";
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Fetch latest version from npm registry. */
|
|
45
|
+
async function fetchLatestVersion() {
|
|
46
|
+
try {
|
|
47
|
+
const res = await fetch(`https://registry.npmjs.org/${PKG_NAME}/latest`, {
|
|
48
|
+
signal: AbortSignal.timeout(5000),
|
|
49
|
+
});
|
|
50
|
+
if (!res.ok)
|
|
51
|
+
return null;
|
|
52
|
+
const data = (await res.json());
|
|
53
|
+
return data.version ?? null;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/** Check for updates and return version info. */
|
|
60
|
+
export async function checkUpdate() {
|
|
61
|
+
const current = await getCurrentVersion();
|
|
62
|
+
const latest = await fetchLatestVersion();
|
|
63
|
+
if (!latest)
|
|
64
|
+
return null;
|
|
65
|
+
const updateType = compareVersions(current, latest);
|
|
66
|
+
if (updateType === "none")
|
|
67
|
+
return null;
|
|
68
|
+
return {
|
|
69
|
+
current,
|
|
70
|
+
latest,
|
|
71
|
+
updateType,
|
|
72
|
+
requiresApproval: updateType === "major",
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** Apply update — runs npm update, then restarts the process. */
|
|
76
|
+
function applyUpdate(latest) {
|
|
77
|
+
return new Promise((resolve, reject) => {
|
|
78
|
+
log.info(`Applying update to v${latest}...`);
|
|
79
|
+
// Detect if globally installed or local
|
|
80
|
+
const isGlobal = process.argv[1]?.includes("node_modules/.bin") === false;
|
|
81
|
+
const cmd = isGlobal
|
|
82
|
+
? `npm i -g ${PKG_NAME}@${latest}`
|
|
83
|
+
: `npm update ${PKG_NAME}`;
|
|
84
|
+
exec(cmd, { timeout: 120_000 }, (err) => {
|
|
85
|
+
if (err) {
|
|
86
|
+
log.warn(`Update failed: ${err.message}`);
|
|
87
|
+
reject(err);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
log.info(`Updated to v${latest}`);
|
|
91
|
+
resolve();
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
/** Restart the current process with the same arguments. */
|
|
96
|
+
function restart() {
|
|
97
|
+
const args = process.argv.slice(1);
|
|
98
|
+
log.info("Restarting...");
|
|
99
|
+
const child = spawn(process.execPath, args, {
|
|
100
|
+
stdio: "inherit",
|
|
101
|
+
detached: true,
|
|
102
|
+
});
|
|
103
|
+
child.unref();
|
|
104
|
+
process.exit(0);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Run the auto-update cycle. Called after server is running.
|
|
108
|
+
*
|
|
109
|
+
* - patch/minor: apply silently, restart
|
|
110
|
+
* - major: return info for nerve state to surface to human
|
|
111
|
+
*/
|
|
112
|
+
export async function autoUpdate() {
|
|
113
|
+
const info = await checkUpdate();
|
|
114
|
+
if (!info)
|
|
115
|
+
return null;
|
|
116
|
+
if (info.requiresApproval) {
|
|
117
|
+
// Major update — don't touch anything. Surface through nerve state.
|
|
118
|
+
log.info(`Major update available: v${info.current} → v${info.latest} (requires approval)`);
|
|
119
|
+
return info;
|
|
120
|
+
}
|
|
121
|
+
// Patch or minor — silent update
|
|
122
|
+
log.info(`Auto-updating: v${info.current} → v${info.latest} (${info.updateType})`);
|
|
123
|
+
try {
|
|
124
|
+
await applyUpdate(info.latest);
|
|
125
|
+
restart();
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// Update failed — not critical, try again next boot
|
|
129
|
+
log.warn("Auto-update failed, will retry next startup");
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Accept a pending major update. Called when human approves via UI.
|
|
135
|
+
*/
|
|
136
|
+
export async function acceptMajorUpdate() {
|
|
137
|
+
const info = await checkUpdate();
|
|
138
|
+
if (!info || info.updateType !== "major") {
|
|
139
|
+
log.info("No major update pending");
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
await applyUpdate(info.latest);
|
|
143
|
+
restart();
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=updater.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater.js","sourceRoot":"","sources":["../src/updater.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vault Policy Loader — classifies brain paths into access tiers.
|
|
3
|
+
*
|
|
4
|
+
* Reads brain/vault.policy.yaml and caches on first load.
|
|
5
|
+
* Tiers: open | community | secured. Default from `default_tier` field.
|
|
6
|
+
*
|
|
7
|
+
* Hand-rolled YAML parser (no external deps). Reuses pattern from
|
|
8
|
+
* sensitive-registry.ts.
|
|
9
|
+
*/
|
|
10
|
+
export type VaultTier = "open" | "community" | "secured";
|
|
11
|
+
export interface VaultPolicy {
|
|
12
|
+
owner: string;
|
|
13
|
+
tiers: {
|
|
14
|
+
open: string[];
|
|
15
|
+
community: string[];
|
|
16
|
+
secured: string[];
|
|
17
|
+
};
|
|
18
|
+
defaultTier: VaultTier;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Load and cache the vault policy. Returns cached on subsequent calls.
|
|
22
|
+
*/
|
|
23
|
+
export declare function loadVaultPolicy(): Promise<VaultPolicy>;
|
|
24
|
+
/**
|
|
25
|
+
* Synchronous load — for use where async is not available.
|
|
26
|
+
*/
|
|
27
|
+
export declare function loadVaultPolicySync(): VaultPolicy;
|
|
28
|
+
/**
|
|
29
|
+
* Get the cached policy (loads synchronously if not yet cached).
|
|
30
|
+
*/
|
|
31
|
+
export declare function getVaultPolicy(): VaultPolicy;
|
|
32
|
+
/**
|
|
33
|
+
* Classify a brain-relative path into a vault tier.
|
|
34
|
+
* Checks secured first (most restrictive), then open, then community.
|
|
35
|
+
* Falls back to default_tier if no pattern matches.
|
|
36
|
+
*/
|
|
37
|
+
export declare function classifyPath(relPath: string): VaultTier;
|
|
38
|
+
/**
|
|
39
|
+
* Force reload of vault policy (e.g. after policy file changes).
|
|
40
|
+
*/
|
|
41
|
+
export declare function reloadVaultPolicy(): Promise<VaultPolicy>;
|
|
42
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/vault/policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAeH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,WAAW,EAAE,SAAS,CAAC;CACxB;AA6ED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC,CAoB5D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,WAAW,CAajD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAG5C;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CASvD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC,CAG9D"}
|