@pylabmit/agent-cmdb 1.5.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/LICENSE +21 -0
- package/README.md +249 -0
- package/dist/agent-preflight.d.ts +6 -0
- package/dist/agent-preflight.d.ts.map +1 -0
- package/dist/agent-preflight.js +55 -0
- package/dist/agent-preflight.js.map +1 -0
- package/dist/brain.d.ts +12 -0
- package/dist/brain.d.ts.map +1 -0
- package/dist/brain.js +372 -0
- package/dist/brain.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +495 -0
- package/dist/cli.js.map +1 -0
- package/dist/digest.d.ts +14 -0
- package/dist/digest.d.ts.map +1 -0
- package/dist/digest.js +122 -0
- package/dist/digest.js.map +1 -0
- package/dist/doctor.d.ts +9 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +170 -0
- package/dist/doctor.js.map +1 -0
- package/dist/duration.d.ts +2 -0
- package/dist/duration.d.ts.map +1 -0
- package/dist/duration.js +15 -0
- package/dist/duration.js.map +1 -0
- package/dist/engine.d.ts +12 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +12 -0
- package/dist/engine.js.map +1 -0
- package/dist/freshness.d.ts +3 -0
- package/dist/freshness.d.ts.map +1 -0
- package/dist/freshness.js +19 -0
- package/dist/freshness.js.map +1 -0
- package/dist/graph-engine.d.ts +4 -0
- package/dist/graph-engine.d.ts.map +1 -0
- package/dist/graph-engine.js +36 -0
- package/dist/graph-engine.js.map +1 -0
- package/dist/interface.d.ts +34 -0
- package/dist/interface.d.ts.map +1 -0
- package/dist/interface.js +91 -0
- package/dist/interface.js.map +1 -0
- package/dist/loader.d.ts +9 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +199 -0
- package/dist/loader.js.map +1 -0
- package/dist/policy-engine.d.ts +7 -0
- package/dist/policy-engine.d.ts.map +1 -0
- package/dist/policy-engine.js +143 -0
- package/dist/policy-engine.js.map +1 -0
- package/dist/preflight-action.d.ts +3 -0
- package/dist/preflight-action.d.ts.map +1 -0
- package/dist/preflight-action.js +101 -0
- package/dist/preflight-action.js.map +1 -0
- package/dist/preflight.d.ts +4 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +36 -0
- package/dist/preflight.js.map +1 -0
- package/dist/route-resolver.d.ts +6 -0
- package/dist/route-resolver.d.ts.map +1 -0
- package/dist/route-resolver.js +130 -0
- package/dist/route-resolver.js.map +1 -0
- package/dist/store.d.ts +15 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +230 -0
- package/dist/store.js.map +1 -0
- package/dist/types.d.ts +277 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validator.d.ts +6 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +165 -0
- package/dist/validator.js.map +1 -0
- package/examples/basic/control-plane.yaml +122 -0
- package/examples/multi-agent/control-plane.yaml +352 -0
- package/package.json +79 -0
package/dist/doctor.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ControlPlane, DoctorReport } from './types.js';
|
|
2
|
+
export declare function runDoctor(options: {
|
|
3
|
+
controlPlane: ControlPlane;
|
|
4
|
+
storeDir: string;
|
|
5
|
+
brainDir?: string;
|
|
6
|
+
now?: string;
|
|
7
|
+
}): Promise<DoctorReport>;
|
|
8
|
+
export declare function formatDoctorReport(report: DoctorReport): string;
|
|
9
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI7D,wBAAsB,SAAS,CAAC,OAAO,EAAE;IACvC,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,YAAY,CAAC,CAsCxB;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAgB/D"}
|
package/dist/doctor.js
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { mkdir, readdir, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { join, relative, resolve } from 'node:path';
|
|
4
|
+
import { readBrainIndex } from './brain.js';
|
|
5
|
+
import { listChanges, listEvidence } from './store.js';
|
|
6
|
+
import { validateControlPlane } from './validator.js';
|
|
7
|
+
const staleThresholdMs = 604_800_000;
|
|
8
|
+
export async function runDoctor(options) {
|
|
9
|
+
const checkedAt = options.now ?? new Date().toISOString();
|
|
10
|
+
const nowMs = parseTimestamp(checkedAt);
|
|
11
|
+
const issues = validateControlPlane(options.controlPlane);
|
|
12
|
+
const errors = [];
|
|
13
|
+
const warnings = [];
|
|
14
|
+
const store = await inspectStore(options.storeDir, errors);
|
|
15
|
+
const brain = options.brainDir
|
|
16
|
+
? await inspectBrain(options.brainDir, nowMs, errors, warnings)
|
|
17
|
+
: {
|
|
18
|
+
configured: false,
|
|
19
|
+
indexReadable: false,
|
|
20
|
+
entityCount: 0,
|
|
21
|
+
staleEntityCount: 0,
|
|
22
|
+
orphanedFiles: []
|
|
23
|
+
};
|
|
24
|
+
const controlPlaneErrors = issues.filter((issue) => issue.severity === 'error').length;
|
|
25
|
+
const controlPlaneWarnings = issues.filter((issue) => issue.severity === 'warning').length;
|
|
26
|
+
if (controlPlaneErrors > 0) {
|
|
27
|
+
errors.push(`Control plane has ${controlPlaneErrors} validation error${controlPlaneErrors === 1 ? '' : 's'}.`);
|
|
28
|
+
}
|
|
29
|
+
if (controlPlaneWarnings > 0) {
|
|
30
|
+
warnings.push(`Control plane has ${controlPlaneWarnings} validation warning${controlPlaneWarnings === 1 ? '' : 's'}.`);
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
ok: errors.length === 0 && warnings.length === 0,
|
|
34
|
+
checkedAt,
|
|
35
|
+
errors,
|
|
36
|
+
warnings,
|
|
37
|
+
controlPlane: {
|
|
38
|
+
errors: controlPlaneErrors,
|
|
39
|
+
warnings: controlPlaneWarnings
|
|
40
|
+
},
|
|
41
|
+
store,
|
|
42
|
+
brain
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export function formatDoctorReport(report) {
|
|
46
|
+
const status = report.ok ? 'PASS' : 'ATTENTION';
|
|
47
|
+
return [
|
|
48
|
+
`Agent CMDB Doctor - ${status}`,
|
|
49
|
+
`Checked: ${report.checkedAt}`,
|
|
50
|
+
'',
|
|
51
|
+
`Control plane: ${report.controlPlane.errors} errors, ${report.controlPlane.warnings} warnings`,
|
|
52
|
+
`Store: writable=${report.store.writable}, evidence=${report.store.evidenceCount}, changes=${report.store.changesCount}`,
|
|
53
|
+
`Brain: configured=${report.brain.configured}, entities=${report.brain.entityCount}, stale=${report.brain.staleEntityCount}, orphaned=${report.brain.orphanedFiles.length}`,
|
|
54
|
+
'',
|
|
55
|
+
'Warnings:',
|
|
56
|
+
...(report.warnings.length > 0 ? report.warnings.map((warning) => `- ${warning}`) : ['- None']),
|
|
57
|
+
'',
|
|
58
|
+
'Errors:',
|
|
59
|
+
...(report.errors.length > 0 ? report.errors.map((error) => `- ${error}`) : ['- None'])
|
|
60
|
+
].join('\n');
|
|
61
|
+
}
|
|
62
|
+
async function inspectStore(storeDir, errors) {
|
|
63
|
+
const writable = await checkWritableDirectory(storeDir);
|
|
64
|
+
if (!writable) {
|
|
65
|
+
errors.push(`Store directory is not writable: ${storeDir}.`);
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
const evidence = await listEvidence(storeDir);
|
|
69
|
+
const changes = await listChanges(storeDir);
|
|
70
|
+
return {
|
|
71
|
+
writable,
|
|
72
|
+
evidenceCount: evidence.length,
|
|
73
|
+
changesCount: changes.length,
|
|
74
|
+
lastWriteAt: latestTimestamp([
|
|
75
|
+
...evidence.map((record) => record.capturedAt),
|
|
76
|
+
...changes.map((record) => record.changedAt)
|
|
77
|
+
])
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
errors.push(`Store health check failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
82
|
+
return {
|
|
83
|
+
writable,
|
|
84
|
+
evidenceCount: 0,
|
|
85
|
+
changesCount: 0
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function inspectBrain(brainDir, nowMs, errors, warnings) {
|
|
90
|
+
try {
|
|
91
|
+
const index = await readBrainIndex(brainDir);
|
|
92
|
+
const staleEntityCount = index.entities.filter((entity) => {
|
|
93
|
+
const lastUpdated = Date.parse(entity.lastUpdated);
|
|
94
|
+
return Number.isNaN(lastUpdated) || nowMs - lastUpdated > staleThresholdMs;
|
|
95
|
+
}).length;
|
|
96
|
+
const indexedFiles = new Set(index.entities.map((entity) => entity.filePath));
|
|
97
|
+
const orphanedFiles = (await listMarkdownFiles(join(brainDir, 'entities')))
|
|
98
|
+
.filter((filePath) => !indexedFiles.has(filePath))
|
|
99
|
+
.sort();
|
|
100
|
+
if (staleEntityCount > 0) {
|
|
101
|
+
warnings.push(`Brain has ${staleEntityCount} stale ${staleEntityCount === 1 ? 'entity' : 'entities'}.`);
|
|
102
|
+
}
|
|
103
|
+
if (orphanedFiles.length > 0) {
|
|
104
|
+
warnings.push(`Brain has ${orphanedFiles.length} orphaned markdown ${orphanedFiles.length === 1 ? 'file' : 'files'}.`);
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
configured: true,
|
|
108
|
+
indexReadable: true,
|
|
109
|
+
entityCount: index.entities.length,
|
|
110
|
+
staleEntityCount,
|
|
111
|
+
orphanedFiles
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
errors.push(`Brain health check failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
116
|
+
return {
|
|
117
|
+
configured: true,
|
|
118
|
+
indexReadable: false,
|
|
119
|
+
entityCount: 0,
|
|
120
|
+
staleEntityCount: 0,
|
|
121
|
+
orphanedFiles: []
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async function checkWritableDirectory(dir) {
|
|
126
|
+
const probePath = join(dir, `.doctor-${process.pid}-${randomUUID()}.tmp`);
|
|
127
|
+
try {
|
|
128
|
+
await mkdir(dir, { recursive: true });
|
|
129
|
+
await writeFile(probePath, 'ok', { encoding: 'utf8', flag: 'wx' });
|
|
130
|
+
await rm(probePath, { force: true });
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
await rm(probePath, { force: true }).catch(() => undefined);
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async function listMarkdownFiles(root) {
|
|
139
|
+
try {
|
|
140
|
+
const entries = await readdir(root, { withFileTypes: true });
|
|
141
|
+
const nested = await Promise.all(entries.map(async (entry) => {
|
|
142
|
+
const absolutePath = join(root, entry.name);
|
|
143
|
+
if (entry.isDirectory()) {
|
|
144
|
+
return listMarkdownFiles(absolutePath);
|
|
145
|
+
}
|
|
146
|
+
if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
147
|
+
return [relative(resolve(root, '..', '..'), absolutePath).replaceAll('\\', '/')];
|
|
148
|
+
}
|
|
149
|
+
return [];
|
|
150
|
+
}));
|
|
151
|
+
return nested.flat();
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {
|
|
155
|
+
return [];
|
|
156
|
+
}
|
|
157
|
+
throw error;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function latestTimestamp(values) {
|
|
161
|
+
return values.sort().at(-1);
|
|
162
|
+
}
|
|
163
|
+
function parseTimestamp(value) {
|
|
164
|
+
const timestamp = Date.parse(value);
|
|
165
|
+
if (Number.isNaN(timestamp)) {
|
|
166
|
+
throw new Error('Doctor now must be an ISO timestamp.');
|
|
167
|
+
}
|
|
168
|
+
return timestamp;
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duration.d.ts","sourceRoot":"","sources":["../src/duration.ts"],"names":[],"mappings":"AASA,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOjD"}
|
package/dist/duration.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const durationPattern = /^([1-9]\d*)([smhd])$/;
|
|
2
|
+
const unitMs = {
|
|
3
|
+
s: 1_000,
|
|
4
|
+
m: 60_000,
|
|
5
|
+
h: 3_600_000,
|
|
6
|
+
d: 86_400_000
|
|
7
|
+
};
|
|
8
|
+
export function parseDuration(ttl) {
|
|
9
|
+
const match = durationPattern.exec(ttl);
|
|
10
|
+
if (!match) {
|
|
11
|
+
throw new Error('Duration must be a positive integer followed by s, m, h, or d.');
|
|
12
|
+
}
|
|
13
|
+
return Number(match[1]) * unitMs[match[2]];
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=duration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duration.js","sourceRoot":"","sources":["../src/duration.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAE/C,MAAM,MAAM,GAA2B;IACrC,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,UAAU;CACd,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACpF,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC"}
|
package/dist/engine.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { ControlPlaneLoadError, defaultControlPlanePath, loadControlPlane, loadDefaultControlPlane, multiAgentExampleControlPlanePath } from './loader.js';
|
|
2
|
+
export { evaluatePolicy, policiesConflict, policyMatches, policyShadows } from './policy-engine.js';
|
|
3
|
+
export { ensureProfile, ensureSource, inspectProfile, resolveSourceRoute } from './route-resolver.js';
|
|
4
|
+
export { ensureGraphNode, resolveGraphNeighbors } from './graph-engine.js';
|
|
5
|
+
export { preflightAction } from './preflight-action.js';
|
|
6
|
+
export { generateReadinessReport, getObject, listObjects, validateControlPlane } from './validator.js';
|
|
7
|
+
export * from './brain.js';
|
|
8
|
+
export * from './digest.js';
|
|
9
|
+
export * from './doctor.js';
|
|
10
|
+
export * from './duration.js';
|
|
11
|
+
export * from './freshness.js';
|
|
12
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,gBAAgB,EAChB,uBAAuB,EACvB,iCAAiC,EAClC,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,aAAa,EACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,aAAa,EACb,YAAY,EACZ,cAAc,EACd,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,qBAAqB,EACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,uBAAuB,EACvB,SAAS,EACT,WAAW,EACX,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
|
package/dist/engine.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { ControlPlaneLoadError, defaultControlPlanePath, loadControlPlane, loadDefaultControlPlane, multiAgentExampleControlPlanePath } from './loader.js';
|
|
2
|
+
export { evaluatePolicy, policiesConflict, policyMatches, policyShadows } from './policy-engine.js';
|
|
3
|
+
export { ensureProfile, ensureSource, inspectProfile, resolveSourceRoute } from './route-resolver.js';
|
|
4
|
+
export { ensureGraphNode, resolveGraphNeighbors } from './graph-engine.js';
|
|
5
|
+
export { preflightAction } from './preflight-action.js';
|
|
6
|
+
export { generateReadinessReport, getObject, listObjects, validateControlPlane } from './validator.js';
|
|
7
|
+
export * from './brain.js';
|
|
8
|
+
export * from './digest.js';
|
|
9
|
+
export * from './doctor.js';
|
|
10
|
+
export * from './duration.js';
|
|
11
|
+
export * from './freshness.js';
|
|
12
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,gBAAgB,EAChB,uBAAuB,EACvB,iCAAiC,EAClC,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,aAAa,EACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,aAAa,EACb,YAAY,EACZ,cAAc,EACd,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,qBAAqB,EACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,uBAAuB,EACvB,SAAS,EACT,WAAW,EACX,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"freshness.d.ts","sourceRoot":"","sources":["../src/freshness.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAErE,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAgBjC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { readBrainIndex } from './brain.js';
|
|
2
|
+
export async function sourceFreshnessFromBrain(controlPlane, brainDir) {
|
|
3
|
+
const index = await readBrainIndex(brainDir);
|
|
4
|
+
return controlPlane.sources
|
|
5
|
+
.filter((source) => source.freshnessTtl)
|
|
6
|
+
.flatMap((source) => {
|
|
7
|
+
const entityId = source.brainEntityId ?? source.id;
|
|
8
|
+
const entity = index.entities.find((candidate) => candidate.id === entityId);
|
|
9
|
+
return entity
|
|
10
|
+
? [
|
|
11
|
+
{
|
|
12
|
+
sourceId: source.id,
|
|
13
|
+
lastUpdated: entity.lastUpdated
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
: [];
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=freshness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"freshness.js","sourceRoot":"","sources":["../src/freshness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,YAA0B,EAC1B,QAAgB;IAEhB,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC7C,OAAO,YAAY,CAAC,OAAO;SACxB,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;SACvC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QAClB,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;QAC7E,OAAO,MAAM;YACX,CAAC,CAAC;gBACE;oBACE,QAAQ,EAAE,MAAM,CAAC,EAAE;oBACnB,WAAW,EAAE,MAAM,CAAC,WAAW;iBAChC;aACF;YACH,CAAC,CAAC,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AgentProfile, CmdbObject, ControlPlane, GraphResult, PolicyRule, SourceRef } from './types.js';
|
|
2
|
+
export declare function resolveGraphNeighbors(controlPlane: ControlPlane, nodeId: string): GraphResult;
|
|
3
|
+
export declare function ensureGraphNode(controlPlane: ControlPlane, nodeId: string): CmdbObject | SourceRef | AgentProfile | PolicyRule;
|
|
4
|
+
//# sourceMappingURL=graph-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-engine.d.ts","sourceRoot":"","sources":["../src/graph-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE7G,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAc7F;AAED,wBAAgB,eAAe,CAAC,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU,CAc9H"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function resolveGraphNeighbors(controlPlane, nodeId) {
|
|
2
|
+
const normalizedNodeId = requireNonEmptyString(nodeId, 'Graph node id');
|
|
3
|
+
const node = ensureGraphNode(controlPlane, normalizedNodeId);
|
|
4
|
+
const neighbors = controlPlane.relationships
|
|
5
|
+
.filter((relationship) => relationship.from === normalizedNodeId || relationship.to === normalizedNodeId)
|
|
6
|
+
.map((relationship) => {
|
|
7
|
+
const otherId = relationship.from === normalizedNodeId ? relationship.to : relationship.from;
|
|
8
|
+
return {
|
|
9
|
+
relationship,
|
|
10
|
+
node: ensureGraphNode(controlPlane, otherId)
|
|
11
|
+
};
|
|
12
|
+
});
|
|
13
|
+
return { node, neighbors };
|
|
14
|
+
}
|
|
15
|
+
export function ensureGraphNode(controlPlane, nodeId) {
|
|
16
|
+
const object = controlPlane.objects.find((candidate) => candidate.id === nodeId);
|
|
17
|
+
if (object)
|
|
18
|
+
return object;
|
|
19
|
+
const source = controlPlane.sources.find((candidate) => candidate.id === nodeId || `source.${candidate.id}` === nodeId);
|
|
20
|
+
if (source)
|
|
21
|
+
return source;
|
|
22
|
+
const profile = controlPlane.profiles.find((candidate) => candidate.id === nodeId || `profile.${candidate.id}` === nodeId);
|
|
23
|
+
if (profile)
|
|
24
|
+
return profile;
|
|
25
|
+
const policy = controlPlane.policies.find((candidate) => candidate.id === nodeId || `policy.${candidate.id}` === nodeId);
|
|
26
|
+
if (policy)
|
|
27
|
+
return policy;
|
|
28
|
+
throw new Error(`Unknown graph node: ${nodeId}.`);
|
|
29
|
+
}
|
|
30
|
+
function requireNonEmptyString(value, label) {
|
|
31
|
+
if (typeof value !== 'string' || value.trim().length === 0) {
|
|
32
|
+
throw new Error(`${label} must be a non-empty string.`);
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=graph-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-engine.js","sourceRoot":"","sources":["../src/graph-engine.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,YAA0B,EAAE,MAAc;IAC9E,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,eAAe,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,YAAY,CAAC,aAAa;SACzC,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,KAAK,gBAAgB,IAAI,YAAY,CAAC,EAAE,KAAK,gBAAgB,CAAC;SACxG,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE;QACpB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;QAC7F,OAAO;YACL,YAAY;YACZ,IAAI,EAAE,eAAe,CAAC,YAAY,EAAE,OAAO,CAAC;SAC7C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,YAA0B,EAAE,MAAc;IACxE,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IACjF,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,MAAM,IAAI,UAAU,SAAS,CAAC,EAAE,EAAE,KAAK,MAAM,CAAC,CAAC;IACxH,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,MAAM,IAAI,WAAW,SAAS,CAAC,EAAE,EAAE,KAAK,MAAM,CAAC,CAAC;IAC3H,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,MAAM,IAAI,UAAU,SAAS,CAAC,EAAE,EAAE,KAAK,MAAM,CAAC,CAAC;IACzH,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,GAAG,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc,EAAE,KAAa;IAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,8BAA8B,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { AgentCmdbReport, BrainEntity, BrainEntityKind, BrainReadResult, BrainSearchQuery, BrainWriteInput, ChangeInput, ChangeQuery, ChangeRecord, ControlPlane, DigestResult, EvidenceInput, EvidenceQuery, EvidenceRecord, PreflightRequest, PreflightResult, ResolvedSourceRoute, SourceRouteRequest, ValidationIssue } from './types.js';
|
|
2
|
+
export interface AgentCmdbHealth {
|
|
3
|
+
ok: boolean;
|
|
4
|
+
errors: number;
|
|
5
|
+
warnings: number;
|
|
6
|
+
issues: ValidationIssue[];
|
|
7
|
+
}
|
|
8
|
+
export interface IAgentCMDB {
|
|
9
|
+
preflight(request: PreflightRequest): PreflightResult;
|
|
10
|
+
resolveRoute(request: SourceRouteRequest): ResolvedSourceRoute;
|
|
11
|
+
logEvidence(input: EvidenceInput): Promise<EvidenceRecord>;
|
|
12
|
+
listEvidence(query?: EvidenceQuery): Promise<EvidenceRecord[]>;
|
|
13
|
+
logChange(input: ChangeInput): Promise<ChangeRecord>;
|
|
14
|
+
listChanges(query?: ChangeQuery): Promise<ChangeRecord[]>;
|
|
15
|
+
validate(): ValidationIssue[];
|
|
16
|
+
report(): AgentCmdbReport;
|
|
17
|
+
health(): AgentCmdbHealth;
|
|
18
|
+
readEntity(entityId: string): Promise<BrainReadResult>;
|
|
19
|
+
writeEntity(input: BrainWriteInput): Promise<BrainEntity>;
|
|
20
|
+
createEntity(entity: Omit<BrainEntity, 'lastUpdated' | 'lastUpdatedBy'>, content: string, actor: string): Promise<BrainEntity>;
|
|
21
|
+
deleteEntity(entityId: string, actor: string, reason: string): Promise<void>;
|
|
22
|
+
searchEntities(query: BrainSearchQuery): Promise<BrainEntity[]>;
|
|
23
|
+
listEntities(kind?: BrainEntityKind): Promise<BrainEntity[]>;
|
|
24
|
+
generateDailyDigest(profile: string, date?: string): Promise<DigestResult>;
|
|
25
|
+
generateWeeklyDigest(profile: string, weekStart?: string): Promise<DigestResult>;
|
|
26
|
+
}
|
|
27
|
+
export interface AgentCmdbOptions {
|
|
28
|
+
configPath?: string;
|
|
29
|
+
controlPlane?: ControlPlane;
|
|
30
|
+
storeDir?: string;
|
|
31
|
+
brainDir?: string;
|
|
32
|
+
}
|
|
33
|
+
export declare function createAgentCmdb(options?: AgentCmdbOptions): IAgentCMDB;
|
|
34
|
+
//# sourceMappingURL=interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../src/interface.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,eAAe,CAAC;IACtD,YAAY,CAAC,OAAO,EAAE,kBAAkB,GAAG,mBAAmB,CAAC;IAC/D,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3D,YAAY,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC/D,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACrD,WAAW,CAAC,KAAK,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC1D,QAAQ,IAAI,eAAe,EAAE,CAAC;IAC9B,MAAM,IAAI,eAAe,CAAC;IAC1B,MAAM,IAAI,eAAe,CAAC;IAC1B,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACvD,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1D,YAAY,CACV,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,aAAa,GAAG,eAAe,CAAC,EAC1D,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,CAAC,CAAC;IACxB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,cAAc,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAChE,YAAY,CAAC,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7D,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3E,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAClF;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,UAAU,CAiF1E"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { createEntity, deleteEntity, initBrainDir, listEntities, readEntity, searchEntities, writeEntity } from './brain.js';
|
|
2
|
+
import { generateDailyDigest, generateWeeklyDigest } from './digest.js';
|
|
3
|
+
import { generateReadinessReport, validateControlPlane } from './validator.js';
|
|
4
|
+
import { loadDefaultControlPlane, loadControlPlane } from './loader.js';
|
|
5
|
+
import { preflightAction } from './preflight-action.js';
|
|
6
|
+
import { resolveSourceRoute } from './route-resolver.js';
|
|
7
|
+
import { appendChange, appendEvidence, listChanges, listEvidence } from './store.js';
|
|
8
|
+
export function createAgentCmdb(options = {}) {
|
|
9
|
+
const controlPlane = options.controlPlane ?? (options.configPath ? loadControlPlane(options.configPath) : loadDefaultControlPlane());
|
|
10
|
+
const storeDir = options.storeDir ?? process.env.AGENT_CMDB_STORE_DIR ?? 'agent-cmdb/state';
|
|
11
|
+
const brainDir = options.brainDir;
|
|
12
|
+
return {
|
|
13
|
+
preflight(request) {
|
|
14
|
+
return preflightAction(controlPlane, request);
|
|
15
|
+
},
|
|
16
|
+
resolveRoute(request) {
|
|
17
|
+
return resolveSourceRoute(controlPlane, request);
|
|
18
|
+
},
|
|
19
|
+
logEvidence(input) {
|
|
20
|
+
return appendEvidence(storeDir, input);
|
|
21
|
+
},
|
|
22
|
+
listEvidence(query = {}) {
|
|
23
|
+
return listEvidence(storeDir, query);
|
|
24
|
+
},
|
|
25
|
+
logChange(input) {
|
|
26
|
+
return appendChange(storeDir, input);
|
|
27
|
+
},
|
|
28
|
+
listChanges(query = {}) {
|
|
29
|
+
return listChanges(storeDir, query);
|
|
30
|
+
},
|
|
31
|
+
validate() {
|
|
32
|
+
return validateControlPlane(controlPlane);
|
|
33
|
+
},
|
|
34
|
+
report() {
|
|
35
|
+
return generateReadinessReport(controlPlane);
|
|
36
|
+
},
|
|
37
|
+
health() {
|
|
38
|
+
const issues = validateControlPlane(controlPlane);
|
|
39
|
+
const errors = issues.filter((issue) => issue.severity === 'error').length;
|
|
40
|
+
const warnings = issues.filter((issue) => issue.severity === 'warning').length;
|
|
41
|
+
return {
|
|
42
|
+
ok: errors === 0,
|
|
43
|
+
errors,
|
|
44
|
+
warnings,
|
|
45
|
+
issues
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
async readEntity(entityId) {
|
|
49
|
+
return readEntity(await requireBrainDir(brainDir), entityId);
|
|
50
|
+
},
|
|
51
|
+
async writeEntity(input) {
|
|
52
|
+
return writeEntity(await requireBrainDir(brainDir), storeDir, input);
|
|
53
|
+
},
|
|
54
|
+
async createEntity(entity, content, actor) {
|
|
55
|
+
return createEntity(await requireBrainDir(brainDir), storeDir, entity, content, actor);
|
|
56
|
+
},
|
|
57
|
+
async deleteEntity(entityId, actor, reason) {
|
|
58
|
+
return deleteEntity(await requireBrainDir(brainDir), storeDir, entityId, actor, reason);
|
|
59
|
+
},
|
|
60
|
+
async searchEntities(query) {
|
|
61
|
+
return searchEntities(await requireBrainDir(brainDir), query);
|
|
62
|
+
},
|
|
63
|
+
async listEntities(kind) {
|
|
64
|
+
return listEntities(await requireBrainDir(brainDir), kind);
|
|
65
|
+
},
|
|
66
|
+
async generateDailyDigest(profile, date) {
|
|
67
|
+
return generateDailyDigest({
|
|
68
|
+
profile,
|
|
69
|
+
date,
|
|
70
|
+
storeDir,
|
|
71
|
+
brainDir: await requireBrainDir(brainDir)
|
|
72
|
+
});
|
|
73
|
+
},
|
|
74
|
+
async generateWeeklyDigest(profile, weekStart) {
|
|
75
|
+
return generateWeeklyDigest({
|
|
76
|
+
profile,
|
|
77
|
+
weekStart,
|
|
78
|
+
storeDir,
|
|
79
|
+
brainDir: await requireBrainDir(brainDir)
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
async function requireBrainDir(brainDir) {
|
|
85
|
+
if (!brainDir) {
|
|
86
|
+
throw new Error('Brain not configured. Pass brainDir to createAgentCmdb.');
|
|
87
|
+
}
|
|
88
|
+
await initBrainDir(brainDir);
|
|
89
|
+
return brainDir;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=interface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../src/interface.ts"],"names":[],"mappings":"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"}
|
package/dist/loader.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ControlPlane } from './types.js';
|
|
2
|
+
export declare const defaultControlPlanePath: string;
|
|
3
|
+
export declare const multiAgentExampleControlPlanePath: string;
|
|
4
|
+
export declare class ControlPlaneLoadError extends Error {
|
|
5
|
+
constructor(message: string);
|
|
6
|
+
}
|
|
7
|
+
export declare function loadControlPlane(filePath: string): ControlPlane;
|
|
8
|
+
export declare function loadDefaultControlPlane(): ControlPlane;
|
|
9
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAGV,YAAY,EAKb,MAAM,YAAY,CAAC;AAIpB,eAAO,MAAM,uBAAuB,QAAsE,CAAC;AAC3G,eAAO,MAAM,iCAAiC,QAM7C,CAAC;AAEF,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAY/D;AAED,wBAAgB,uBAAuB,IAAI,YAAY,CAEtD"}
|