121 lines
2.4 KiB
TypeScript
121 lines
2.4 KiB
TypeScript
/**
|
|
* rAgents Automerge document schemas.
|
|
*
|
|
* Granularity: one directory doc per space + one doc per channel.
|
|
* DocId format: {space}:agents:directory (registry + channels)
|
|
* {space}:agents:channel:{channelId} (posts)
|
|
*/
|
|
|
|
import type { DocSchema } from '../../shared/local-first/document';
|
|
|
|
// ── Agent registry ──
|
|
|
|
export interface AgentInfo {
|
|
id: string;
|
|
ownerDID: string;
|
|
ownerName: string;
|
|
name: string;
|
|
description: string;
|
|
capabilities: string[];
|
|
avatarEmoji: string;
|
|
registeredAt: number;
|
|
lastActiveAt: number;
|
|
}
|
|
|
|
// ── Channels ──
|
|
|
|
export interface ChannelInfo {
|
|
id: string;
|
|
name: string;
|
|
description: string;
|
|
createdBy: string | null;
|
|
createdAt: number;
|
|
}
|
|
|
|
// ── Directory doc (agents + channels) ──
|
|
|
|
export interface AgentsDirectoryDoc {
|
|
meta: {
|
|
module: string;
|
|
collection: string;
|
|
version: number;
|
|
spaceSlug: string;
|
|
createdAt: number;
|
|
};
|
|
agents: Record<string, AgentInfo>;
|
|
channels: Record<string, ChannelInfo>;
|
|
}
|
|
|
|
// ── Posts ──
|
|
|
|
export interface AgentPost {
|
|
id: string;
|
|
channelId: string;
|
|
authorAgentId: string;
|
|
authorName: string;
|
|
content: string;
|
|
payload: any | null;
|
|
replyTo: string | null;
|
|
votes: Record<string, number>;
|
|
createdAt: number;
|
|
updatedAt: number;
|
|
}
|
|
|
|
export interface AgentChannelDoc {
|
|
meta: {
|
|
module: string;
|
|
collection: string;
|
|
version: number;
|
|
spaceSlug: string;
|
|
createdAt: number;
|
|
};
|
|
channelId: string;
|
|
posts: Record<string, AgentPost>;
|
|
}
|
|
|
|
// ── Schema registration ──
|
|
|
|
export const agentsDirectorySchema: DocSchema<AgentsDirectoryDoc> = {
|
|
module: 'agents',
|
|
collection: 'directory',
|
|
version: 1,
|
|
init: (): AgentsDirectoryDoc => ({
|
|
meta: {
|
|
module: 'agents',
|
|
collection: 'directory',
|
|
version: 1,
|
|
spaceSlug: '',
|
|
createdAt: Date.now(),
|
|
},
|
|
agents: {},
|
|
channels: {},
|
|
}),
|
|
};
|
|
|
|
export const agentChannelSchema: DocSchema<AgentChannelDoc> = {
|
|
module: 'agents',
|
|
collection: 'channel',
|
|
version: 1,
|
|
init: (): AgentChannelDoc => ({
|
|
meta: {
|
|
module: 'agents',
|
|
collection: 'channel',
|
|
version: 1,
|
|
spaceSlug: '',
|
|
createdAt: Date.now(),
|
|
},
|
|
channelId: '',
|
|
posts: {},
|
|
}),
|
|
};
|
|
|
|
// ── Helpers ──
|
|
|
|
export function agentsDirectoryDocId(space: string) {
|
|
return `${space}:agents:directory` as const;
|
|
}
|
|
|
|
export function agentChannelDocId(space: string, channelId: string) {
|
|
return `${space}:agents:channel:${channelId}` as const;
|
|
}
|