feat(FN-989): add inter-agent messaging system with mailbox UI and CLI commands

- Add Message types (Message, MessageThread, MessageRecipient) and exports to @fusion/core
- Create MessageStore with full CRUD: send, read, delete, inbox, threads, and search
- Add messages table migration (schema v12) with SQLite full-text search support
- Add REST API routes for messaging (CRUD, search, broadcast, unread count)
- Add frontend API client functions for all messaging endpoints
- Build MailboxModal and MessageComposer dashboard components with header integration
- Add CLI message commands (inbox, send, read, delete) with rich output formatting
- Add comprehensive test coverage for MessageStore, CLI commands, and UI components
- Update documentation (CLI STANDALONE.md, dashboard README) with messaging usage
This commit is contained in:
gsxdsm
2026-04-07 11:21:59 -07:00
parent a22676b1d1
commit 7cc4ee5ebb
20 changed files with 3972 additions and 17 deletions

View File

@@ -70,6 +70,7 @@ describe("Database", () => {
expect(tableNames).toContain("slices");
expect(tableNames).toContain("mission_features");
expect(tableNames).toContain("ai_sessions");
expect(tableNames).toContain("messages");
});
it("creates all expected indexes", () => {
@@ -86,10 +87,13 @@ describe("Database", () => {
expect(indexNames).toContain("idxAgentHeartbeatsRunId");
expect(indexNames).toContain("idxAiSessionsStatus");
expect(indexNames).toContain("idxAiSessionsType");
expect(indexNames).toContain("idxMessagesCreatedAt");
expect(indexNames).toContain("idxMessagesFrom");
expect(indexNames).toContain("idxMessagesTo");
});
it("seeds schema version", () => {
expect(db.getSchemaVersion()).toBe(11);
expect(db.getSchemaVersion()).toBe(12);
});
it("seeds lastModified", () => {
@@ -112,7 +116,7 @@ describe("Database", () => {
it("is idempotent - calling init() twice does not fail", () => {
expect(() => db.init()).not.toThrow();
expect(db.getSchemaVersion()).toBe(11);
expect(db.getSchemaVersion()).toBe(12);
});
it("does not overwrite existing config on re-init", () => {
@@ -719,7 +723,7 @@ describe("schema migrations", () => {
db.init();
// Verify version bumped to 5 (includes v1→v2, v2→v3, v3→v4, and v4→v5 migrations)
expect(db.getSchemaVersion()).toBe(11);
expect(db.getSchemaVersion()).toBe(12);
// Verify new columns exist and existing data is intact
const cols = db.prepare("PRAGMA table_info(tasks)").all() as Array<{ name: string }>;
@@ -744,11 +748,11 @@ describe("schema migrations", () => {
const db = new Database(kbDir);
db.init();
expect(db.getSchemaVersion()).toBe(11);
expect(db.getSchemaVersion()).toBe(12);
// Re-init should not fail
db.init();
expect(db.getSchemaVersion()).toBe(11);
expect(db.getSchemaVersion()).toBe(12);
db.close();
});
@@ -843,7 +847,7 @@ describe("schema migrations", () => {
db.init();
// Verify version bumped to 5
expect(db.getSchemaVersion()).toBe(11);
expect(db.getSchemaVersion()).toBe(12);
// Verify new columns exist and existing data is intact
const cols = db.prepare("PRAGMA table_info(tasks)").all() as Array<{ name: string }>;
@@ -1053,7 +1057,7 @@ describe("createDatabase factory", () => {
const db = createDatabase(kbDir);
db.init();
expect(db.getSchemaVersion()).toBe(11);
expect(db.getSchemaVersion()).toBe(12);
expect(db.getLastModified()).toBeGreaterThan(0);
db.close();