@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
package/dist/cli.js ADDED
@@ -0,0 +1,495 @@
1
+ #!/usr/bin/env node
2
+ import { existsSync } from 'node:fs';
3
+ import { mkdir, writeFile } from 'node:fs/promises';
4
+ import { join, resolve } from 'node:path';
5
+ import { createEntity, deleteEntity, initBrainDir, listEntities, readEntity, searchEntities } from './brain.js';
6
+ import { generateDailyDigest, generateWeeklyDigest } from './digest.js';
7
+ import { formatDoctorReport, runDoctor } from './doctor.js';
8
+ import { sourceFreshnessFromBrain } from './freshness.js';
9
+ import { evaluatePolicy, generateReadinessReport, inspectProfile, listObjects, loadControlPlane, loadDefaultControlPlane, preflightAction, resolveGraphNeighbors, resolveSourceRoute, validateControlPlane } from './engine.js';
10
+ import { appendChange, appendEvidence, listChanges, listEvidence } from './store.js';
11
+ async function main(argv) {
12
+ const parsed = parseArgs(argv);
13
+ if (parsed.command === 'init') {
14
+ await initProject(parsed.flags);
15
+ return;
16
+ }
17
+ if (parsed.command === 'brain') {
18
+ await handleBrainCommand(parsed.flags);
19
+ return;
20
+ }
21
+ if (parsed.command === 'digest') {
22
+ printJson(await generateDailyDigest({
23
+ profile: required(parsed.flags, 'profile'),
24
+ date: parsed.flags.date,
25
+ storeDir: storeDir(parsed.flags),
26
+ brainDir: brainDir(parsed.flags)
27
+ }));
28
+ return;
29
+ }
30
+ if (parsed.command === 'digest-weekly') {
31
+ printJson(await generateWeeklyDigest({
32
+ profile: required(parsed.flags, 'profile'),
33
+ weekStart: parsed.flags['week-start'],
34
+ storeDir: storeDir(parsed.flags),
35
+ brainDir: brainDir(parsed.flags)
36
+ }));
37
+ return;
38
+ }
39
+ const controlPlane = loadCliControlPlane(parsed.flags);
40
+ if (parsed.command === 'doctor') {
41
+ console.log(formatDoctorReport(await runDoctor({
42
+ controlPlane,
43
+ storeDir: storeDir(parsed.flags),
44
+ brainDir: brainDir(parsed.flags)
45
+ })));
46
+ return;
47
+ }
48
+ if (parsed.command === 'policy') {
49
+ const profile = required(parsed.flags, 'profile');
50
+ const action = required(parsed.flags, 'action');
51
+ const tool = parsed.flags.tool;
52
+ printJson(evaluatePolicy(controlPlane, { profile, action, tool }));
53
+ return;
54
+ }
55
+ if (parsed.command === 'route') {
56
+ const profile = required(parsed.flags, 'profile');
57
+ const intent = required(parsed.flags, 'intent');
58
+ printJson(resolveSourceRoute(controlPlane, {
59
+ profile,
60
+ intent,
61
+ freshness: await cliFreshness(controlPlane, parsed.flags)
62
+ }));
63
+ return;
64
+ }
65
+ if (parsed.command === 'inspect') {
66
+ const profile = required(parsed.flags, 'profile');
67
+ printJson(inspectProfile(controlPlane, profile));
68
+ return;
69
+ }
70
+ if (parsed.command === 'inventory') {
71
+ printJson(listObjects(controlPlane, {
72
+ profile: parsed.flags.profile,
73
+ kind: optionalObjectKind(parsed.flags.kind),
74
+ status: optionalObjectStatus(parsed.flags.status),
75
+ tag: parsed.flags.tag
76
+ }));
77
+ return;
78
+ }
79
+ if (parsed.command === 'sources') {
80
+ printJson(controlPlane.sources);
81
+ return;
82
+ }
83
+ if (parsed.command === 'preflight') {
84
+ const profile = required(parsed.flags, 'profile');
85
+ const action = required(parsed.flags, 'action');
86
+ const tool = parsed.flags.tool;
87
+ const intent = parsed.flags.intent;
88
+ printJson(preflightAction(controlPlane, {
89
+ profile,
90
+ action,
91
+ tool,
92
+ intent,
93
+ dryRun: booleanFlag(parsed.flags, 'dry-run'),
94
+ freshness: await cliFreshness(controlPlane, parsed.flags)
95
+ }));
96
+ return;
97
+ }
98
+ if (parsed.command === 'validate') {
99
+ printJson(validateControlPlane(controlPlane));
100
+ return;
101
+ }
102
+ if (parsed.command === 'graph') {
103
+ printJson(resolveGraphNeighbors(controlPlane, required(parsed.flags, 'id')));
104
+ return;
105
+ }
106
+ if (parsed.command === 'evidence-add') {
107
+ printJson(await appendEvidence(storeDir(parsed.flags), {
108
+ profile: required(parsed.flags, 'profile'),
109
+ source: required(parsed.flags, 'source'),
110
+ intent: required(parsed.flags, 'intent'),
111
+ summary: required(parsed.flags, 'summary'),
112
+ trust: optionalTrustLevel(parsed.flags.trust) ?? 'medium',
113
+ capturedAt: parsed.flags['captured-at'] ?? new Date().toISOString(),
114
+ links: parsed.flags.links ? parsed.flags.links.split(',').filter(Boolean) : undefined,
115
+ tags: parsed.flags.tags ? parsed.flags.tags.split(',').filter(Boolean) : undefined
116
+ }));
117
+ return;
118
+ }
119
+ if (parsed.command === 'evidence-list') {
120
+ printJson(await listEvidence(storeDir(parsed.flags), {
121
+ profile: parsed.flags.profile,
122
+ source: parsed.flags.source,
123
+ intent: parsed.flags.intent,
124
+ trust: optionalTrustLevel(parsed.flags.trust),
125
+ tag: parsed.flags.tag
126
+ }));
127
+ return;
128
+ }
129
+ if (parsed.command === 'change-add') {
130
+ printJson(await appendChange(storeDir(parsed.flags), {
131
+ target: required(parsed.flags, 'target'),
132
+ targetType: parseObjectKind(required(parsed.flags, 'target-type')),
133
+ action: parseChangeAction(required(parsed.flags, 'action')),
134
+ actor: parsed.flags.actor ?? 'codex',
135
+ reason: required(parsed.flags, 'reason'),
136
+ changedAt: parsed.flags['changed-at'] ?? new Date().toISOString()
137
+ }));
138
+ return;
139
+ }
140
+ if (parsed.command === 'change-list') {
141
+ printJson(await listChanges(storeDir(parsed.flags), {
142
+ target: parsed.flags.target,
143
+ targetType: optionalObjectKind(parsed.flags['target-type']),
144
+ actor: parsed.flags.actor,
145
+ action: optionalChangeAction(parsed.flags.action)
146
+ }));
147
+ return;
148
+ }
149
+ if (parsed.command === 'report') {
150
+ printJson(generateReadinessReport(controlPlane));
151
+ return;
152
+ }
153
+ }
154
+ function parseArgs(argv) {
155
+ const [command, ...rest] = argv;
156
+ const commands = [
157
+ 'policy',
158
+ 'init',
159
+ 'brain',
160
+ 'digest',
161
+ 'digest-weekly',
162
+ 'doctor',
163
+ 'route',
164
+ 'inspect',
165
+ 'inventory',
166
+ 'sources',
167
+ 'preflight',
168
+ 'validate',
169
+ 'graph',
170
+ 'evidence-add',
171
+ 'evidence-list',
172
+ 'change-add',
173
+ 'change-list',
174
+ 'report'
175
+ ];
176
+ if (!command || !commands.includes(command)) {
177
+ throw new Error('Usage: agent-cmdb <init|policy|route|inspect|inventory|sources|preflight|validate|graph|evidence-add|evidence-list|change-add|change-list|brain|digest|digest-weekly|doctor|report> [--key value]');
178
+ }
179
+ const flags = {};
180
+ let startIndex = 0;
181
+ if (command === 'brain') {
182
+ const subcommand = rest[0];
183
+ if (!subcommand || subcommand.startsWith('--')) {
184
+ throw new Error('Missing brain subcommand: list, read, search, create, delete.');
185
+ }
186
+ flags.subcommand = subcommand;
187
+ startIndex = 1;
188
+ }
189
+ const booleanFlags = new Set(['dry-run']);
190
+ for (let index = startIndex; index < rest.length;) {
191
+ const key = rest[index];
192
+ const value = rest[index + 1];
193
+ if (!key?.startsWith('--')) {
194
+ throw new Error(`Invalid argument near ${key ?? '<end>'}.`);
195
+ }
196
+ const flagName = key.slice(2);
197
+ if (booleanFlags.has(flagName) && (!value || value.startsWith('--'))) {
198
+ flags[flagName] = 'true';
199
+ index += 1;
200
+ continue;
201
+ }
202
+ if (!value || value.startsWith('--')) {
203
+ throw new Error(`Invalid argument near ${key ?? '<end>'}.`);
204
+ }
205
+ flags[flagName] = value;
206
+ index += 2;
207
+ }
208
+ return {
209
+ command: command,
210
+ flags
211
+ };
212
+ }
213
+ function required(flags, key) {
214
+ const value = flags[key];
215
+ if (!value) {
216
+ throw new Error(`Missing required --${key}.`);
217
+ }
218
+ return value;
219
+ }
220
+ function printJson(value) {
221
+ console.log(JSON.stringify(value, null, 2));
222
+ }
223
+ function storeDir(flags) {
224
+ return flags.store ?? flags['store-dir'] ?? join(process.cwd(), 'agent-cmdb', 'state');
225
+ }
226
+ function brainDir(flags) {
227
+ return flags['brain-dir'] ?? join(process.cwd(), 'agent-cmdb', 'brain');
228
+ }
229
+ function booleanFlag(flags, key) {
230
+ const value = flags[key];
231
+ if (value === undefined)
232
+ return false;
233
+ if (value === 'true')
234
+ return true;
235
+ if (value === 'false')
236
+ return false;
237
+ throw new Error(`Invalid boolean flag --${key}: ${value}. Valid values: true, false.`);
238
+ }
239
+ async function cliFreshness(controlPlane, flags) {
240
+ if (!controlPlane.sources.some((source) => source.freshnessTtl)) {
241
+ return undefined;
242
+ }
243
+ return sourceFreshnessFromBrain(controlPlane, brainDir(flags));
244
+ }
245
+ function loadCliControlPlane(flags) {
246
+ if (flags.config) {
247
+ return loadControlPlane(resolve(flags.config));
248
+ }
249
+ const localConfig = join(process.cwd(), 'agent-cmdb', 'config', 'control-plane.yaml');
250
+ if (existsSync(localConfig)) {
251
+ return loadControlPlane(localConfig);
252
+ }
253
+ return loadDefaultControlPlane();
254
+ }
255
+ async function initProject(flags) {
256
+ const root = resolve(flags.dir ?? process.cwd());
257
+ const configDir = join(root, 'agent-cmdb', 'config');
258
+ const stateDir = join(root, 'agent-cmdb', 'state');
259
+ await mkdir(configDir, { recursive: true });
260
+ await mkdir(stateDir, { recursive: true });
261
+ await writeFileIfMissing(join(configDir, 'control-plane.yaml'), initControlPlaneYaml);
262
+ await writeFileIfMissing(join(stateDir, 'evidence.jsonl'), '');
263
+ await writeFileIfMissing(join(stateDir, 'changes.jsonl'), '');
264
+ await initBrainDir(join(root, 'agent-cmdb', 'brain'));
265
+ await writeFileIfMissing(join(root, 'agent-cmdb.config.ts'), initTypescriptConfig);
266
+ console.log(`Initialized Agent CMDB in ${join(root, 'agent-cmdb')}`);
267
+ }
268
+ async function writeFileIfMissing(filePath, content) {
269
+ try {
270
+ await writeFile(filePath, content, { encoding: 'utf8', flag: 'wx' });
271
+ }
272
+ catch (error) {
273
+ if (error && typeof error === 'object' && 'code' in error && error.code === 'EEXIST')
274
+ return;
275
+ throw error;
276
+ }
277
+ }
278
+ async function handleBrainCommand(flags) {
279
+ const command = required(flags, 'subcommand');
280
+ const dir = brainDir(flags);
281
+ if (command === 'list') {
282
+ printJson(await listEntities(dir, optionalBrainKind(flags.kind)));
283
+ return;
284
+ }
285
+ if (command === 'read') {
286
+ const result = await readEntity(dir, required(flags, 'id'));
287
+ console.log(result.content);
288
+ return;
289
+ }
290
+ if (command === 'search') {
291
+ printJson(await searchEntities(dir, {
292
+ keyword: flags.keyword,
293
+ kind: optionalBrainKind(flags.kind),
294
+ tag: flags.tag,
295
+ updatedAfter: flags['updated-after'],
296
+ updatedBefore: flags['updated-before']
297
+ }));
298
+ return;
299
+ }
300
+ if (command === 'create') {
301
+ const kind = parseBrainKind(required(flags, 'kind'));
302
+ printJson(await createEntity(dir, storeDir(flags), {
303
+ id: required(flags, 'id'),
304
+ kind,
305
+ name: required(flags, 'name'),
306
+ filePath: flags['file-path'] ?? defaultBrainFilePath(kind, required(flags, 'id')),
307
+ tags: flags.tags ? flags.tags.split(',').filter(Boolean) : [],
308
+ trust: optionalTrustLevel(flags.trust) ?? 'medium',
309
+ summary: required(flags, 'summary')
310
+ }, required(flags, 'content'), flags.actor ?? 'codex'));
311
+ return;
312
+ }
313
+ if (command === 'delete') {
314
+ await deleteEntity(dir, storeDir(flags), required(flags, 'id'), flags.actor ?? 'codex', required(flags, 'reason'));
315
+ printJson({ deleted: required(flags, 'id') });
316
+ return;
317
+ }
318
+ throw new Error(`Unknown brain subcommand: ${command}.`);
319
+ }
320
+ function optionalObjectKind(value) {
321
+ return value ? parseObjectKind(value) : undefined;
322
+ }
323
+ function parseObjectKind(value) {
324
+ const values = ['profile', 'source', 'tool', 'job', 'memory', 'policy', 'workspace'];
325
+ if (!values.includes(value)) {
326
+ throw new Error(`Invalid object kind: ${value}. Valid values: ${values.join(', ')}.`);
327
+ }
328
+ return value;
329
+ }
330
+ function optionalBrainKind(value) {
331
+ return value ? parseBrainKind(value) : undefined;
332
+ }
333
+ function parseBrainKind(value) {
334
+ const aliases = {
335
+ people: 'person',
336
+ companies: 'company',
337
+ topics: 'topic',
338
+ tools: 'tool',
339
+ projects: 'project'
340
+ };
341
+ const normalized = aliases[value] ?? value;
342
+ if (!['person', 'company', 'topic', 'tool', 'project'].includes(normalized)) {
343
+ throw new Error('Invalid brain kind. Valid values: person, company, topic, tool, project, people, companies, topics, tools, projects.');
344
+ }
345
+ return normalized;
346
+ }
347
+ function defaultBrainFilePath(kind, id) {
348
+ const dirByKind = {
349
+ person: 'people',
350
+ company: 'companies',
351
+ topic: 'topics',
352
+ tool: 'tools',
353
+ project: 'projects'
354
+ };
355
+ return `entities/${dirByKind[kind]}/${id}.md`;
356
+ }
357
+ function optionalObjectStatus(value) {
358
+ return value ? parseObjectStatus(value) : undefined;
359
+ }
360
+ function parseObjectStatus(value) {
361
+ const values = ['active', 'paused', 'blocked', 'planned'];
362
+ if (!values.includes(value)) {
363
+ throw new Error(`Invalid object status: ${value}. Valid values: ${values.join(', ')}.`);
364
+ }
365
+ return value;
366
+ }
367
+ function optionalTrustLevel(value) {
368
+ if (!value)
369
+ return undefined;
370
+ const values = ['high', 'medium', 'low'];
371
+ if (!values.includes(value)) {
372
+ throw new Error(`Invalid trust level: ${value}. Valid values: ${values.join(', ')}.`);
373
+ }
374
+ return value;
375
+ }
376
+ function parseChangeAction(value) {
377
+ const values = ['create', 'update', 'pause', 'resume', 'delete', 'verify'];
378
+ if (!values.includes(value)) {
379
+ throw new Error(`Invalid change action: ${value}. Valid values: ${values.join(', ')}.`);
380
+ }
381
+ return value;
382
+ }
383
+ function optionalChangeAction(value) {
384
+ return value ? parseChangeAction(value) : undefined;
385
+ }
386
+ const initControlPlaneYaml = `version: "1.0"
387
+ updatedAt: "2026-05-25"
388
+
389
+ sources:
390
+ - id: serpapi
391
+ label: SerpAPI Web Search
392
+ kind: tool
393
+ readOnly: true
394
+
395
+ - id: local-docs
396
+ label: Local Documentation
397
+ kind: wiki
398
+ readOnly: true
399
+ freshnessTtl: 7d
400
+ brainEntityId: agent-security
401
+
402
+ profiles:
403
+ - id: research-agent
404
+ name: Research Agent
405
+ purpose: Web research and summarization
406
+ guardrails:
407
+ - Do not make purchases or financial transactions
408
+ - Do not post to social media
409
+ - Prefer local documentation before external search
410
+ routes:
411
+ - intent: web_research
412
+ sources:
413
+ - local-docs
414
+ - serpapi
415
+
416
+ policies:
417
+ - id: deny-social-posting
418
+ effect: deny
419
+ actions:
420
+ - social_post
421
+ - social_reply
422
+ - social_dm
423
+ reason: Social media posting is disabled for all agents
424
+ canEscalate: false
425
+ suggestedAlternative: Draft the post for a human to review.
426
+
427
+ - id: allow-research
428
+ effect: allow
429
+ profiles:
430
+ - research-agent
431
+ actions:
432
+ - web_search
433
+ - summarize
434
+ - extract
435
+ tools:
436
+ - serpapi
437
+ - local-docs
438
+ reason: Research agent can search and summarize read-only sources
439
+
440
+ objects:
441
+ - id: profile.research-agent
442
+ kind: profile
443
+ label: Research Agent
444
+ status: active
445
+ profile: research-agent
446
+ tags:
447
+ - agent
448
+ - research
449
+
450
+ - id: source.local-docs
451
+ kind: source
452
+ label: Local Documentation
453
+ status: active
454
+ profile: research-agent
455
+ tags:
456
+ - docs
457
+ - read-only
458
+
459
+ - id: source.serpapi
460
+ kind: source
461
+ label: SerpAPI Web Search
462
+ status: active
463
+ profile: research-agent
464
+ tags:
465
+ - web
466
+ - read-only
467
+
468
+ relationships:
469
+ - from: profile.research-agent
470
+ to: source.local-docs
471
+ type: uses
472
+
473
+ - from: profile.research-agent
474
+ to: source.serpapi
475
+ type: uses
476
+ `;
477
+ const initTypescriptConfig = `import type { AgentCmdbOptions } from '@pylabmit/agent-cmdb';
478
+
479
+ const config: AgentCmdbOptions = {
480
+ configPath: './agent-cmdb/config/control-plane.yaml',
481
+ storeDir: './agent-cmdb/state',
482
+ brainDir: './agent-cmdb/brain'
483
+ };
484
+
485
+ export default config;
486
+ `;
487
+ try {
488
+ await main(process.argv.slice(2));
489
+ }
490
+ catch (error) {
491
+ const message = error instanceof Error ? error.message : String(error);
492
+ console.error(message);
493
+ process.exitCode = 1;
494
+ }
495
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { DigestResult } from './types.js';
2
+ export declare function generateDailyDigest(options: {
3
+ profile: string;
4
+ date?: string;
5
+ storeDir: string;
6
+ brainDir: string;
7
+ }): Promise<DigestResult>;
8
+ export declare function generateWeeklyDigest(options: {
9
+ profile: string;
10
+ weekStart?: string;
11
+ storeDir: string;
12
+ brainDir: string;
13
+ }): Promise<DigestResult>;
14
+ //# sourceMappingURL=digest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../src/digest.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAgB,YAAY,EAAkB,MAAM,YAAY,CAAC;AAE7E,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,YAAY,CAAC,CA0BxB;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,YAAY,CAAC,CAqCxB"}
package/dist/digest.js ADDED
@@ -0,0 +1,122 @@
1
+ import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { initBrainDir, readBrainIndex } from './brain.js';
4
+ import { listChanges, listEvidence, sanitizeText } from './store.js';
5
+ export async function generateDailyDigest(options) {
6
+ const date = normalizeDigestDate(options.date ?? todayString(), 'date');
7
+ const profile = normalizeDigestProfile(options.profile);
8
+ await initBrainDir(options.brainDir);
9
+ const evidence = (await listEvidence(options.storeDir, { profile }))
10
+ .filter((record) => record.capturedAt.startsWith(date));
11
+ const changes = (await listChanges(options.storeDir))
12
+ .filter((record) => record.changedAt.startsWith(date));
13
+ const index = await readBrainIndex(options.brainDir);
14
+ const updatedEntities = index.entities.filter((entity) => entity.lastUpdated.startsWith(date));
15
+ const digestPath = join(options.brainDir, 'digest', 'daily', `${date}-${profile}.md`);
16
+ const summary = `${evidence.length} evidence, ${changes.length} changes, ${updatedEntities.length} brain updates.`;
17
+ const markdown = renderDailyDigest(profile, date, evidence, changes, updatedEntities, summary);
18
+ await mkdir(join(options.brainDir, 'digest', 'daily'), { recursive: true });
19
+ await writeFile(digestPath, markdown, 'utf8');
20
+ return {
21
+ profile,
22
+ date,
23
+ evidenceCount: evidence.length,
24
+ changesCount: changes.length,
25
+ entitiesUpdated: updatedEntities.map((entity) => entity.id),
26
+ digestPath,
27
+ summary
28
+ };
29
+ }
30
+ export async function generateWeeklyDigest(options) {
31
+ const weekStart = normalizeDigestDate(options.weekStart ?? todayString(), 'weekStart');
32
+ const profile = normalizeDigestProfile(options.profile);
33
+ await initBrainDir(options.brainDir);
34
+ const dailyDir = join(options.brainDir, 'digest', 'daily');
35
+ const weeklyDir = join(options.brainDir, 'digest', 'weekly');
36
+ await mkdir(weeklyDir, { recursive: true });
37
+ const dates = sevenDayWindow(weekStart);
38
+ const dateSet = new Set(dates);
39
+ const evidence = (await listEvidence(options.storeDir, { profile }))
40
+ .filter((record) => dateSet.has(record.capturedAt.slice(0, 10)));
41
+ const changes = (await listChanges(options.storeDir))
42
+ .filter((record) => dateSet.has(record.changedAt.slice(0, 10)));
43
+ const index = await readBrainIndex(options.brainDir);
44
+ const updatedEntities = index.entities.filter((entity) => dateSet.has(entity.lastUpdated.slice(0, 10)));
45
+ const dailyFiles = await listFilesIfExists(dailyDir);
46
+ const matchingFiles = dailyFiles
47
+ .filter((fileName) => dates.some((date) => fileName === `${date}-${profile}.md`))
48
+ .sort();
49
+ const sections = await Promise.all(matchingFiles.map(async (fileName) => `## ${fileName.replace(`-${profile}.md`, '')}\n\n${await readFile(join(dailyDir, fileName), 'utf8')}`));
50
+ const digestPath = join(weeklyDir, `${weekStart}-${profile}.md`);
51
+ const summary = `${evidence.length} evidence, ${changes.length} changes, ${updatedEntities.length} brain updates, ${matchingFiles.length} daily digests rolled up.`;
52
+ const markdown = `# Weekly digest: ${profile} - ${weekStart}\n\n${sections.join('\n\n') || 'No daily digests found.'}\n\n## Summary\n\n${summary}\n`;
53
+ await writeFile(digestPath, markdown, 'utf8');
54
+ return {
55
+ profile,
56
+ date: weekStart,
57
+ evidenceCount: evidence.length,
58
+ changesCount: changes.length,
59
+ entitiesUpdated: updatedEntities.map((entity) => entity.id),
60
+ digestPath,
61
+ summary
62
+ };
63
+ }
64
+ function renderDailyDigest(profile, date, evidence, changes, entities, summary) {
65
+ return `# Daily digest: ${profile} - ${date}
66
+
67
+ ## Evidence collected
68
+
69
+ ${evidence.map((record) => `- [${record.trust}] ${sanitizeText(record.summary)} (source: ${record.source})`).join('\n') || '- None'}
70
+
71
+ ## Changes recorded
72
+
73
+ ${changes.map((record) => `- ${record.action} ${record.target}: ${sanitizeText(record.reason)} (by ${record.actor})`).join('\n') || '- None'}
74
+
75
+ ## Brain entities updated
76
+
77
+ ${entities.map((entity) => `- ${entity.name} - updated by ${entity.lastUpdatedBy}`).join('\n') || '- None'}
78
+
79
+ ## Summary
80
+
81
+ ${summary}
82
+ `;
83
+ }
84
+ function sevenDayWindow(start) {
85
+ const startDate = new Date(`${start}T00:00:00.000Z`);
86
+ return Array.from({ length: 7 }, (_, index) => {
87
+ const date = new Date(startDate);
88
+ date.setUTCDate(startDate.getUTCDate() + index);
89
+ return date.toISOString().slice(0, 10);
90
+ });
91
+ }
92
+ function normalizeDigestDate(value, label) {
93
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(value)) {
94
+ throw new Error(`Digest ${label} must be YYYY-MM-DD.`);
95
+ }
96
+ const parsed = new Date(`${value}T00:00:00.000Z`);
97
+ if (Number.isNaN(parsed.getTime()) || parsed.toISOString().slice(0, 10) !== value) {
98
+ throw new Error(`Digest ${label} must be YYYY-MM-DD.`);
99
+ }
100
+ return value;
101
+ }
102
+ function normalizeDigestProfile(value) {
103
+ const profile = sanitizeText(value);
104
+ if (!/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(profile)) {
105
+ throw new Error('Digest profile must be a safe filename segment.');
106
+ }
107
+ return profile;
108
+ }
109
+ async function listFilesIfExists(dir) {
110
+ try {
111
+ return await readdir(dir);
112
+ }
113
+ catch (error) {
114
+ if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT')
115
+ return [];
116
+ throw error;
117
+ }
118
+ }
119
+ function todayString() {
120
+ return new Date().toISOString().slice(0, 10);
121
+ }
122
+ //# sourceMappingURL=digest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.js","sourceRoot":"","sources":["../src/digest.ts"],"names":[],"mappings":"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"}