@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.
Files changed (77) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +249 -0
  3. package/dist/agent-preflight.d.ts +6 -0
  4. package/dist/agent-preflight.d.ts.map +1 -0
  5. package/dist/agent-preflight.js +55 -0
  6. package/dist/agent-preflight.js.map +1 -0
  7. package/dist/brain.d.ts +12 -0
  8. package/dist/brain.d.ts.map +1 -0
  9. package/dist/brain.js +372 -0
  10. package/dist/brain.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +495 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/digest.d.ts +14 -0
  16. package/dist/digest.d.ts.map +1 -0
  17. package/dist/digest.js +122 -0
  18. package/dist/digest.js.map +1 -0
  19. package/dist/doctor.d.ts +9 -0
  20. package/dist/doctor.d.ts.map +1 -0
  21. package/dist/doctor.js +170 -0
  22. package/dist/doctor.js.map +1 -0
  23. package/dist/duration.d.ts +2 -0
  24. package/dist/duration.d.ts.map +1 -0
  25. package/dist/duration.js +15 -0
  26. package/dist/duration.js.map +1 -0
  27. package/dist/engine.d.ts +12 -0
  28. package/dist/engine.d.ts.map +1 -0
  29. package/dist/engine.js +12 -0
  30. package/dist/engine.js.map +1 -0
  31. package/dist/freshness.d.ts +3 -0
  32. package/dist/freshness.d.ts.map +1 -0
  33. package/dist/freshness.js +19 -0
  34. package/dist/freshness.js.map +1 -0
  35. package/dist/graph-engine.d.ts +4 -0
  36. package/dist/graph-engine.d.ts.map +1 -0
  37. package/dist/graph-engine.js +36 -0
  38. package/dist/graph-engine.js.map +1 -0
  39. package/dist/interface.d.ts +34 -0
  40. package/dist/interface.d.ts.map +1 -0
  41. package/dist/interface.js +91 -0
  42. package/dist/interface.js.map +1 -0
  43. package/dist/loader.d.ts +9 -0
  44. package/dist/loader.d.ts.map +1 -0
  45. package/dist/loader.js +199 -0
  46. package/dist/loader.js.map +1 -0
  47. package/dist/policy-engine.d.ts +7 -0
  48. package/dist/policy-engine.d.ts.map +1 -0
  49. package/dist/policy-engine.js +143 -0
  50. package/dist/policy-engine.js.map +1 -0
  51. package/dist/preflight-action.d.ts +3 -0
  52. package/dist/preflight-action.d.ts.map +1 -0
  53. package/dist/preflight-action.js +101 -0
  54. package/dist/preflight-action.js.map +1 -0
  55. package/dist/preflight.d.ts +4 -0
  56. package/dist/preflight.d.ts.map +1 -0
  57. package/dist/preflight.js +36 -0
  58. package/dist/preflight.js.map +1 -0
  59. package/dist/route-resolver.d.ts +6 -0
  60. package/dist/route-resolver.d.ts.map +1 -0
  61. package/dist/route-resolver.js +130 -0
  62. package/dist/route-resolver.js.map +1 -0
  63. package/dist/store.d.ts +15 -0
  64. package/dist/store.d.ts.map +1 -0
  65. package/dist/store.js +230 -0
  66. package/dist/store.js.map +1 -0
  67. package/dist/types.d.ts +277 -0
  68. package/dist/types.d.ts.map +1 -0
  69. package/dist/types.js +2 -0
  70. package/dist/types.js.map +1 -0
  71. package/dist/validator.d.ts +6 -0
  72. package/dist/validator.d.ts.map +1 -0
  73. package/dist/validator.js +165 -0
  74. package/dist/validator.js.map +1 -0
  75. package/examples/basic/control-plane.yaml +122 -0
  76. package/examples/multi-agent/control-plane.yaml +352 -0
  77. package/package.json +79 -0
@@ -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,2 @@
1
+ export declare function parseDuration(ttl: string): number;
2
+ //# sourceMappingURL=duration.d.ts.map
@@ -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"}
@@ -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"}
@@ -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,3 @@
1
+ import type { ControlPlane, SourceFreshnessInput } from './types.js';
2
+ export declare function sourceFreshnessFromBrain(controlPlane: ControlPlane, brainDir: string): Promise<SourceFreshnessInput[]>;
3
+ //# sourceMappingURL=freshness.d.ts.map
@@ -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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"}
@@ -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"}