@aiassesstech/fleet-bus 0.1.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/dist/audit-memory.d.ts +26 -0
- package/dist/audit-memory.d.ts.map +1 -0
- package/dist/audit-memory.js +75 -0
- package/dist/audit-memory.js.map +1 -0
- package/dist/audit.d.ts +93 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +187 -0
- package/dist/audit.js.map +1 -0
- package/dist/bus.d.ts +121 -0
- package/dist/bus.d.ts.map +1 -0
- package/dist/bus.js +259 -0
- package/dist/bus.js.map +1 -0
- package/dist/cards.d.ts +46 -0
- package/dist/cards.d.ts.map +1 -0
- package/dist/cards.js +120 -0
- package/dist/cards.js.map +1 -0
- package/dist/fleet-cards.d.ts +17 -0
- package/dist/fleet-cards.d.ts.map +1 -0
- package/dist/fleet-cards.js +132 -0
- package/dist/fleet-cards.js.map +1 -0
- package/dist/fleet-tools.d.ts +33 -0
- package/dist/fleet-tools.d.ts.map +1 -0
- package/dist/fleet-tools.js +418 -0
- package/dist/fleet-tools.js.map +1 -0
- package/dist/hooks.d.ts +13 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +134 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/receive.d.ts +36 -0
- package/dist/receive.d.ts.map +1 -0
- package/dist/receive.js +69 -0
- package/dist/receive.js.map +1 -0
- package/dist/routing.d.ts +34 -0
- package/dist/routing.d.ts.map +1 -0
- package/dist/routing.js +157 -0
- package/dist/routing.js.map +1 -0
- package/dist/send.d.ts +36 -0
- package/dist/send.d.ts.map +1 -0
- package/dist/send.js +88 -0
- package/dist/send.js.map +1 -0
- package/dist/transport.d.ts +53 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +104 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +259 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @aiassesstech/fleet-bus — MemoryWriter Audit Adapter
|
|
3
|
+
*
|
|
4
|
+
* Conditional adapter that writes audit events as memory files when
|
|
5
|
+
* the MemoryWriter from SPEC-FLEET-MEMORY-INFRASTRUCTURE is available.
|
|
6
|
+
*
|
|
7
|
+
* This is a single `if (memoryWriter)` branch — no refactoring required
|
|
8
|
+
* to swap from JSONL-only to JSONL+memory. The JSONL remains the
|
|
9
|
+
* canonical append-only log; memory files are a searchable projection.
|
|
10
|
+
*/
|
|
11
|
+
import type { AuditEvent } from './types.js';
|
|
12
|
+
export interface MemoryWriterLike {
|
|
13
|
+
write(agentId: string, subdir: string, filename: string, content: string): Promise<void> | void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Format an AuditEvent as a Markdown memory file with YAML frontmatter.
|
|
17
|
+
* This format is searchable via OpenClaw's `memory_search` tool.
|
|
18
|
+
*/
|
|
19
|
+
export declare function formatAuditAsMemoryFile(event: AuditEvent): string;
|
|
20
|
+
/**
|
|
21
|
+
* Write an audit event to memory if a MemoryWriter is available.
|
|
22
|
+
*
|
|
23
|
+
* Returns true if written, false if no writer was provided.
|
|
24
|
+
*/
|
|
25
|
+
export declare function writeAuditToMemory(event: AuditEvent, writer: MemoryWriterLike | null | undefined): Promise<boolean>;
|
|
26
|
+
//# sourceMappingURL=audit-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-memory.d.ts","sourceRoot":"","sources":["../src/audit-memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACjG;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CA6CjE;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,GAC1C,OAAO,CAAC,OAAO,CAAC,CAalB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @aiassesstech/fleet-bus — MemoryWriter Audit Adapter
|
|
3
|
+
*
|
|
4
|
+
* Conditional adapter that writes audit events as memory files when
|
|
5
|
+
* the MemoryWriter from SPEC-FLEET-MEMORY-INFRASTRUCTURE is available.
|
|
6
|
+
*
|
|
7
|
+
* This is a single `if (memoryWriter)` branch — no refactoring required
|
|
8
|
+
* to swap from JSONL-only to JSONL+memory. The JSONL remains the
|
|
9
|
+
* canonical append-only log; memory files are a searchable projection.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Format an AuditEvent as a Markdown memory file with YAML frontmatter.
|
|
13
|
+
* This format is searchable via OpenClaw's `memory_search` tool.
|
|
14
|
+
*/
|
|
15
|
+
export function formatAuditAsMemoryFile(event) {
|
|
16
|
+
const from = event.message?.from ?? event.agentId ?? 'fleet-bus';
|
|
17
|
+
const to = event.message?.to ?? 'unknown';
|
|
18
|
+
const method = event.message?.method ?? event.eventType;
|
|
19
|
+
const correlationId = event.message?.correlationId ?? 'none';
|
|
20
|
+
const riskLevel = event.outcome === 'rejected' || event.outcome === 'error'
|
|
21
|
+
? 'medium'
|
|
22
|
+
: 'low';
|
|
23
|
+
const lines = [
|
|
24
|
+
'---',
|
|
25
|
+
`tags: [fleet-comms, audit, ${method.replace('/', '-')}]`,
|
|
26
|
+
'agent: fleet-bus',
|
|
27
|
+
'type: audit-event',
|
|
28
|
+
`date: ${event.timestamp}`,
|
|
29
|
+
`source: ${from}`,
|
|
30
|
+
`target: ${to}`,
|
|
31
|
+
`method: ${method}`,
|
|
32
|
+
`outcome: ${event.outcome}`,
|
|
33
|
+
`risk: ${riskLevel}`,
|
|
34
|
+
'---',
|
|
35
|
+
'',
|
|
36
|
+
`# Fleet Communication Audit: ${method}`,
|
|
37
|
+
'',
|
|
38
|
+
`**From**: ${from} → **To**: ${to} `,
|
|
39
|
+
`**Method**: \`${method}\` `,
|
|
40
|
+
`**Correlation**: \`${correlationId}\` `,
|
|
41
|
+
`**Outcome**: ${capitalize(event.outcome)}${event.durationMs != null ? ` (${event.durationMs}ms)` : ''}`,
|
|
42
|
+
'',
|
|
43
|
+
];
|
|
44
|
+
if (event.routingDecision) {
|
|
45
|
+
lines.push(`**Routing**: ${event.routingDecision}`, '');
|
|
46
|
+
}
|
|
47
|
+
if (event.details) {
|
|
48
|
+
lines.push(event.details, '');
|
|
49
|
+
}
|
|
50
|
+
lines.push(`**Hash Chain**: \`prev:${event.previousHash.slice(0, 12)}... → this:${event.eventHash.slice(0, 12)}...\``);
|
|
51
|
+
return lines.join('\n');
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Write an audit event to memory if a MemoryWriter is available.
|
|
55
|
+
*
|
|
56
|
+
* Returns true if written, false if no writer was provided.
|
|
57
|
+
*/
|
|
58
|
+
export async function writeAuditToMemory(event, writer) {
|
|
59
|
+
if (!writer)
|
|
60
|
+
return false;
|
|
61
|
+
try {
|
|
62
|
+
const date = event.timestamp.slice(0, 10);
|
|
63
|
+
const filename = `${date}-${event.eventId}.md`;
|
|
64
|
+
const content = formatAuditAsMemoryFile(event);
|
|
65
|
+
await writer.write('fleet-bus', 'audit', filename, content);
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function capitalize(s) {
|
|
73
|
+
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=audit-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-memory.js","sourceRoot":"","sources":["../src/audit-memory.ts"],"names":[],"mappings":"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"}
|
package/dist/audit.d.ts
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @aiassesstech/fleet-bus — Audit Trail Writer
|
|
3
|
+
*
|
|
4
|
+
* Tamper-evident audit trail using SHA-256 hash chain + JSONL persistence.
|
|
5
|
+
* Each AuditEvent includes:
|
|
6
|
+
* - eventHash: SHA-256 of (previousHash + eventId + timestamp + eventType + outcome)
|
|
7
|
+
* - previousHash: the eventHash of the preceding event
|
|
8
|
+
*
|
|
9
|
+
* This creates an append-only chain where any retroactive modification
|
|
10
|
+
* breaks the hash sequence — visible to any verifier.
|
|
11
|
+
*
|
|
12
|
+
* Storage: one JSONL file per agent at {auditDir}/{agentId}.audit.jsonl
|
|
13
|
+
* Chain state: {auditDir}/{agentId}.chain.json (persists previousHash + eventCount)
|
|
14
|
+
*/
|
|
15
|
+
import type { AuditEvent, AuditEventType, FleetAgentId, FleetMessage } from './types.js';
|
|
16
|
+
export interface ChainState {
|
|
17
|
+
previousHash: string;
|
|
18
|
+
eventCount: number;
|
|
19
|
+
lastTimestamp?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface AuditWriterConfig {
|
|
22
|
+
agentId: FleetAgentId;
|
|
23
|
+
auditDir?: string;
|
|
24
|
+
logPrefix?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Compute the SHA-256 hash for an audit event.
|
|
28
|
+
*
|
|
29
|
+
* The hash covers the chain-critical fields: previous hash, event ID,
|
|
30
|
+
* timestamp, event type, and outcome. This ensures the chain is
|
|
31
|
+
* sensitive to any modification of these fields.
|
|
32
|
+
*/
|
|
33
|
+
export declare function computeEventHash(previousHash: string, eventId: string, timestamp: string, eventType: AuditEventType, outcome: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* Verify that a sequence of AuditEvents has a valid hash chain.
|
|
36
|
+
*
|
|
37
|
+
* Returns { valid: true } if the chain is intact, or
|
|
38
|
+
* { valid: false, brokenAt, reason } if a break is detected.
|
|
39
|
+
*/
|
|
40
|
+
export declare function verifyChain(events: AuditEvent[]): {
|
|
41
|
+
valid: true;
|
|
42
|
+
} | {
|
|
43
|
+
valid: false;
|
|
44
|
+
brokenAt: number;
|
|
45
|
+
reason: string;
|
|
46
|
+
};
|
|
47
|
+
export declare class AuditTrailWriter {
|
|
48
|
+
private readonly agentId;
|
|
49
|
+
private readonly auditDir;
|
|
50
|
+
private readonly logPrefix;
|
|
51
|
+
private chainState;
|
|
52
|
+
constructor(config: AuditWriterConfig);
|
|
53
|
+
/**
|
|
54
|
+
* Record an audit event. Computes the hash, appends to JSONL, persists chain state.
|
|
55
|
+
*/
|
|
56
|
+
record(params: {
|
|
57
|
+
eventId: string;
|
|
58
|
+
eventType: AuditEventType;
|
|
59
|
+
outcome: AuditEvent['outcome'];
|
|
60
|
+
message?: FleetMessage;
|
|
61
|
+
routingDecision?: string;
|
|
62
|
+
durationMs?: number;
|
|
63
|
+
agentId?: FleetAgentId;
|
|
64
|
+
details?: string;
|
|
65
|
+
}): AuditEvent;
|
|
66
|
+
/**
|
|
67
|
+
* Get current chain state (for diagnostics / health checks).
|
|
68
|
+
*/
|
|
69
|
+
getChainState(): Readonly<ChainState>;
|
|
70
|
+
/**
|
|
71
|
+
* Read all events from the JSONL file and verify chain integrity.
|
|
72
|
+
*/
|
|
73
|
+
readAndVerify(): {
|
|
74
|
+
events: AuditEvent[];
|
|
75
|
+
verification: ReturnType<typeof verifyChain>;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Read all events from the JSONL file.
|
|
79
|
+
*/
|
|
80
|
+
readAllEvents(): AuditEvent[];
|
|
81
|
+
/**
|
|
82
|
+
* Get the JSONL file path for this agent.
|
|
83
|
+
*/
|
|
84
|
+
jsonlPath(): string;
|
|
85
|
+
/**
|
|
86
|
+
* Get the chain state file path for this agent.
|
|
87
|
+
*/
|
|
88
|
+
chainStatePath(): string;
|
|
89
|
+
private appendToJSONL;
|
|
90
|
+
private loadChainState;
|
|
91
|
+
private saveChainState;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AASzF,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,MAAM,GACd,MAAM,CAGR;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,UAAU,EAAE,GACnB;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAoCtE;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,UAAU,CAAa;gBAEnB,MAAM,EAAE,iBAAiB;IAOrC;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,cAAc,CAAC;QAC1B,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;QAC/B,OAAO,CAAC,EAAE,YAAY,CAAC;QACvB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,YAAY,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,UAAU;IAsCd;;OAEG;IACH,aAAa,IAAI,QAAQ,CAAC,UAAU,CAAC;IAIrC;;OAEG;IACH,aAAa,IAAI;QACf,MAAM,EAAE,UAAU,EAAE,CAAC;QACrB,YAAY,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;KAC9C;IAMD;;OAEG;IACH,aAAa,IAAI,UAAU,EAAE;IAkB7B;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;OAEG;IACH,cAAc,IAAI,MAAM;IAQxB,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,cAAc;CAevB"}
|
package/dist/audit.js
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @aiassesstech/fleet-bus — Audit Trail Writer
|
|
3
|
+
*
|
|
4
|
+
* Tamper-evident audit trail using SHA-256 hash chain + JSONL persistence.
|
|
5
|
+
* Each AuditEvent includes:
|
|
6
|
+
* - eventHash: SHA-256 of (previousHash + eventId + timestamp + eventType + outcome)
|
|
7
|
+
* - previousHash: the eventHash of the preceding event
|
|
8
|
+
*
|
|
9
|
+
* This creates an append-only chain where any retroactive modification
|
|
10
|
+
* breaks the hash sequence — visible to any verifier.
|
|
11
|
+
*
|
|
12
|
+
* Storage: one JSONL file per agent at {auditDir}/{agentId}.audit.jsonl
|
|
13
|
+
* Chain state: {auditDir}/{agentId}.chain.json (persists previousHash + eventCount)
|
|
14
|
+
*/
|
|
15
|
+
import * as crypto from 'node:crypto';
|
|
16
|
+
import * as fs from 'node:fs';
|
|
17
|
+
import * as path from 'node:path';
|
|
18
|
+
const GENESIS_HASH = '0'.repeat(64);
|
|
19
|
+
const DEFAULT_AUDIT_DIR = path.join(process.env.HOME || '~', '.openclaw', 'workspace', 'fleet-bus', 'audit');
|
|
20
|
+
/**
|
|
21
|
+
* Compute the SHA-256 hash for an audit event.
|
|
22
|
+
*
|
|
23
|
+
* The hash covers the chain-critical fields: previous hash, event ID,
|
|
24
|
+
* timestamp, event type, and outcome. This ensures the chain is
|
|
25
|
+
* sensitive to any modification of these fields.
|
|
26
|
+
*/
|
|
27
|
+
export function computeEventHash(previousHash, eventId, timestamp, eventType, outcome) {
|
|
28
|
+
const payload = `${previousHash}|${eventId}|${timestamp}|${eventType}|${outcome}`;
|
|
29
|
+
return crypto.createHash('sha256').update(payload, 'utf-8').digest('hex');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Verify that a sequence of AuditEvents has a valid hash chain.
|
|
33
|
+
*
|
|
34
|
+
* Returns { valid: true } if the chain is intact, or
|
|
35
|
+
* { valid: false, brokenAt, reason } if a break is detected.
|
|
36
|
+
*/
|
|
37
|
+
export function verifyChain(events) {
|
|
38
|
+
if (events.length === 0)
|
|
39
|
+
return { valid: true };
|
|
40
|
+
for (let i = 0; i < events.length; i++) {
|
|
41
|
+
const event = events[i];
|
|
42
|
+
const expectedPreviousHash = i === 0
|
|
43
|
+
? GENESIS_HASH
|
|
44
|
+
: events[i - 1].eventHash;
|
|
45
|
+
if (event.previousHash !== expectedPreviousHash) {
|
|
46
|
+
return {
|
|
47
|
+
valid: false,
|
|
48
|
+
brokenAt: i,
|
|
49
|
+
reason: `previousHash mismatch at event ${i}: expected ${expectedPreviousHash.slice(0, 12)}..., got ${event.previousHash.slice(0, 12)}...`,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const recomputedHash = computeEventHash(event.previousHash, event.eventId, event.timestamp, event.eventType, event.outcome);
|
|
53
|
+
if (event.eventHash !== recomputedHash) {
|
|
54
|
+
return {
|
|
55
|
+
valid: false,
|
|
56
|
+
brokenAt: i,
|
|
57
|
+
reason: `eventHash mismatch at event ${i}: recomputed ${recomputedHash.slice(0, 12)}..., stored ${event.eventHash.slice(0, 12)}...`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return { valid: true };
|
|
62
|
+
}
|
|
63
|
+
export class AuditTrailWriter {
|
|
64
|
+
agentId;
|
|
65
|
+
auditDir;
|
|
66
|
+
logPrefix;
|
|
67
|
+
chainState;
|
|
68
|
+
constructor(config) {
|
|
69
|
+
this.agentId = config.agentId;
|
|
70
|
+
this.auditDir = config.auditDir ?? DEFAULT_AUDIT_DIR;
|
|
71
|
+
this.logPrefix = config.logPrefix ?? `[fleet-bus:audit:${config.agentId}]`;
|
|
72
|
+
this.chainState = this.loadChainState();
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Record an audit event. Computes the hash, appends to JSONL, persists chain state.
|
|
76
|
+
*/
|
|
77
|
+
record(params) {
|
|
78
|
+
const timestamp = new Date().toISOString();
|
|
79
|
+
const previousHash = this.chainState.previousHash;
|
|
80
|
+
const eventHash = computeEventHash(previousHash, params.eventId, timestamp, params.eventType, params.outcome);
|
|
81
|
+
const event = {
|
|
82
|
+
eventId: params.eventId,
|
|
83
|
+
timestamp,
|
|
84
|
+
previousHash,
|
|
85
|
+
eventHash,
|
|
86
|
+
eventType: params.eventType,
|
|
87
|
+
outcome: params.outcome,
|
|
88
|
+
message: params.message,
|
|
89
|
+
routingDecision: params.routingDecision,
|
|
90
|
+
durationMs: params.durationMs,
|
|
91
|
+
agentId: params.agentId ?? this.agentId,
|
|
92
|
+
details: params.details,
|
|
93
|
+
};
|
|
94
|
+
this.appendToJSONL(event);
|
|
95
|
+
this.chainState = {
|
|
96
|
+
previousHash: eventHash,
|
|
97
|
+
eventCount: this.chainState.eventCount + 1,
|
|
98
|
+
lastTimestamp: timestamp,
|
|
99
|
+
};
|
|
100
|
+
this.saveChainState();
|
|
101
|
+
return event;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get current chain state (for diagnostics / health checks).
|
|
105
|
+
*/
|
|
106
|
+
getChainState() {
|
|
107
|
+
return { ...this.chainState };
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Read all events from the JSONL file and verify chain integrity.
|
|
111
|
+
*/
|
|
112
|
+
readAndVerify() {
|
|
113
|
+
const events = this.readAllEvents();
|
|
114
|
+
const verification = verifyChain(events);
|
|
115
|
+
return { events, verification };
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Read all events from the JSONL file.
|
|
119
|
+
*/
|
|
120
|
+
readAllEvents() {
|
|
121
|
+
const filePath = this.jsonlPath();
|
|
122
|
+
if (!fs.existsSync(filePath))
|
|
123
|
+
return [];
|
|
124
|
+
try {
|
|
125
|
+
const content = fs.readFileSync(filePath, 'utf-8').trim();
|
|
126
|
+
if (!content)
|
|
127
|
+
return [];
|
|
128
|
+
return content
|
|
129
|
+
.split('\n')
|
|
130
|
+
.filter((line) => line.trim())
|
|
131
|
+
.map((line) => JSON.parse(line));
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
console.warn(`${this.logPrefix} failed to read audit JSONL`);
|
|
135
|
+
return [];
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Get the JSONL file path for this agent.
|
|
140
|
+
*/
|
|
141
|
+
jsonlPath() {
|
|
142
|
+
return path.join(this.auditDir, `${this.agentId}.audit.jsonl`);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get the chain state file path for this agent.
|
|
146
|
+
*/
|
|
147
|
+
chainStatePath() {
|
|
148
|
+
return path.join(this.auditDir, `${this.agentId}.chain.json`);
|
|
149
|
+
}
|
|
150
|
+
// ================================================================
|
|
151
|
+
// Private — Persistence
|
|
152
|
+
// ================================================================
|
|
153
|
+
appendToJSONL(event) {
|
|
154
|
+
try {
|
|
155
|
+
fs.mkdirSync(this.auditDir, { recursive: true });
|
|
156
|
+
const line = JSON.stringify(event) + '\n';
|
|
157
|
+
fs.appendFileSync(this.jsonlPath(), line, 'utf-8');
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
console.warn(`${this.logPrefix} failed to append audit event:`, err instanceof Error ? err.message : String(err));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
loadChainState() {
|
|
164
|
+
const statePath = this.chainStatePath();
|
|
165
|
+
try {
|
|
166
|
+
if (fs.existsSync(statePath)) {
|
|
167
|
+
const data = JSON.parse(fs.readFileSync(statePath, 'utf-8'));
|
|
168
|
+
console.log(`${this.logPrefix} resumed chain — ${data.eventCount} events, last hash ${data.previousHash.slice(0, 12)}...`);
|
|
169
|
+
return data;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
console.warn(`${this.logPrefix} chain state corrupted — starting fresh chain`);
|
|
174
|
+
}
|
|
175
|
+
return { previousHash: GENESIS_HASH, eventCount: 0 };
|
|
176
|
+
}
|
|
177
|
+
saveChainState() {
|
|
178
|
+
try {
|
|
179
|
+
fs.mkdirSync(this.auditDir, { recursive: true });
|
|
180
|
+
fs.writeFileSync(this.chainStatePath(), JSON.stringify(this.chainState, null, 2), 'utf-8');
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
console.warn(`${this.logPrefix} failed to save chain state:`, err instanceof Error ? err.message : String(err));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
|
package/dist/bus.d.ts
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @aiassesstech/fleet-bus — FleetBus Core
|
|
3
|
+
*
|
|
4
|
+
* Central class for fleet communication infrastructure.
|
|
5
|
+
* Phase 0a: hook registration, in-memory event ring buffer, Agent Card
|
|
6
|
+
* registry, routing rule validation.
|
|
7
|
+
* Phase 0b: SHA-256 hash chain audit trail with JSONL persistence.
|
|
8
|
+
*
|
|
9
|
+
* Designed for graceful degradation — if this fails to load, every agent
|
|
10
|
+
* continues to function exactly as before.
|
|
11
|
+
*/
|
|
12
|
+
import { AuditTrailWriter } from './audit.js';
|
|
13
|
+
import { type MemoryWriterLike } from './audit-memory.js';
|
|
14
|
+
import { AgentCardRegistry } from './cards.js';
|
|
15
|
+
import type { AuditEvent, AuditEventType, FleetBusConfig, FleetEvent, FleetMessage, OpenClawPluginApi, RoutingDecision } from './types.js';
|
|
16
|
+
export type ReceiveHandler = (raw: string) => void | Promise<void>;
|
|
17
|
+
export declare class FleetBus {
|
|
18
|
+
private readonly config;
|
|
19
|
+
private readonly cardRegistry;
|
|
20
|
+
private readonly auditWriter;
|
|
21
|
+
private memoryWriter;
|
|
22
|
+
private readonly eventHistory;
|
|
23
|
+
private readonly receiveHandlers;
|
|
24
|
+
private readonly maxHistory;
|
|
25
|
+
private readonly logPrefix;
|
|
26
|
+
private running;
|
|
27
|
+
private constructor();
|
|
28
|
+
/**
|
|
29
|
+
* Create and initialize a FleetBus instance.
|
|
30
|
+
*
|
|
31
|
+
* Registers hooks via the OpenClaw plugin API and loads existing Agent Cards.
|
|
32
|
+
* Designed to be called inside a try/catch in each plugin's register() function.
|
|
33
|
+
*/
|
|
34
|
+
static create(api: OpenClawPluginApi, config: FleetBusConfig): FleetBus;
|
|
35
|
+
/**
|
|
36
|
+
* Start the fleet bus. Logs initialization and records a startup event.
|
|
37
|
+
*/
|
|
38
|
+
start(): void;
|
|
39
|
+
/**
|
|
40
|
+
* Stop the fleet bus.
|
|
41
|
+
*/
|
|
42
|
+
stop(): void;
|
|
43
|
+
/**
|
|
44
|
+
* Check if the bus is running.
|
|
45
|
+
*/
|
|
46
|
+
isRunning(): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Record an event into the in-memory ring buffer.
|
|
49
|
+
*/
|
|
50
|
+
recordEvent(event: FleetEvent): void;
|
|
51
|
+
/**
|
|
52
|
+
* Get recent events, optionally filtered.
|
|
53
|
+
*/
|
|
54
|
+
recentEvents(options?: {
|
|
55
|
+
type?: FleetEvent['type'];
|
|
56
|
+
limit?: number;
|
|
57
|
+
}): FleetEvent[];
|
|
58
|
+
/**
|
|
59
|
+
* Total events recorded (including those rotated out of the ring buffer).
|
|
60
|
+
*/
|
|
61
|
+
eventCount(): number;
|
|
62
|
+
/**
|
|
63
|
+
* Validate a message against routing rules.
|
|
64
|
+
* Logs violations and produces an audit record for rejected messages.
|
|
65
|
+
*/
|
|
66
|
+
validateRouting(message: FleetMessage): RoutingDecision;
|
|
67
|
+
/**
|
|
68
|
+
* Get an Agent Card by ID.
|
|
69
|
+
*/
|
|
70
|
+
getCard(agentId: string): ReturnType<AgentCardRegistry['get']>;
|
|
71
|
+
/**
|
|
72
|
+
* Get all registered Agent Cards.
|
|
73
|
+
*/
|
|
74
|
+
allCards(): ReturnType<AgentCardRegistry['all']>;
|
|
75
|
+
/**
|
|
76
|
+
* Get the card registry (for direct access in advanced scenarios).
|
|
77
|
+
*/
|
|
78
|
+
getCardRegistry(): AgentCardRegistry;
|
|
79
|
+
/**
|
|
80
|
+
* Get the bus configuration.
|
|
81
|
+
*/
|
|
82
|
+
getConfig(): FleetBusConfig;
|
|
83
|
+
/**
|
|
84
|
+
* Write an audit event to the hash chain + JSONL.
|
|
85
|
+
* Also writes to memory (via MemoryWriter) if one has been set.
|
|
86
|
+
*/
|
|
87
|
+
audit(eventType: AuditEventType, outcome: AuditEvent['outcome'], options?: {
|
|
88
|
+
message?: FleetMessage;
|
|
89
|
+
routingDecision?: string;
|
|
90
|
+
durationMs?: number;
|
|
91
|
+
details?: string;
|
|
92
|
+
}): AuditEvent;
|
|
93
|
+
/**
|
|
94
|
+
* Get the audit trail writer (for direct access / diagnostics).
|
|
95
|
+
*/
|
|
96
|
+
getAuditWriter(): AuditTrailWriter;
|
|
97
|
+
/**
|
|
98
|
+
* Read all audit events and verify chain integrity.
|
|
99
|
+
*/
|
|
100
|
+
verifyAuditChain(): ReturnType<AuditTrailWriter['readAndVerify']>;
|
|
101
|
+
/**
|
|
102
|
+
* Set a MemoryWriter for audit trail persistence to OpenClaw memory.
|
|
103
|
+
* Call this when SPEC-FLEET-MEMORY-INFRASTRUCTURE is available.
|
|
104
|
+
*/
|
|
105
|
+
setMemoryWriter(writer: MemoryWriterLike): void;
|
|
106
|
+
/**
|
|
107
|
+
* Register a handler for incoming fleet messages.
|
|
108
|
+
* Called by fleetReceive() — not intended for direct use.
|
|
109
|
+
*/
|
|
110
|
+
registerReceiveHandler(handler: ReceiveHandler): void;
|
|
111
|
+
/**
|
|
112
|
+
* Unregister a receive handler.
|
|
113
|
+
*/
|
|
114
|
+
unregisterReceiveHandler(handler: ReceiveHandler): void;
|
|
115
|
+
/**
|
|
116
|
+
* Dispatch a raw message string to all registered receive handlers.
|
|
117
|
+
* Called from the message_received hook when a fleet message arrives.
|
|
118
|
+
*/
|
|
119
|
+
dispatchToReceivers(raw: string): Promise<void>;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../src/bus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,cAAc,EACd,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,eAAe,EAChB,MAAM,YAAY,CAAC;AAUpB,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnE,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmB;IAC/C,OAAO,CAAC,YAAY,CAAiC;IACrD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkC;IAClE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO;IAeP;;;;;OAKG;IACH,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,cAAc,GAAG,QAAQ;IAQvE;;OAEG;IACH,KAAK,IAAI,IAAI;IAmBb;;OAEG;IACH,IAAI,IAAI,IAAI;IAcZ;;OAEG;IACH,SAAS,IAAI,OAAO;IAQpB;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAOpC;;OAEG;IACH,YAAY,CAAC,OAAO,CAAC,EAAE;QACrB,IAAI,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,UAAU,EAAE;IAWhB;;OAEG;IACH,UAAU,IAAI,MAAM;IAQpB;;;OAGG;IACH,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,eAAe;IAkCvD;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAI9D;;OAEG;IACH,QAAQ,IAAI,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAIhD;;OAEG;IACH,eAAe,IAAI,iBAAiB;IAIpC;;OAEG;IACH,SAAS,IAAI,cAAc;IAQ3B;;;OAGG;IACH,KAAK,CACH,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,EAC9B,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,YAAY,CAAC;QACvB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GACA,UAAU;IAmBb;;OAEG;IACH,cAAc,IAAI,gBAAgB;IAIlC;;OAEG;IACH,gBAAgB,IAAI,UAAU,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAIjE;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAS/C;;;OAGG;IACH,sBAAsB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAIrD;;OAEG;IACH,wBAAwB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAIvD;;;OAGG;IACG,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAStD"}
|