centient 2.21.0 → 2.25.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/CHANGELOG.md +106 -0
- package/README.md +134 -21
- package/dist/cli.d.ts +38 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +816 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands.d.ts +18 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +341 -0
- package/dist/commands.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +86 -18
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +4 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +167 -96
- package/dist/server.js.map +1 -1
- package/dist/telemetry/tracer.d.ts.map +1 -1
- package/dist/telemetry/tracer.js +15 -1
- package/dist/telemetry/tracer.js.map +1 -1
- package/dist/tools/knowledge/promoteDecision.d.ts.map +1 -1
- package/dist/tools/knowledge/promoteDecision.js +7 -1
- package/dist/tools/knowledge/promoteDecision.js.map +1 -1
- package/dist/tools/knowledge/promoteLearning.d.ts.map +1 -1
- package/dist/tools/knowledge/promoteLearning.js +7 -1
- package/dist/tools/knowledge/promoteLearning.js.map +1 -1
- package/dist/tools/memory-bank/pushToMemoryBank.d.ts +9 -0
- package/dist/tools/memory-bank/pushToMemoryBank.d.ts.map +1 -0
- package/dist/tools/memory-bank/pushToMemoryBank.js +195 -0
- package/dist/tools/memory-bank/pushToMemoryBank.js.map +1 -0
- package/dist/tools/patterns/executeSkill.js +0 -41
- package/dist/tools/patterns/executeSkill.js.map +1 -1
- package/dist/tools/patterns/loadSkill.js +0 -17
- package/dist/tools/patterns/loadSkill.js.map +1 -1
- package/dist/tools/patterns/searchPatterns.js +0 -15
- package/dist/tools/patterns/searchPatterns.js.map +1 -1
- package/dist/tools/patterns/signPattern.js +0 -20
- package/dist/tools/patterns/signPattern.js.map +1 -1
- package/dist/utils/AuditLogger.d.ts +25 -18
- package/dist/utils/AuditLogger.d.ts.map +1 -1
- package/dist/utils/AuditLogger.js +261 -150
- package/dist/utils/AuditLogger.js.map +1 -1
- package/dist/utils/GeminiEmbeddingService.d.ts +25 -0
- package/dist/utils/GeminiEmbeddingService.d.ts.map +1 -0
- package/dist/utils/GeminiEmbeddingService.js +115 -0
- package/dist/utils/GeminiEmbeddingService.js.map +1 -0
- package/dist/utils/InstanceRegistry.d.ts +47 -0
- package/dist/utils/InstanceRegistry.d.ts.map +1 -0
- package/dist/utils/InstanceRegistry.js +195 -0
- package/dist/utils/InstanceRegistry.js.map +1 -0
- package/dist/utils/MetaKnowledgeEncryption.d.ts +21 -0
- package/dist/utils/MetaKnowledgeEncryption.d.ts.map +1 -0
- package/dist/utils/MetaKnowledgeEncryption.js +125 -0
- package/dist/utils/MetaKnowledgeEncryption.js.map +1 -0
- package/dist/utils/MetaKnowledgeManager.d.ts +18 -0
- package/dist/utils/MetaKnowledgeManager.d.ts.map +1 -1
- package/dist/utils/MetaKnowledgeManager.js +110 -6
- package/dist/utils/MetaKnowledgeManager.js.map +1 -1
- package/dist/utils/PatternIndexer.d.ts +1 -2
- package/dist/utils/PatternIndexer.d.ts.map +1 -1
- package/dist/utils/PatternIndexer.js +40 -72
- package/dist/utils/PatternIndexer.js.map +1 -1
- package/dist/utils/SessionCoordinator.d.ts +0 -1
- package/dist/utils/SessionCoordinator.d.ts.map +1 -1
- package/dist/utils/SessionCoordinator.js +3 -61
- package/dist/utils/SessionCoordinator.js.map +1 -1
- package/dist/utils/VertexSync.d.ts +12 -0
- package/dist/utils/VertexSync.d.ts.map +1 -0
- package/dist/utils/VertexSync.js +173 -0
- package/dist/utils/VertexSync.js.map +1 -0
- package/dist/utils/config.d.ts +60 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +246 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/rlvr/RewardHistoryStore.d.ts +0 -2
- package/dist/utils/rlvr/RewardHistoryStore.d.ts.map +1 -1
- package/dist/utils/rlvr/RewardHistoryStore.js +5 -18
- package/dist/utils/rlvr/RewardHistoryStore.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { GoogleGenAI } from "@google/genai";
|
|
2
|
+
import { embeddingCache, embeddingCacheKey, } from "./CacheManager.js";
|
|
3
|
+
import { withExternalSpan } from "../telemetry/index.js";
|
|
4
|
+
import { getCostTracker } from "./CostTracker.js";
|
|
5
|
+
import { ServiceCircuitBreakers } from "./CircuitBreaker.js";
|
|
6
|
+
import { ServiceRateLimiters } from "./RateLimiter.js";
|
|
7
|
+
const MODEL = "gemini-embedding-001";
|
|
8
|
+
const DIMENSIONS = 3072;
|
|
9
|
+
const MAX_INPUT_CHARS = 8000;
|
|
10
|
+
export class GeminiEmbeddingService {
|
|
11
|
+
client = null;
|
|
12
|
+
initialized = false;
|
|
13
|
+
constructor(config) {
|
|
14
|
+
const apiKey = config?.apiKey ?? process.env.GEMINI_API_KEY;
|
|
15
|
+
if (apiKey) {
|
|
16
|
+
this.client = new GoogleGenAI({ apiKey });
|
|
17
|
+
this.initialized = true;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
isInitialized() {
|
|
21
|
+
return this.initialized && this.client !== null;
|
|
22
|
+
}
|
|
23
|
+
async generateEmbedding(text, module) {
|
|
24
|
+
if (!this.client) {
|
|
25
|
+
throw new Error("GeminiEmbeddingService not initialized - missing GEMINI_API_KEY");
|
|
26
|
+
}
|
|
27
|
+
const truncatedText = text.slice(0, MAX_INPUT_CHARS);
|
|
28
|
+
const cacheKey = embeddingCacheKey(truncatedText, MODEL);
|
|
29
|
+
const cached = embeddingCache.get(cacheKey);
|
|
30
|
+
if (cached) {
|
|
31
|
+
console.error(` 📦 Embedding cache hit (${module})`);
|
|
32
|
+
return {
|
|
33
|
+
embedding: cached.embedding,
|
|
34
|
+
cached: true,
|
|
35
|
+
dimensions: cached.dimensions,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const rateLimiter = ServiceRateLimiters.gemini();
|
|
39
|
+
await rateLimiter.acquire(1);
|
|
40
|
+
const geminiBreaker = ServiceCircuitBreakers.gemini();
|
|
41
|
+
return geminiBreaker.execute(async () => {
|
|
42
|
+
return withExternalSpan("gemini", {
|
|
43
|
+
operation: "embedding",
|
|
44
|
+
model: MODEL,
|
|
45
|
+
}, async (span) => {
|
|
46
|
+
span.setAttribute("service.module", module);
|
|
47
|
+
const response = await this.client.models.embedContent({
|
|
48
|
+
model: MODEL,
|
|
49
|
+
contents: truncatedText,
|
|
50
|
+
config: {
|
|
51
|
+
outputDimensionality: DIMENSIONS,
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
const embedding = response.embeddings?.[0]?.values;
|
|
55
|
+
if (!embedding) {
|
|
56
|
+
throw new Error("No embedding returned from Gemini");
|
|
57
|
+
}
|
|
58
|
+
span.setAttribute("service.input_chars", truncatedText.length);
|
|
59
|
+
span.setAttribute("service.dimensions", embedding.length);
|
|
60
|
+
span.setAttribute("service.module", module);
|
|
61
|
+
const cacheEntry = {
|
|
62
|
+
embedding,
|
|
63
|
+
model: MODEL,
|
|
64
|
+
dimensions: embedding.length,
|
|
65
|
+
};
|
|
66
|
+
embeddingCache.set(cacheKey, cacheEntry);
|
|
67
|
+
console.error(` 💾 Embedding cached (${embedding.length} dims, ${module})`);
|
|
68
|
+
const inputTokens = Math.ceil(truncatedText.length / 4);
|
|
69
|
+
getCostTracker().recordCost({
|
|
70
|
+
service: "google",
|
|
71
|
+
operation: "embedding",
|
|
72
|
+
model: MODEL,
|
|
73
|
+
inputTokens,
|
|
74
|
+
outputTokens: 0,
|
|
75
|
+
cached: false,
|
|
76
|
+
duration: 0,
|
|
77
|
+
module,
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
embedding,
|
|
81
|
+
cached: false,
|
|
82
|
+
dimensions: embedding.length,
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
async generateEmbeddingOrNull(text, module) {
|
|
88
|
+
try {
|
|
89
|
+
const result = await this.generateEmbedding(text, module);
|
|
90
|
+
return result.embedding;
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
console.error(`❌ Failed to generate embedding (${module}): ${error.message}`);
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
getModelInfo() {
|
|
98
|
+
return {
|
|
99
|
+
model: MODEL,
|
|
100
|
+
dimensions: DIMENSIONS,
|
|
101
|
+
maxInputChars: MAX_INPUT_CHARS,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
let embeddingServiceInstance = null;
|
|
106
|
+
export function getEmbeddingService() {
|
|
107
|
+
if (!embeddingServiceInstance) {
|
|
108
|
+
embeddingServiceInstance = new GeminiEmbeddingService();
|
|
109
|
+
}
|
|
110
|
+
return embeddingServiceInstance;
|
|
111
|
+
}
|
|
112
|
+
export function resetEmbeddingService() {
|
|
113
|
+
embeddingServiceInstance = null;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=GeminiEmbeddingService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeminiEmbeddingService.js","sourceRoot":"","sources":["../../src/utils/GeminiEmbeddingService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export interface InstanceInfo {
|
|
2
|
+
pid: number;
|
|
3
|
+
projectPath: string;
|
|
4
|
+
projectName: string;
|
|
5
|
+
startTime: string;
|
|
6
|
+
version: string;
|
|
7
|
+
toolCount: number;
|
|
8
|
+
status: "starting" | "active" | "idle" | "stopping";
|
|
9
|
+
}
|
|
10
|
+
export interface InstanceHeartbeat extends InstanceInfo {
|
|
11
|
+
lastHeartbeat: string;
|
|
12
|
+
memoryUsageMB: number;
|
|
13
|
+
requestCount: number;
|
|
14
|
+
lastRequestTime: string | null;
|
|
15
|
+
uptime: number;
|
|
16
|
+
}
|
|
17
|
+
export declare class InstanceRegistry {
|
|
18
|
+
private pid;
|
|
19
|
+
private info;
|
|
20
|
+
private heartbeatInterval;
|
|
21
|
+
private requestCount;
|
|
22
|
+
private lastRequestTime;
|
|
23
|
+
constructor(options: {
|
|
24
|
+
projectPath: string;
|
|
25
|
+
version: string;
|
|
26
|
+
toolCount: number;
|
|
27
|
+
});
|
|
28
|
+
register(): void;
|
|
29
|
+
recordRequest(): void;
|
|
30
|
+
markIdle(): void;
|
|
31
|
+
deregister(): void;
|
|
32
|
+
private updateHeartbeat;
|
|
33
|
+
private writeInstanceFile;
|
|
34
|
+
getInfo(): InstanceHeartbeat;
|
|
35
|
+
}
|
|
36
|
+
export declare function listInstances(): InstanceHeartbeat[];
|
|
37
|
+
export declare function getInstance(pid: number): InstanceHeartbeat | null;
|
|
38
|
+
export declare function isHeartbeatStale(info: InstanceHeartbeat): boolean;
|
|
39
|
+
export declare function formatUptime(seconds: number): string;
|
|
40
|
+
export declare function getAggregatedStats(): {
|
|
41
|
+
totalInstances: number;
|
|
42
|
+
activeInstances: number;
|
|
43
|
+
idleInstances: number;
|
|
44
|
+
totalMemoryMB: number;
|
|
45
|
+
totalRequests: number;
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=InstanceRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InstanceRegistry.d.ts","sourceRoot":"","sources":["../../src/utils/InstanceRegistry.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;CACrD;AAKD,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB;AA4BD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,IAAI,CAAoB;IAChC,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,eAAe,CAAuB;gBAElC,OAAO,EAAE;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;KACnB;IAwBD,QAAQ,IAAI,IAAI;IAqBhB,aAAa,IAAI,IAAI;IAYrB,QAAQ,IAAI,IAAI;IAOhB,UAAU,IAAI,IAAI;IAmBlB,OAAO,CAAC,eAAe;IAuBvB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,IAAI,iBAAiB;CAG7B;AASD,wBAAgB,aAAa,IAAI,iBAAiB,EAAE,CA6BnD;AAKD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAyBjE;AAKD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAIjE;AAkBD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAgBpD;AAKD,wBAAgB,kBAAkB,IAAI;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB,CAUA"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync, unlinkSync, existsSync, readdirSync, readFileSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { homedir } from "os";
|
|
4
|
+
const REGISTRY_DIR = join(homedir(), ".centient", "instances");
|
|
5
|
+
function getInstancePath(pid) {
|
|
6
|
+
return join(REGISTRY_DIR, `${pid}.json`);
|
|
7
|
+
}
|
|
8
|
+
function ensureRegistryDir() {
|
|
9
|
+
if (!existsSync(REGISTRY_DIR)) {
|
|
10
|
+
mkdirSync(REGISTRY_DIR, { recursive: true });
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class InstanceRegistry {
|
|
14
|
+
pid;
|
|
15
|
+
info;
|
|
16
|
+
heartbeatInterval = null;
|
|
17
|
+
requestCount = 0;
|
|
18
|
+
lastRequestTime = null;
|
|
19
|
+
constructor(options) {
|
|
20
|
+
this.pid = process.pid;
|
|
21
|
+
const projectName = options.projectPath.split("/").pop() || "unknown";
|
|
22
|
+
this.info = {
|
|
23
|
+
pid: this.pid,
|
|
24
|
+
projectPath: options.projectPath,
|
|
25
|
+
projectName,
|
|
26
|
+
startTime: new Date().toISOString(),
|
|
27
|
+
version: options.version,
|
|
28
|
+
toolCount: options.toolCount,
|
|
29
|
+
status: "starting",
|
|
30
|
+
lastHeartbeat: new Date().toISOString(),
|
|
31
|
+
memoryUsageMB: 0,
|
|
32
|
+
requestCount: 0,
|
|
33
|
+
lastRequestTime: null,
|
|
34
|
+
uptime: 0,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
register() {
|
|
38
|
+
ensureRegistryDir();
|
|
39
|
+
this.updateHeartbeat();
|
|
40
|
+
this.info.status = "active";
|
|
41
|
+
this.writeInstanceFile();
|
|
42
|
+
this.heartbeatInterval = setInterval(() => {
|
|
43
|
+
this.updateHeartbeat();
|
|
44
|
+
this.writeInstanceFile();
|
|
45
|
+
}, 30000);
|
|
46
|
+
if (this.heartbeatInterval.unref) {
|
|
47
|
+
this.heartbeatInterval.unref();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
recordRequest() {
|
|
51
|
+
this.requestCount++;
|
|
52
|
+
this.lastRequestTime = new Date().toISOString();
|
|
53
|
+
this.info.status = "active";
|
|
54
|
+
this.info.requestCount = this.requestCount;
|
|
55
|
+
this.info.lastRequestTime = this.lastRequestTime;
|
|
56
|
+
}
|
|
57
|
+
markIdle() {
|
|
58
|
+
this.info.status = "idle";
|
|
59
|
+
}
|
|
60
|
+
deregister() {
|
|
61
|
+
if (this.heartbeatInterval) {
|
|
62
|
+
clearInterval(this.heartbeatInterval);
|
|
63
|
+
this.heartbeatInterval = null;
|
|
64
|
+
}
|
|
65
|
+
const instancePath = getInstancePath(this.pid);
|
|
66
|
+
try {
|
|
67
|
+
if (existsSync(instancePath)) {
|
|
68
|
+
unlinkSync(instancePath);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
updateHeartbeat() {
|
|
75
|
+
const memUsage = process.memoryUsage();
|
|
76
|
+
const startTime = new Date(this.info.startTime).getTime();
|
|
77
|
+
const now = Date.now();
|
|
78
|
+
this.info.lastHeartbeat = new Date().toISOString();
|
|
79
|
+
this.info.memoryUsageMB = Math.round(memUsage.heapUsed / 1024 / 1024);
|
|
80
|
+
this.info.requestCount = this.requestCount;
|
|
81
|
+
this.info.lastRequestTime = this.lastRequestTime;
|
|
82
|
+
this.info.uptime = Math.round((now - startTime) / 1000);
|
|
83
|
+
if (this.lastRequestTime) {
|
|
84
|
+
const lastReqTime = new Date(this.lastRequestTime).getTime();
|
|
85
|
+
if (now - lastReqTime > 5 * 60 * 1000) {
|
|
86
|
+
this.info.status = "idle";
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
writeInstanceFile() {
|
|
91
|
+
try {
|
|
92
|
+
const instancePath = getInstancePath(this.pid);
|
|
93
|
+
writeFileSync(instancePath, JSON.stringify(this.info, null, 2));
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
getInfo() {
|
|
99
|
+
return { ...this.info };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
export function listInstances() {
|
|
103
|
+
ensureRegistryDir();
|
|
104
|
+
const instances = [];
|
|
105
|
+
const files = readdirSync(REGISTRY_DIR).filter(f => f.endsWith(".json"));
|
|
106
|
+
for (const file of files) {
|
|
107
|
+
try {
|
|
108
|
+
const filePath = join(REGISTRY_DIR, file);
|
|
109
|
+
const content = readFileSync(filePath, "utf-8");
|
|
110
|
+
const info = JSON.parse(content);
|
|
111
|
+
if (isProcessAlive(info.pid)) {
|
|
112
|
+
instances.push(info);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
try {
|
|
116
|
+
unlinkSync(filePath);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return instances;
|
|
126
|
+
}
|
|
127
|
+
export function getInstance(pid) {
|
|
128
|
+
const instancePath = getInstancePath(pid);
|
|
129
|
+
if (!existsSync(instancePath)) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
133
|
+
const content = readFileSync(instancePath, "utf-8");
|
|
134
|
+
const info = JSON.parse(content);
|
|
135
|
+
if (isProcessAlive(info.pid)) {
|
|
136
|
+
return info;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
try {
|
|
140
|
+
unlinkSync(instancePath);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
}
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
export function isHeartbeatStale(info) {
|
|
152
|
+
const lastHeartbeat = new Date(info.lastHeartbeat).getTime();
|
|
153
|
+
const now = Date.now();
|
|
154
|
+
return now - lastHeartbeat > 2 * 60 * 1000;
|
|
155
|
+
}
|
|
156
|
+
function isProcessAlive(pid) {
|
|
157
|
+
try {
|
|
158
|
+
process.kill(pid, 0);
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
export function formatUptime(seconds) {
|
|
166
|
+
if (seconds < 60) {
|
|
167
|
+
return `${seconds}s`;
|
|
168
|
+
}
|
|
169
|
+
else if (seconds < 3600) {
|
|
170
|
+
const mins = Math.floor(seconds / 60);
|
|
171
|
+
const secs = seconds % 60;
|
|
172
|
+
return `${mins}m${secs}s`;
|
|
173
|
+
}
|
|
174
|
+
else if (seconds < 86400) {
|
|
175
|
+
const hours = Math.floor(seconds / 3600);
|
|
176
|
+
const mins = Math.floor((seconds % 3600) / 60);
|
|
177
|
+
return `${hours}h${mins}m`;
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
const days = Math.floor(seconds / 86400);
|
|
181
|
+
const hours = Math.floor((seconds % 86400) / 3600);
|
|
182
|
+
return `${days}d${hours}h`;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
export function getAggregatedStats() {
|
|
186
|
+
const instances = listInstances();
|
|
187
|
+
return {
|
|
188
|
+
totalInstances: instances.length,
|
|
189
|
+
activeInstances: instances.filter(i => i.status === "active").length,
|
|
190
|
+
idleInstances: instances.filter(i => i.status === "idle").length,
|
|
191
|
+
totalMemoryMB: instances.reduce((sum, i) => sum + i.memoryUsageMB, 0),
|
|
192
|
+
totalRequests: instances.reduce((sum, i) => sum + i.requestCount, 0),
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=InstanceRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InstanceRegistry.js","sourceRoot":"","sources":["../../src/utils/InstanceRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type MetaKnowledgeEncryptionConfig } from "./config.js";
|
|
2
|
+
export interface EncryptionResult {
|
|
3
|
+
encrypted: Buffer;
|
|
4
|
+
iv: Buffer;
|
|
5
|
+
authTag: Buffer;
|
|
6
|
+
}
|
|
7
|
+
export interface DecryptionResult {
|
|
8
|
+
decrypted: string;
|
|
9
|
+
wasEncrypted: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function getEncryptionKey(config?: MetaKnowledgeEncryptionConfig): Promise<Buffer>;
|
|
12
|
+
export declare function encrypt(plaintext: string, key: Buffer): EncryptionResult;
|
|
13
|
+
export declare function decrypt(encrypted: Buffer, key: Buffer, iv: Buffer, authTag: Buffer): string;
|
|
14
|
+
export declare function encryptToString(plaintext: string, key: Buffer): string;
|
|
15
|
+
export declare function decryptFromString(content: string, key: Buffer): DecryptionResult;
|
|
16
|
+
export declare function isEncrypted(content: string): boolean;
|
|
17
|
+
export declare function writeEncryptedFile(filePath: string, content: string, key: Buffer): Promise<void>;
|
|
18
|
+
export declare function readEncryptedFile(filePath: string, key: Buffer): Promise<DecryptionResult>;
|
|
19
|
+
export declare function generateKey(): string;
|
|
20
|
+
export declare function validateKeyFormat(keyHex: string): boolean;
|
|
21
|
+
//# sourceMappingURL=MetaKnowledgeEncryption.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetaKnowledgeEncryption.d.ts","sourceRoot":"","sources":["../../src/utils/MetaKnowledgeEncryption.ts"],"names":[],"mappings":"AAkBA,OAAO,EAEL,KAAK,6BAA6B,EACnC,MAAM,aAAa,CAAC;AAgBrB,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;CACvB;AASD,wBAAsB,gBAAgB,CACpC,MAAM,CAAC,EAAE,6BAA6B,GACrC,OAAO,CAAC,MAAM,CAAC,CAajB;AA0FD,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAYxE;AAKD,wBAAgB,OAAO,CACrB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,GACd,MAAM,CAUR;AASD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAWtE;AAKD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GACV,gBAAgB,CAqBlB;AAKD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEpD;AAKD,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAGf;AAKD,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,gBAAgB,CAAC,CAG3B;AAUD,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAKD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEzD"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import * as crypto from "crypto";
|
|
2
|
+
import * as fs from "fs/promises";
|
|
3
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
4
|
+
import * as path from "path";
|
|
5
|
+
import { homedir, hostname, userInfo } from "os";
|
|
6
|
+
import { getMetaKnowledgeConfig, } from "./config.js";
|
|
7
|
+
const ALGORITHM = "aes-256-gcm";
|
|
8
|
+
const KEY_LENGTH = 32;
|
|
9
|
+
const IV_LENGTH = 12;
|
|
10
|
+
const ENCRYPTED_HEADER = "CENTIENT_ENC_V1:";
|
|
11
|
+
export async function getEncryptionKey(config) {
|
|
12
|
+
const encConfig = config ?? getMetaKnowledgeConfig().encryption;
|
|
13
|
+
switch (encConfig.keySource) {
|
|
14
|
+
case "env":
|
|
15
|
+
return getKeyFromEnv();
|
|
16
|
+
case "file":
|
|
17
|
+
return await getKeyFromFile();
|
|
18
|
+
case "derived":
|
|
19
|
+
return deriveKeyFromMachine();
|
|
20
|
+
default:
|
|
21
|
+
throw new Error(`Unknown key source: ${encConfig.keySource}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function getKeyFromEnv() {
|
|
25
|
+
const keyHex = process.env.META_KNOWLEDGE_KEY;
|
|
26
|
+
if (!keyHex) {
|
|
27
|
+
throw new Error("META_KNOWLEDGE_KEY environment variable not set. " +
|
|
28
|
+
"Set it to a 64-character hex string (32 bytes).");
|
|
29
|
+
}
|
|
30
|
+
if (keyHex.length !== 64) {
|
|
31
|
+
throw new Error(`META_KNOWLEDGE_KEY must be 64 hex characters (32 bytes), got ${keyHex.length}`);
|
|
32
|
+
}
|
|
33
|
+
return Buffer.from(keyHex, "hex");
|
|
34
|
+
}
|
|
35
|
+
async function getKeyFromFile() {
|
|
36
|
+
const keyPath = path.join(homedir(), ".centient", "meta.key");
|
|
37
|
+
if (!existsSync(keyPath)) {
|
|
38
|
+
const newKey = crypto.randomBytes(KEY_LENGTH);
|
|
39
|
+
const keyDir = path.dirname(keyPath);
|
|
40
|
+
if (!existsSync(keyDir)) {
|
|
41
|
+
mkdirSync(keyDir, { recursive: true });
|
|
42
|
+
}
|
|
43
|
+
writeFileSync(keyPath, newKey.toString("hex"), { mode: 0o600 });
|
|
44
|
+
console.error(`[MetaKnowledgeEncryption] Generated new key at ${keyPath}`);
|
|
45
|
+
return newKey;
|
|
46
|
+
}
|
|
47
|
+
const keyHex = readFileSync(keyPath, "utf-8").trim();
|
|
48
|
+
if (keyHex.length !== 64) {
|
|
49
|
+
throw new Error(`Key file ${keyPath} must contain 64 hex characters (32 bytes), got ${keyHex.length}`);
|
|
50
|
+
}
|
|
51
|
+
return Buffer.from(keyHex, "hex");
|
|
52
|
+
}
|
|
53
|
+
function deriveKeyFromMachine() {
|
|
54
|
+
const user = userInfo();
|
|
55
|
+
const host = hostname();
|
|
56
|
+
const home = homedir();
|
|
57
|
+
const saltInput = `${host}:${user.username}`;
|
|
58
|
+
const salt = crypto.createHash("sha256").update(saltInput).digest();
|
|
59
|
+
const password = `${host}:${user.username}:${home}`;
|
|
60
|
+
const key = crypto.pbkdf2Sync(password, salt, 100000, KEY_LENGTH, "sha256");
|
|
61
|
+
return key;
|
|
62
|
+
}
|
|
63
|
+
export function encrypt(plaintext, key) {
|
|
64
|
+
const iv = crypto.randomBytes(IV_LENGTH);
|
|
65
|
+
const cipher = crypto.createCipheriv(ALGORITHM, key, iv);
|
|
66
|
+
const encrypted = Buffer.concat([
|
|
67
|
+
cipher.update(plaintext, "utf-8"),
|
|
68
|
+
cipher.final(),
|
|
69
|
+
]);
|
|
70
|
+
const authTag = cipher.getAuthTag();
|
|
71
|
+
return { encrypted, iv, authTag };
|
|
72
|
+
}
|
|
73
|
+
export function decrypt(encrypted, key, iv, authTag) {
|
|
74
|
+
const decipher = crypto.createDecipheriv(ALGORITHM, key, iv);
|
|
75
|
+
decipher.setAuthTag(authTag);
|
|
76
|
+
const decrypted = Buffer.concat([
|
|
77
|
+
decipher.update(encrypted),
|
|
78
|
+
decipher.final(),
|
|
79
|
+
]);
|
|
80
|
+
return decrypted.toString("utf-8");
|
|
81
|
+
}
|
|
82
|
+
export function encryptToString(plaintext, key) {
|
|
83
|
+
const { encrypted, iv, authTag } = encrypt(plaintext, key);
|
|
84
|
+
return (ENCRYPTED_HEADER +
|
|
85
|
+
iv.toString("hex") +
|
|
86
|
+
":" +
|
|
87
|
+
authTag.toString("hex") +
|
|
88
|
+
":" +
|
|
89
|
+
encrypted.toString("base64"));
|
|
90
|
+
}
|
|
91
|
+
export function decryptFromString(content, key) {
|
|
92
|
+
if (!content.startsWith(ENCRYPTED_HEADER)) {
|
|
93
|
+
return { decrypted: content, wasEncrypted: false };
|
|
94
|
+
}
|
|
95
|
+
const parts = content.slice(ENCRYPTED_HEADER.length).split(":");
|
|
96
|
+
if (parts.length !== 3) {
|
|
97
|
+
throw new Error("Invalid encrypted content format");
|
|
98
|
+
}
|
|
99
|
+
const ivHex = parts[0];
|
|
100
|
+
const authTagHex = parts[1];
|
|
101
|
+
const ciphertextBase64 = parts[2];
|
|
102
|
+
const iv = Buffer.from(ivHex, "hex");
|
|
103
|
+
const authTag = Buffer.from(authTagHex, "hex");
|
|
104
|
+
const encrypted = Buffer.from(ciphertextBase64, "base64");
|
|
105
|
+
const decrypted = decrypt(encrypted, key, iv, authTag);
|
|
106
|
+
return { decrypted, wasEncrypted: true };
|
|
107
|
+
}
|
|
108
|
+
export function isEncrypted(content) {
|
|
109
|
+
return content.startsWith(ENCRYPTED_HEADER);
|
|
110
|
+
}
|
|
111
|
+
export async function writeEncryptedFile(filePath, content, key) {
|
|
112
|
+
const encrypted = encryptToString(content, key);
|
|
113
|
+
await fs.writeFile(filePath, encrypted, "utf-8");
|
|
114
|
+
}
|
|
115
|
+
export async function readEncryptedFile(filePath, key) {
|
|
116
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
117
|
+
return decryptFromString(content, key);
|
|
118
|
+
}
|
|
119
|
+
export function generateKey() {
|
|
120
|
+
return crypto.randomBytes(KEY_LENGTH).toString("hex");
|
|
121
|
+
}
|
|
122
|
+
export function validateKeyFormat(keyHex) {
|
|
123
|
+
return /^[0-9a-fA-F]{64}$/.test(keyHex);
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=MetaKnowledgeEncryption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetaKnowledgeEncryption.js","sourceRoot":"","sources":["../../src/utils/MetaKnowledgeEncryption.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,10 +42,20 @@ export interface PromoteDecisionInput {
|
|
|
42
42
|
tags?: string[];
|
|
43
43
|
supersedes?: string;
|
|
44
44
|
}
|
|
45
|
+
export interface PurgeResult {
|
|
46
|
+
learningsPurged: number;
|
|
47
|
+
decisionsPurged: number;
|
|
48
|
+
archivedTo: string | null;
|
|
49
|
+
}
|
|
45
50
|
export declare class MetaKnowledgeManager {
|
|
46
51
|
private basePath;
|
|
47
52
|
private indexPath;
|
|
53
|
+
private config;
|
|
54
|
+
private encryptionKey;
|
|
48
55
|
constructor();
|
|
56
|
+
private getKey;
|
|
57
|
+
private writeFile;
|
|
58
|
+
private readFile;
|
|
49
59
|
ensureDirectories(): Promise<void>;
|
|
50
60
|
loadIndex(): Promise<MetaKnowledgeIndex>;
|
|
51
61
|
saveIndex(index: MetaKnowledgeIndex): Promise<void>;
|
|
@@ -56,8 +66,16 @@ export declare class MetaKnowledgeManager {
|
|
|
56
66
|
searchDecisions(query: string): Promise<MetaDecision[]>;
|
|
57
67
|
getAllLearnings(): Promise<MetaLearning[]>;
|
|
58
68
|
getAllDecisions(): Promise<MetaDecision[]>;
|
|
69
|
+
purgeOldItems(): Promise<PurgeResult>;
|
|
70
|
+
private archiveItems;
|
|
71
|
+
getPurgePreview(): Promise<{
|
|
72
|
+
learnings: MetaLearning[];
|
|
73
|
+
decisions: MetaDecision[];
|
|
74
|
+
cutoffDate: string;
|
|
75
|
+
}>;
|
|
59
76
|
private formatLearningMarkdown;
|
|
60
77
|
private formatDecisionMarkdown;
|
|
61
78
|
}
|
|
62
79
|
export declare function getMetaKnowledgeManager(): MetaKnowledgeManager;
|
|
80
|
+
export declare function resetMetaKnowledgeManager(): void;
|
|
63
81
|
//# sourceMappingURL=MetaKnowledgeManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MetaKnowledgeManager.d.ts","sourceRoot":"","sources":["../../src/utils/MetaKnowledgeManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MetaKnowledgeManager.d.ts","sourceRoot":"","sources":["../../src/utils/MetaKnowledgeManager.ts"],"names":[],"mappings":"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"}
|