@skillkit/messaging 1.19.1 → 1.20.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/index.d.ts CHANGED
@@ -183,10 +183,14 @@ declare function getLocalTransport(): LocalTransport;
183
183
  interface RemoteTransportOptions {
184
184
  timeout?: number;
185
185
  retries?: number;
186
+ useHttps?: boolean;
187
+ rejectUnauthorized?: boolean;
186
188
  }
187
189
  declare class RemoteTransport {
188
190
  private options;
189
191
  constructor(options?: RemoteTransportOptions);
192
+ private getProtocol;
193
+ private formatHost;
190
194
  deliver(message: Message, hostAddress: string, hostPort: number): Promise<MessageDeliveryResult>;
191
195
  deliverToAgent(message: Message, agentAddress: string): Promise<MessageDeliveryResult>;
192
196
  broadcast(message: Message, hosts: Array<{
package/dist/index.js CHANGED
@@ -683,17 +683,29 @@ var RemoteTransport = class {
683
683
  constructor(options = {}) {
684
684
  this.options = {
685
685
  timeout: options.timeout ?? 1e4,
686
- retries: options.retries ?? 2
686
+ retries: options.retries ?? 2,
687
+ useHttps: options.useHttps ?? false,
688
+ rejectUnauthorized: options.rejectUnauthorized ?? true
687
689
  };
688
690
  }
691
+ getProtocol(hostAddress) {
692
+ const isLocalhost = hostAddress === "localhost" || hostAddress === "127.0.0.1" || hostAddress === "::1";
693
+ return this.options.useHttps && !isLocalhost ? "https" : "http";
694
+ }
695
+ formatHost(hostAddress) {
696
+ return hostAddress.includes(":") && !hostAddress.startsWith("[") ? `[${hostAddress}]` : hostAddress;
697
+ }
689
698
  async deliver(message, hostAddress, hostPort) {
690
- const url = `http://${hostAddress}:${hostPort}/message`;
699
+ const url = `${this.getProtocol(hostAddress)}://${this.formatHost(hostAddress)}:${hostPort}/message`;
691
700
  try {
692
701
  const response = await got.post(url, {
693
702
  json: message,
694
703
  timeout: { request: this.options.timeout },
695
704
  retry: { limit: this.options.retries },
696
- throwHttpErrors: false
705
+ throwHttpErrors: false,
706
+ ...this.options.useHttps && {
707
+ https: { rejectUnauthorized: this.options.rejectUnauthorized }
708
+ }
697
709
  });
698
710
  if (response.statusCode === 200 || response.statusCode === 201) {
699
711
  return {
@@ -729,7 +741,9 @@ var RemoteTransport = class {
729
741
  };
730
742
  }
731
743
  const [, hostPart] = parts;
732
- const [host, portStr] = hostPart.split(":");
744
+ const lastColon = hostPart.lastIndexOf(":");
745
+ const host = lastColon > 0 ? hostPart.slice(0, lastColon) : hostPart;
746
+ const portStr = lastColon > 0 ? hostPart.slice(lastColon + 1) : void 0;
733
747
  const port = portStr ? parseInt(portStr, 10) : 9876;
734
748
  return this.deliver(message, host, port);
735
749
  }
@@ -744,12 +758,15 @@ var RemoteTransport = class {
744
758
  return results;
745
759
  }
746
760
  async ping(hostAddress, hostPort) {
747
- const url = `http://${hostAddress}:${hostPort}/health`;
761
+ const url = `${this.getProtocol(hostAddress)}://${this.formatHost(hostAddress)}:${hostPort}/health`;
748
762
  try {
749
763
  const response = await got.get(url, {
750
764
  timeout: { request: 5e3 },
751
765
  retry: { limit: 0 },
752
- throwHttpErrors: false
766
+ throwHttpErrors: false,
767
+ ...this.options.useHttps && {
768
+ https: { rejectUnauthorized: this.options.rejectUnauthorized }
769
+ }
753
770
  });
754
771
  return response.statusCode === 200;
755
772
  } catch {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/storage/inbox.ts","../src/storage/sent.ts","../src/storage/archived.ts","../src/message/builder.ts","../src/message/router.ts","../src/transport/local.ts","../src/transport/remote.ts","../src/index.ts"],"sourcesContent":["export type MessagePriority = 'low' | 'normal' | 'high' | 'urgent';\nexport type MessageType = 'request' | 'response' | 'notification' | 'update';\nexport type MessageStatus = 'unread' | 'read' | 'archived';\n\nexport interface Message {\n id: string;\n from: string;\n to: string;\n type: MessageType;\n priority: MessagePriority;\n subject: string;\n body: unknown;\n replyTo?: string;\n threadId?: string;\n createdAt: string;\n readAt?: string;\n status: MessageStatus;\n metadata?: Record<string, unknown>;\n}\n\nexport interface MessageCreateInput {\n to: string;\n type?: MessageType;\n priority?: MessagePriority;\n subject: string;\n body: unknown;\n replyTo?: string;\n threadId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface MessageFilter {\n from?: string;\n to?: string;\n type?: MessageType;\n priority?: MessagePriority;\n status?: MessageStatus;\n threadId?: string;\n since?: string;\n until?: string;\n limit?: number;\n}\n\nexport interface MessageThread {\n id: string;\n subject: string;\n participants: string[];\n messageCount: number;\n lastMessageAt: string;\n createdAt: string;\n}\n\nexport interface InboxSummary {\n total: number;\n unread: number;\n byPriority: Record<MessagePriority, number>;\n byType: Record<MessageType, number>;\n}\n\nexport interface MessageDeliveryResult {\n messageId: string;\n delivered: boolean;\n deliveredAt?: string;\n error?: string;\n via: 'local' | 'remote';\n}\n\nexport interface MessagingConfig {\n agentId: string;\n storagePath?: string;\n maxInboxSize?: number;\n retentionDays?: number;\n}\n\nexport const DEFAULT_MESSAGING_CONFIG: Partial<MessagingConfig> = {\n maxInboxSize: 1000,\n retentionDays: 30,\n};\n","import { readFile, writeFile, mkdir, readdir, unlink } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { Message, MessageFilter, InboxSummary } from '../types.js';\n\nexport class InboxStorage {\n private basePath: string;\n\n constructor(agentId: string, basePath?: string) {\n this.basePath = basePath ?? join(homedir(), '.skillkit', 'messages', 'inbox', agentId);\n }\n\n async initialize(): Promise<void> {\n await mkdir(this.basePath, { recursive: true });\n }\n\n async save(message: Message): Promise<void> {\n const filePath = this.getMessagePath(message.id);\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, JSON.stringify(message, null, 2), 'utf-8');\n }\n\n async get(messageId: string): Promise<Message | null> {\n const filePath = this.getMessagePath(messageId);\n\n if (!existsSync(filePath)) {\n return null;\n }\n\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as Message;\n } catch {\n return null;\n }\n }\n\n async delete(messageId: string): Promise<boolean> {\n const filePath = this.getMessagePath(messageId);\n\n if (!existsSync(filePath)) {\n return false;\n }\n\n try {\n await unlink(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n async list(filter: MessageFilter = {}): Promise<Message[]> {\n if (!existsSync(this.basePath)) {\n return [];\n }\n\n const files = await readdir(this.basePath);\n const messages: Message[] = [];\n\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n\n const filePath = join(this.basePath, file);\n try {\n const content = await readFile(filePath, 'utf-8');\n const message = JSON.parse(content) as Message;\n\n if (this.matchesFilter(message, filter)) {\n messages.push(message);\n }\n } catch {\n }\n }\n\n messages.sort((a, b) => {\n const priorityOrder = { urgent: 0, high: 1, normal: 2, low: 3 };\n const priorityDiff = priorityOrder[a.priority] - priorityOrder[b.priority];\n if (priorityDiff !== 0) return priorityDiff;\n\n return new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime();\n });\n\n return filter.limit ? messages.slice(0, filter.limit) : messages;\n }\n\n async markAsRead(messageId: string): Promise<Message | null> {\n const message = await this.get(messageId);\n if (!message) return null;\n\n message.status = 'read';\n message.readAt = new Date().toISOString();\n await this.save(message);\n\n return message;\n }\n\n async getUnread(): Promise<Message[]> {\n return this.list({ status: 'unread' });\n }\n\n async getSummary(): Promise<InboxSummary> {\n const messages = await this.list();\n\n const summary: InboxSummary = {\n total: messages.length,\n unread: 0,\n byPriority: { low: 0, normal: 0, high: 0, urgent: 0 },\n byType: { request: 0, response: 0, notification: 0, update: 0 },\n };\n\n for (const message of messages) {\n if (message.status === 'unread') {\n summary.unread++;\n }\n summary.byPriority[message.priority]++;\n summary.byType[message.type]++;\n }\n\n return summary;\n }\n\n async count(): Promise<number> {\n if (!existsSync(this.basePath)) return 0;\n\n const files = await readdir(this.basePath);\n return files.filter(f => f.endsWith('.json')).length;\n }\n\n async clear(): Promise<number> {\n if (!existsSync(this.basePath)) return 0;\n\n const files = await readdir(this.basePath);\n let deleted = 0;\n\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n\n try {\n await unlink(join(this.basePath, file));\n deleted++;\n } catch {\n }\n }\n\n return deleted;\n }\n\n private getMessagePath(messageId: string): string {\n return join(this.basePath, `${messageId}.json`);\n }\n\n private matchesFilter(message: Message, filter: MessageFilter): boolean {\n if (filter.from && message.from !== filter.from) return false;\n if (filter.to && message.to !== filter.to) return false;\n if (filter.type && message.type !== filter.type) return false;\n if (filter.priority && message.priority !== filter.priority) return false;\n if (filter.status && message.status !== filter.status) return false;\n if (filter.threadId && message.threadId !== filter.threadId) return false;\n\n if (filter.since) {\n const since = new Date(filter.since).getTime();\n const created = new Date(message.createdAt).getTime();\n if (created < since) return false;\n }\n\n if (filter.until) {\n const until = new Date(filter.until).getTime();\n const created = new Date(message.createdAt).getTime();\n if (created > until) return false;\n }\n\n return true;\n }\n}\n","import { readFile, writeFile, mkdir, readdir, unlink } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { Message, MessageFilter } from '../types.js';\n\nexport class SentStorage {\n private basePath: string;\n\n constructor(agentId: string, basePath?: string) {\n this.basePath = basePath ?? join(homedir(), '.skillkit', 'messages', 'sent', agentId);\n }\n\n async initialize(): Promise<void> {\n await mkdir(this.basePath, { recursive: true });\n }\n\n async save(message: Message): Promise<void> {\n const filePath = this.getMessagePath(message.id);\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, JSON.stringify(message, null, 2), 'utf-8');\n }\n\n async get(messageId: string): Promise<Message | null> {\n const filePath = this.getMessagePath(messageId);\n\n if (!existsSync(filePath)) {\n return null;\n }\n\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as Message;\n } catch {\n return null;\n }\n }\n\n async delete(messageId: string): Promise<boolean> {\n const filePath = this.getMessagePath(messageId);\n\n if (!existsSync(filePath)) {\n return false;\n }\n\n try {\n await unlink(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n async list(filter: MessageFilter = {}): Promise<Message[]> {\n if (!existsSync(this.basePath)) {\n return [];\n }\n\n const files = await readdir(this.basePath);\n const messages: Message[] = [];\n\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n\n const filePath = join(this.basePath, file);\n try {\n const content = await readFile(filePath, 'utf-8');\n const message = JSON.parse(content) as Message;\n\n if (this.matchesFilter(message, filter)) {\n messages.push(message);\n }\n } catch {\n }\n }\n\n messages.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\n return filter.limit ? messages.slice(0, filter.limit) : messages;\n }\n\n async getByThread(threadId: string): Promise<Message[]> {\n return this.list({ threadId });\n }\n\n async getByRecipient(to: string): Promise<Message[]> {\n return this.list({ to });\n }\n\n async count(): Promise<number> {\n if (!existsSync(this.basePath)) return 0;\n\n const files = await readdir(this.basePath);\n return files.filter(f => f.endsWith('.json')).length;\n }\n\n async clear(): Promise<number> {\n if (!existsSync(this.basePath)) return 0;\n\n const files = await readdir(this.basePath);\n let deleted = 0;\n\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n\n try {\n await unlink(join(this.basePath, file));\n deleted++;\n } catch {\n }\n }\n\n return deleted;\n }\n\n private getMessagePath(messageId: string): string {\n return join(this.basePath, `${messageId}.json`);\n }\n\n private matchesFilter(message: Message, filter: MessageFilter): boolean {\n if (filter.to && message.to !== filter.to) return false;\n if (filter.type && message.type !== filter.type) return false;\n if (filter.priority && message.priority !== filter.priority) return false;\n if (filter.threadId && message.threadId !== filter.threadId) return false;\n\n if (filter.since) {\n const since = new Date(filter.since).getTime();\n const created = new Date(message.createdAt).getTime();\n if (created < since) return false;\n }\n\n if (filter.until) {\n const until = new Date(filter.until).getTime();\n const created = new Date(message.createdAt).getTime();\n if (created > until) return false;\n }\n\n return true;\n }\n}\n","import { readFile, writeFile, mkdir, readdir, unlink } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { Message, MessageFilter } from '../types.js';\n\nexport class ArchivedStorage {\n private basePath: string;\n\n constructor(agentId: string, basePath?: string) {\n this.basePath = basePath ?? join(homedir(), '.skillkit', 'messages', 'archived', agentId);\n }\n\n async initialize(): Promise<void> {\n await mkdir(this.basePath, { recursive: true });\n }\n\n async save(message: Message): Promise<void> {\n const archivedMessage: Message = {\n ...message,\n status: 'archived',\n };\n\n const filePath = this.getMessagePath(message.id);\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, JSON.stringify(archivedMessage, null, 2), 'utf-8');\n }\n\n async get(messageId: string): Promise<Message | null> {\n const filePath = this.getMessagePath(messageId);\n\n if (!existsSync(filePath)) {\n return null;\n }\n\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as Message;\n } catch {\n return null;\n }\n }\n\n async delete(messageId: string): Promise<boolean> {\n const filePath = this.getMessagePath(messageId);\n\n if (!existsSync(filePath)) {\n return false;\n }\n\n try {\n await unlink(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n async list(filter: MessageFilter = {}): Promise<Message[]> {\n if (!existsSync(this.basePath)) {\n return [];\n }\n\n const files = await readdir(this.basePath);\n const messages: Message[] = [];\n\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n\n const filePath = join(this.basePath, file);\n try {\n const content = await readFile(filePath, 'utf-8');\n const message = JSON.parse(content) as Message;\n\n if (this.matchesFilter(message, filter)) {\n messages.push(message);\n }\n } catch {\n }\n }\n\n messages.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\n return filter.limit ? messages.slice(0, filter.limit) : messages;\n }\n\n async search(query: string, limit = 50): Promise<Message[]> {\n const messages = await this.list();\n const lowerQuery = query.toLowerCase();\n\n return messages\n .filter(m => {\n const subject = m.subject.toLowerCase();\n const bodyStr = typeof m.body === 'string' ? m.body.toLowerCase() : JSON.stringify(m.body).toLowerCase();\n return subject.includes(lowerQuery) || bodyStr.includes(lowerQuery);\n })\n .slice(0, limit);\n }\n\n async count(): Promise<number> {\n if (!existsSync(this.basePath)) return 0;\n\n const files = await readdir(this.basePath);\n return files.filter(f => f.endsWith('.json')).length;\n }\n\n async clear(): Promise<number> {\n if (!existsSync(this.basePath)) return 0;\n\n const files = await readdir(this.basePath);\n let deleted = 0;\n\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n\n try {\n await unlink(join(this.basePath, file));\n deleted++;\n } catch {\n }\n }\n\n return deleted;\n }\n\n async pruneOlderThan(days: number): Promise<number> {\n const messages = await this.list();\n const cutoff = Date.now() - days * 24 * 60 * 60 * 1000;\n let deleted = 0;\n\n for (const message of messages) {\n const createdAt = new Date(message.createdAt).getTime();\n if (createdAt < cutoff) {\n if (await this.delete(message.id)) {\n deleted++;\n }\n }\n }\n\n return deleted;\n }\n\n private getMessagePath(messageId: string): string {\n return join(this.basePath, `${messageId}.json`);\n }\n\n private matchesFilter(message: Message, filter: MessageFilter): boolean {\n if (filter.from && message.from !== filter.from) return false;\n if (filter.to && message.to !== filter.to) return false;\n if (filter.type && message.type !== filter.type) return false;\n if (filter.priority && message.priority !== filter.priority) return false;\n if (filter.threadId && message.threadId !== filter.threadId) return false;\n\n if (filter.since) {\n const since = new Date(filter.since).getTime();\n const created = new Date(message.createdAt).getTime();\n if (created < since) return false;\n }\n\n if (filter.until) {\n const until = new Date(filter.until).getTime();\n const created = new Date(message.createdAt).getTime();\n if (created > until) return false;\n }\n\n return true;\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type {\n Message,\n MessageCreateInput,\n MessageType,\n MessagePriority,\n} from '../types.js';\n\nexport class MessageBuilder {\n private message: Partial<Message>;\n\n constructor() {\n this.message = {\n id: randomUUID(),\n type: 'notification',\n priority: 'normal',\n status: 'unread',\n createdAt: new Date().toISOString(),\n };\n }\n\n static create(): MessageBuilder {\n return new MessageBuilder();\n }\n\n from(agentId: string): this {\n this.message.from = agentId;\n return this;\n }\n\n to(recipient: string): this {\n this.message.to = recipient;\n return this;\n }\n\n subject(subject: string): this {\n this.message.subject = subject;\n return this;\n }\n\n body(body: unknown): this {\n this.message.body = body;\n return this;\n }\n\n type(type: MessageType): this {\n this.message.type = type;\n return this;\n }\n\n priority(priority: MessagePriority): this {\n this.message.priority = priority;\n return this;\n }\n\n replyTo(messageId: string): this {\n this.message.replyTo = messageId;\n return this;\n }\n\n threadId(threadId: string): this {\n this.message.threadId = threadId;\n return this;\n }\n\n metadata(metadata: Record<string, unknown>): this {\n this.message.metadata = metadata;\n return this;\n }\n\n request(): this {\n this.message.type = 'request';\n return this;\n }\n\n response(): this {\n this.message.type = 'response';\n return this;\n }\n\n notification(): this {\n this.message.type = 'notification';\n return this;\n }\n\n update(): this {\n this.message.type = 'update';\n return this;\n }\n\n low(): this {\n this.message.priority = 'low';\n return this;\n }\n\n normal(): this {\n this.message.priority = 'normal';\n return this;\n }\n\n high(): this {\n this.message.priority = 'high';\n return this;\n }\n\n urgent(): this {\n this.message.priority = 'urgent';\n return this;\n }\n\n build(): Message {\n if (!this.message.from) {\n throw new Error('Message must have a \"from\" field');\n }\n if (!this.message.to) {\n throw new Error('Message must have a \"to\" field');\n }\n if (!this.message.subject) {\n throw new Error('Message must have a subject');\n }\n if (this.message.body === undefined) {\n throw new Error('Message must have a body');\n }\n\n return this.message as Message;\n }\n}\n\nexport function createMessage(from: string, input: MessageCreateInput): Message {\n const builder = MessageBuilder.create()\n .from(from)\n .to(input.to)\n .subject(input.subject)\n .body(input.body);\n\n if (input.type) builder.type(input.type);\n if (input.priority) builder.priority(input.priority);\n if (input.replyTo) builder.replyTo(input.replyTo);\n if (input.threadId) builder.threadId(input.threadId);\n if (input.metadata) builder.metadata(input.metadata);\n\n return builder.build();\n}\n\nexport function createReply(\n originalMessage: Message,\n from: string,\n body: unknown\n): Message {\n return MessageBuilder.create()\n .from(from)\n .to(originalMessage.from)\n .subject(`Re: ${originalMessage.subject}`)\n .body(body)\n .type('response')\n .priority(originalMessage.priority)\n .replyTo(originalMessage.id)\n .threadId(originalMessage.threadId ?? originalMessage.id)\n .build();\n}\n\nexport function createForward(\n originalMessage: Message,\n from: string,\n to: string,\n additionalBody?: unknown\n): Message {\n const forwardBody = {\n forwardedFrom: originalMessage.from,\n originalSubject: originalMessage.subject,\n originalBody: originalMessage.body,\n ...(additionalBody ? { note: additionalBody } : {}),\n };\n\n return MessageBuilder.create()\n .from(from)\n .to(to)\n .subject(`Fwd: ${originalMessage.subject}`)\n .body(forwardBody)\n .type(originalMessage.type)\n .priority(originalMessage.priority)\n .build();\n}\n","import type { Message, MessageDeliveryResult } from '../types.js';\nimport { InboxStorage } from '../storage/inbox.js';\nimport { SentStorage } from '../storage/sent.js';\nimport { ArchivedStorage } from '../storage/archived.js';\n\nexport interface RouterConfig {\n localAgentId: string;\n inboxStorage: InboxStorage;\n sentStorage: SentStorage;\n archivedStorage: ArchivedStorage;\n}\n\nexport interface RemoteDeliveryHandler {\n (message: Message, hostAddress: string): Promise<MessageDeliveryResult>;\n}\n\nexport class MessageRouter {\n private config: RouterConfig;\n private localAgents: Map<string, InboxStorage> = new Map();\n private remoteHandler?: RemoteDeliveryHandler;\n\n constructor(config: RouterConfig) {\n this.config = config;\n this.localAgents.set(config.localAgentId, config.inboxStorage);\n }\n\n registerLocalAgent(agentId: string, inbox: InboxStorage): void {\n this.localAgents.set(agentId, inbox);\n }\n\n unregisterLocalAgent(agentId: string): void {\n if (agentId !== this.config.localAgentId) {\n this.localAgents.delete(agentId);\n }\n }\n\n setRemoteHandler(handler: RemoteDeliveryHandler): void {\n this.remoteHandler = handler;\n }\n\n async route(message: Message): Promise<MessageDeliveryResult> {\n const recipient = this.parseRecipient(message.to);\n\n await this.config.sentStorage.save(message);\n\n if (recipient.isLocal) {\n return this.deliverLocal(message, recipient.agentId);\n }\n\n return this.deliverRemote(message, recipient.host!, recipient.agentId);\n }\n\n async deliverLocal(message: Message, agentId: string): Promise<MessageDeliveryResult> {\n const inbox = this.localAgents.get(agentId);\n\n if (!inbox) {\n return {\n messageId: message.id,\n delivered: false,\n error: `Agent ${agentId} not found locally`,\n via: 'local',\n };\n }\n\n try {\n await inbox.save(message);\n\n return {\n messageId: message.id,\n delivered: true,\n deliveredAt: new Date().toISOString(),\n via: 'local',\n };\n } catch (err: any) {\n return {\n messageId: message.id,\n delivered: false,\n error: err.message,\n via: 'local',\n };\n }\n }\n\n async deliverRemote(\n message: Message,\n hostAddress: string,\n _agentId: string\n ): Promise<MessageDeliveryResult> {\n if (!this.remoteHandler) {\n return {\n messageId: message.id,\n delivered: false,\n error: 'No remote delivery handler configured',\n via: 'remote',\n };\n }\n\n try {\n return await this.remoteHandler(message, hostAddress);\n } catch (err: any) {\n return {\n messageId: message.id,\n delivered: false,\n error: err.message,\n via: 'remote',\n };\n }\n }\n\n async archive(messageId: string): Promise<boolean> {\n const message = await this.config.inboxStorage.get(messageId);\n if (!message) return false;\n\n await this.config.archivedStorage.save(message);\n await this.config.inboxStorage.delete(messageId);\n\n return true;\n }\n\n async unarchive(messageId: string): Promise<boolean> {\n const message = await this.config.archivedStorage.get(messageId);\n if (!message) return false;\n\n message.status = 'read';\n await this.config.inboxStorage.save(message);\n await this.config.archivedStorage.delete(messageId);\n\n return true;\n }\n\n getLocalAgents(): string[] {\n return Array.from(this.localAgents.keys());\n }\n\n isLocalAgent(agentId: string): boolean {\n return this.localAgents.has(agentId);\n }\n\n private parseRecipient(to: string): {\n agentId: string;\n host?: string;\n isLocal: boolean;\n } {\n if (to.includes('@')) {\n const [agentId, host] = to.split('@');\n return { agentId, host, isLocal: false };\n }\n\n return {\n agentId: to,\n isLocal: this.localAgents.has(to),\n };\n }\n}\n","import type { Message, MessageDeliveryResult } from '../types.js';\nimport { InboxStorage } from '../storage/inbox.js';\n\nexport class LocalTransport {\n private agents: Map<string, InboxStorage> = new Map();\n\n register(agentId: string, inbox: InboxStorage): void {\n this.agents.set(agentId, inbox);\n }\n\n unregister(agentId: string): void {\n this.agents.delete(agentId);\n }\n\n async deliver(message: Message): Promise<MessageDeliveryResult> {\n const inbox = this.agents.get(message.to);\n\n if (!inbox) {\n return {\n messageId: message.id,\n delivered: false,\n error: `Agent ${message.to} not found locally`,\n via: 'local',\n };\n }\n\n try {\n await inbox.save(message);\n\n return {\n messageId: message.id,\n delivered: true,\n deliveredAt: new Date().toISOString(),\n via: 'local',\n };\n } catch (err: any) {\n return {\n messageId: message.id,\n delivered: false,\n error: err.message,\n via: 'local',\n };\n }\n }\n\n async broadcast(message: Message, excludeFrom = true): Promise<Map<string, MessageDeliveryResult>> {\n const results = new Map<string, MessageDeliveryResult>();\n\n for (const [agentId] of this.agents) {\n if (excludeFrom && agentId === message.from) continue;\n\n const targetMessage = { ...message, to: agentId };\n const result = await this.deliver(targetMessage);\n results.set(agentId, result);\n }\n\n return results;\n }\n\n getRegisteredAgents(): string[] {\n return Array.from(this.agents.keys());\n }\n\n isRegistered(agentId: string): boolean {\n return this.agents.has(agentId);\n }\n}\n\nlet globalTransport: LocalTransport | null = null;\n\nexport function getLocalTransport(): LocalTransport {\n if (!globalTransport) {\n globalTransport = new LocalTransport();\n }\n return globalTransport;\n}\n","import got from 'got';\nimport type { Message, MessageDeliveryResult } from '../types.js';\n\nexport interface RemoteTransportOptions {\n timeout?: number;\n retries?: number;\n}\n\nexport class RemoteTransport {\n private options: Required<RemoteTransportOptions>;\n\n constructor(options: RemoteTransportOptions = {}) {\n this.options = {\n timeout: options.timeout ?? 10000,\n retries: options.retries ?? 2,\n };\n }\n\n async deliver(\n message: Message,\n hostAddress: string,\n hostPort: number\n ): Promise<MessageDeliveryResult> {\n const url = `http://${hostAddress}:${hostPort}/message`;\n\n try {\n const response = await got.post(url, {\n json: message,\n timeout: { request: this.options.timeout },\n retry: { limit: this.options.retries },\n throwHttpErrors: false,\n });\n\n if (response.statusCode === 200 || response.statusCode === 201) {\n return {\n messageId: message.id,\n delivered: true,\n deliveredAt: new Date().toISOString(),\n via: 'remote',\n };\n }\n\n return {\n messageId: message.id,\n delivered: false,\n error: `HTTP ${response.statusCode}: ${response.body}`,\n via: 'remote',\n };\n } catch (err: any) {\n return {\n messageId: message.id,\n delivered: false,\n error: err.message || 'Connection failed',\n via: 'remote',\n };\n }\n }\n\n async deliverToAgent(\n message: Message,\n agentAddress: string\n ): Promise<MessageDeliveryResult> {\n const parts = agentAddress.split('@');\n if (parts.length !== 2) {\n return {\n messageId: message.id,\n delivered: false,\n error: 'Invalid agent address format. Expected: agentId@host:port',\n via: 'remote',\n };\n }\n\n const [, hostPart] = parts;\n const [host, portStr] = hostPart.split(':');\n const port = portStr ? parseInt(portStr, 10) : 9876;\n\n return this.deliver(message, host, port);\n }\n\n async broadcast(\n message: Message,\n hosts: Array<{ address: string; port: number }>\n ): Promise<Map<string, MessageDeliveryResult>> {\n const results = new Map<string, MessageDeliveryResult>();\n\n await Promise.all(\n hosts.map(async ({ address, port }) => {\n const result = await this.deliver(message, address, port);\n results.set(`${address}:${port}`, result);\n })\n );\n\n return results;\n }\n\n async ping(hostAddress: string, hostPort: number): Promise<boolean> {\n const url = `http://${hostAddress}:${hostPort}/health`;\n\n try {\n const response = await got.get(url, {\n timeout: { request: 5000 },\n retry: { limit: 0 },\n throwHttpErrors: false,\n });\n\n return response.statusCode === 200;\n } catch {\n return false;\n }\n }\n}\n","export * from './types.js';\n\nexport { InboxStorage } from './storage/inbox.js';\nexport { SentStorage } from './storage/sent.js';\nexport { ArchivedStorage } from './storage/archived.js';\n\nexport {\n MessageBuilder,\n createMessage,\n createReply,\n createForward,\n} from './message/builder.js';\n\nexport {\n MessageRouter,\n type RouterConfig,\n type RemoteDeliveryHandler,\n} from './message/router.js';\n\nexport { LocalTransport, getLocalTransport } from './transport/local.js';\nexport { RemoteTransport, type RemoteTransportOptions } from './transport/remote.js';\n\nimport { InboxStorage } from './storage/inbox.js';\nimport { SentStorage } from './storage/sent.js';\nimport { ArchivedStorage } from './storage/archived.js';\nimport { MessageRouter } from './message/router.js';\nimport { createMessage as _createMessage, createReply as _createReply, createForward as _createForward } from './message/builder.js';\nimport type { MessageCreateInput, MessageDeliveryResult, Message, MessageFilter, InboxSummary } from './types.js';\n\nexport interface MessagingServiceConfig {\n agentId: string;\n storagePath?: string;\n}\n\nexport class MessagingService {\n private config: MessagingServiceConfig;\n private inbox: InboxStorage;\n private sent: SentStorage;\n private archived: ArchivedStorage;\n private router: MessageRouter;\n\n constructor(config: MessagingServiceConfig) {\n this.config = config;\n\n this.inbox = new InboxStorage(config.agentId, config.storagePath);\n this.sent = new SentStorage(config.agentId, config.storagePath);\n this.archived = new ArchivedStorage(config.agentId, config.storagePath);\n\n this.router = new MessageRouter({\n localAgentId: config.agentId,\n inboxStorage: this.inbox,\n sentStorage: this.sent,\n archivedStorage: this.archived,\n });\n }\n\n async initialize(): Promise<void> {\n await this.inbox.initialize();\n await this.sent.initialize();\n await this.archived.initialize();\n }\n\n async send(input: MessageCreateInput): Promise<MessageDeliveryResult> {\n const message = _createMessage(this.config.agentId, input);\n return this.router.route(message);\n }\n\n async reply(messageId: string, body: unknown): Promise<MessageDeliveryResult> {\n const original = await this.inbox.get(messageId);\n if (!original) {\n throw new Error(`Message ${messageId} not found`);\n }\n\n const reply = _createReply(original, this.config.agentId, body);\n return this.router.route(reply);\n }\n\n async forward(messageId: string, to: string, note?: unknown): Promise<MessageDeliveryResult> {\n const original = await this.inbox.get(messageId);\n if (!original) {\n throw new Error(`Message ${messageId} not found`);\n }\n\n const forwarded = _createForward(original, this.config.agentId, to, note);\n return this.router.route(forwarded);\n }\n\n async getInbox(filter?: MessageFilter): Promise<Message[]> {\n return this.inbox.list(filter);\n }\n\n async getSent(filter?: MessageFilter): Promise<Message[]> {\n return this.sent.list(filter);\n }\n\n async getArchived(filter?: MessageFilter): Promise<Message[]> {\n return this.archived.list(filter);\n }\n\n async getMessage(messageId: string): Promise<Message | null> {\n return this.inbox.get(messageId);\n }\n\n async markAsRead(messageId: string): Promise<Message | null> {\n return this.inbox.markAsRead(messageId);\n }\n\n async archive(messageId: string): Promise<boolean> {\n return this.router.archive(messageId);\n }\n\n async deleteMessage(messageId: string): Promise<boolean> {\n return this.inbox.delete(messageId);\n }\n\n async getInboxSummary(): Promise<InboxSummary> {\n return this.inbox.getSummary();\n }\n\n getRouter(): MessageRouter {\n return this.router;\n }\n}\n\nexport async function createMessagingService(\n agentId: string,\n storagePath?: string\n): Promise<MessagingService> {\n const service = new MessagingService({ agentId, storagePath });\n await service.initialize();\n return service;\n}\n"],"mappings":"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","names":["readFile","writeFile","mkdir","readdir","unlink","existsSync","join","dirname","homedir","readFile","writeFile","mkdir","readdir","unlink","existsSync","join","dirname","homedir"]}
1
+ {"version":3,"sources":["../src/types.ts","../src/storage/inbox.ts","../src/storage/sent.ts","../src/storage/archived.ts","../src/message/builder.ts","../src/message/router.ts","../src/transport/local.ts","../src/transport/remote.ts","../src/index.ts"],"sourcesContent":["export type MessagePriority = 'low' | 'normal' | 'high' | 'urgent';\nexport type MessageType = 'request' | 'response' | 'notification' | 'update';\nexport type MessageStatus = 'unread' | 'read' | 'archived';\n\nexport interface Message {\n id: string;\n from: string;\n to: string;\n type: MessageType;\n priority: MessagePriority;\n subject: string;\n body: unknown;\n replyTo?: string;\n threadId?: string;\n createdAt: string;\n readAt?: string;\n status: MessageStatus;\n metadata?: Record<string, unknown>;\n}\n\nexport interface MessageCreateInput {\n to: string;\n type?: MessageType;\n priority?: MessagePriority;\n subject: string;\n body: unknown;\n replyTo?: string;\n threadId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface MessageFilter {\n from?: string;\n to?: string;\n type?: MessageType;\n priority?: MessagePriority;\n status?: MessageStatus;\n threadId?: string;\n since?: string;\n until?: string;\n limit?: number;\n}\n\nexport interface MessageThread {\n id: string;\n subject: string;\n participants: string[];\n messageCount: number;\n lastMessageAt: string;\n createdAt: string;\n}\n\nexport interface InboxSummary {\n total: number;\n unread: number;\n byPriority: Record<MessagePriority, number>;\n byType: Record<MessageType, number>;\n}\n\nexport interface MessageDeliveryResult {\n messageId: string;\n delivered: boolean;\n deliveredAt?: string;\n error?: string;\n via: 'local' | 'remote';\n}\n\nexport interface MessagingConfig {\n agentId: string;\n storagePath?: string;\n maxInboxSize?: number;\n retentionDays?: number;\n}\n\nexport const DEFAULT_MESSAGING_CONFIG: Partial<MessagingConfig> = {\n maxInboxSize: 1000,\n retentionDays: 30,\n};\n","import { readFile, writeFile, mkdir, readdir, unlink } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { Message, MessageFilter, InboxSummary } from '../types.js';\n\nexport class InboxStorage {\n private basePath: string;\n\n constructor(agentId: string, basePath?: string) {\n this.basePath = basePath ?? join(homedir(), '.skillkit', 'messages', 'inbox', agentId);\n }\n\n async initialize(): Promise<void> {\n await mkdir(this.basePath, { recursive: true });\n }\n\n async save(message: Message): Promise<void> {\n const filePath = this.getMessagePath(message.id);\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, JSON.stringify(message, null, 2), 'utf-8');\n }\n\n async get(messageId: string): Promise<Message | null> {\n const filePath = this.getMessagePath(messageId);\n\n if (!existsSync(filePath)) {\n return null;\n }\n\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as Message;\n } catch {\n return null;\n }\n }\n\n async delete(messageId: string): Promise<boolean> {\n const filePath = this.getMessagePath(messageId);\n\n if (!existsSync(filePath)) {\n return false;\n }\n\n try {\n await unlink(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n async list(filter: MessageFilter = {}): Promise<Message[]> {\n if (!existsSync(this.basePath)) {\n return [];\n }\n\n const files = await readdir(this.basePath);\n const messages: Message[] = [];\n\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n\n const filePath = join(this.basePath, file);\n try {\n const content = await readFile(filePath, 'utf-8');\n const message = JSON.parse(content) as Message;\n\n if (this.matchesFilter(message, filter)) {\n messages.push(message);\n }\n } catch {\n }\n }\n\n messages.sort((a, b) => {\n const priorityOrder = { urgent: 0, high: 1, normal: 2, low: 3 };\n const priorityDiff = priorityOrder[a.priority] - priorityOrder[b.priority];\n if (priorityDiff !== 0) return priorityDiff;\n\n return new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime();\n });\n\n return filter.limit ? messages.slice(0, filter.limit) : messages;\n }\n\n async markAsRead(messageId: string): Promise<Message | null> {\n const message = await this.get(messageId);\n if (!message) return null;\n\n message.status = 'read';\n message.readAt = new Date().toISOString();\n await this.save(message);\n\n return message;\n }\n\n async getUnread(): Promise<Message[]> {\n return this.list({ status: 'unread' });\n }\n\n async getSummary(): Promise<InboxSummary> {\n const messages = await this.list();\n\n const summary: InboxSummary = {\n total: messages.length,\n unread: 0,\n byPriority: { low: 0, normal: 0, high: 0, urgent: 0 },\n byType: { request: 0, response: 0, notification: 0, update: 0 },\n };\n\n for (const message of messages) {\n if (message.status === 'unread') {\n summary.unread++;\n }\n summary.byPriority[message.priority]++;\n summary.byType[message.type]++;\n }\n\n return summary;\n }\n\n async count(): Promise<number> {\n if (!existsSync(this.basePath)) return 0;\n\n const files = await readdir(this.basePath);\n return files.filter(f => f.endsWith('.json')).length;\n }\n\n async clear(): Promise<number> {\n if (!existsSync(this.basePath)) return 0;\n\n const files = await readdir(this.basePath);\n let deleted = 0;\n\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n\n try {\n await unlink(join(this.basePath, file));\n deleted++;\n } catch {\n }\n }\n\n return deleted;\n }\n\n private getMessagePath(messageId: string): string {\n return join(this.basePath, `${messageId}.json`);\n }\n\n private matchesFilter(message: Message, filter: MessageFilter): boolean {\n if (filter.from && message.from !== filter.from) return false;\n if (filter.to && message.to !== filter.to) return false;\n if (filter.type && message.type !== filter.type) return false;\n if (filter.priority && message.priority !== filter.priority) return false;\n if (filter.status && message.status !== filter.status) return false;\n if (filter.threadId && message.threadId !== filter.threadId) return false;\n\n if (filter.since) {\n const since = new Date(filter.since).getTime();\n const created = new Date(message.createdAt).getTime();\n if (created < since) return false;\n }\n\n if (filter.until) {\n const until = new Date(filter.until).getTime();\n const created = new Date(message.createdAt).getTime();\n if (created > until) return false;\n }\n\n return true;\n }\n}\n","import { readFile, writeFile, mkdir, readdir, unlink } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { Message, MessageFilter } from '../types.js';\n\nexport class SentStorage {\n private basePath: string;\n\n constructor(agentId: string, basePath?: string) {\n this.basePath = basePath ?? join(homedir(), '.skillkit', 'messages', 'sent', agentId);\n }\n\n async initialize(): Promise<void> {\n await mkdir(this.basePath, { recursive: true });\n }\n\n async save(message: Message): Promise<void> {\n const filePath = this.getMessagePath(message.id);\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, JSON.stringify(message, null, 2), 'utf-8');\n }\n\n async get(messageId: string): Promise<Message | null> {\n const filePath = this.getMessagePath(messageId);\n\n if (!existsSync(filePath)) {\n return null;\n }\n\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as Message;\n } catch {\n return null;\n }\n }\n\n async delete(messageId: string): Promise<boolean> {\n const filePath = this.getMessagePath(messageId);\n\n if (!existsSync(filePath)) {\n return false;\n }\n\n try {\n await unlink(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n async list(filter: MessageFilter = {}): Promise<Message[]> {\n if (!existsSync(this.basePath)) {\n return [];\n }\n\n const files = await readdir(this.basePath);\n const messages: Message[] = [];\n\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n\n const filePath = join(this.basePath, file);\n try {\n const content = await readFile(filePath, 'utf-8');\n const message = JSON.parse(content) as Message;\n\n if (this.matchesFilter(message, filter)) {\n messages.push(message);\n }\n } catch {\n }\n }\n\n messages.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\n return filter.limit ? messages.slice(0, filter.limit) : messages;\n }\n\n async getByThread(threadId: string): Promise<Message[]> {\n return this.list({ threadId });\n }\n\n async getByRecipient(to: string): Promise<Message[]> {\n return this.list({ to });\n }\n\n async count(): Promise<number> {\n if (!existsSync(this.basePath)) return 0;\n\n const files = await readdir(this.basePath);\n return files.filter(f => f.endsWith('.json')).length;\n }\n\n async clear(): Promise<number> {\n if (!existsSync(this.basePath)) return 0;\n\n const files = await readdir(this.basePath);\n let deleted = 0;\n\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n\n try {\n await unlink(join(this.basePath, file));\n deleted++;\n } catch {\n }\n }\n\n return deleted;\n }\n\n private getMessagePath(messageId: string): string {\n return join(this.basePath, `${messageId}.json`);\n }\n\n private matchesFilter(message: Message, filter: MessageFilter): boolean {\n if (filter.to && message.to !== filter.to) return false;\n if (filter.type && message.type !== filter.type) return false;\n if (filter.priority && message.priority !== filter.priority) return false;\n if (filter.threadId && message.threadId !== filter.threadId) return false;\n\n if (filter.since) {\n const since = new Date(filter.since).getTime();\n const created = new Date(message.createdAt).getTime();\n if (created < since) return false;\n }\n\n if (filter.until) {\n const until = new Date(filter.until).getTime();\n const created = new Date(message.createdAt).getTime();\n if (created > until) return false;\n }\n\n return true;\n }\n}\n","import { readFile, writeFile, mkdir, readdir, unlink } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { Message, MessageFilter } from '../types.js';\n\nexport class ArchivedStorage {\n private basePath: string;\n\n constructor(agentId: string, basePath?: string) {\n this.basePath = basePath ?? join(homedir(), '.skillkit', 'messages', 'archived', agentId);\n }\n\n async initialize(): Promise<void> {\n await mkdir(this.basePath, { recursive: true });\n }\n\n async save(message: Message): Promise<void> {\n const archivedMessage: Message = {\n ...message,\n status: 'archived',\n };\n\n const filePath = this.getMessagePath(message.id);\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, JSON.stringify(archivedMessage, null, 2), 'utf-8');\n }\n\n async get(messageId: string): Promise<Message | null> {\n const filePath = this.getMessagePath(messageId);\n\n if (!existsSync(filePath)) {\n return null;\n }\n\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as Message;\n } catch {\n return null;\n }\n }\n\n async delete(messageId: string): Promise<boolean> {\n const filePath = this.getMessagePath(messageId);\n\n if (!existsSync(filePath)) {\n return false;\n }\n\n try {\n await unlink(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n async list(filter: MessageFilter = {}): Promise<Message[]> {\n if (!existsSync(this.basePath)) {\n return [];\n }\n\n const files = await readdir(this.basePath);\n const messages: Message[] = [];\n\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n\n const filePath = join(this.basePath, file);\n try {\n const content = await readFile(filePath, 'utf-8');\n const message = JSON.parse(content) as Message;\n\n if (this.matchesFilter(message, filter)) {\n messages.push(message);\n }\n } catch {\n }\n }\n\n messages.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\n return filter.limit ? messages.slice(0, filter.limit) : messages;\n }\n\n async search(query: string, limit = 50): Promise<Message[]> {\n const messages = await this.list();\n const lowerQuery = query.toLowerCase();\n\n return messages\n .filter(m => {\n const subject = m.subject.toLowerCase();\n const bodyStr = typeof m.body === 'string' ? m.body.toLowerCase() : JSON.stringify(m.body).toLowerCase();\n return subject.includes(lowerQuery) || bodyStr.includes(lowerQuery);\n })\n .slice(0, limit);\n }\n\n async count(): Promise<number> {\n if (!existsSync(this.basePath)) return 0;\n\n const files = await readdir(this.basePath);\n return files.filter(f => f.endsWith('.json')).length;\n }\n\n async clear(): Promise<number> {\n if (!existsSync(this.basePath)) return 0;\n\n const files = await readdir(this.basePath);\n let deleted = 0;\n\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n\n try {\n await unlink(join(this.basePath, file));\n deleted++;\n } catch {\n }\n }\n\n return deleted;\n }\n\n async pruneOlderThan(days: number): Promise<number> {\n const messages = await this.list();\n const cutoff = Date.now() - days * 24 * 60 * 60 * 1000;\n let deleted = 0;\n\n for (const message of messages) {\n const createdAt = new Date(message.createdAt).getTime();\n if (createdAt < cutoff) {\n if (await this.delete(message.id)) {\n deleted++;\n }\n }\n }\n\n return deleted;\n }\n\n private getMessagePath(messageId: string): string {\n return join(this.basePath, `${messageId}.json`);\n }\n\n private matchesFilter(message: Message, filter: MessageFilter): boolean {\n if (filter.from && message.from !== filter.from) return false;\n if (filter.to && message.to !== filter.to) return false;\n if (filter.type && message.type !== filter.type) return false;\n if (filter.priority && message.priority !== filter.priority) return false;\n if (filter.threadId && message.threadId !== filter.threadId) return false;\n\n if (filter.since) {\n const since = new Date(filter.since).getTime();\n const created = new Date(message.createdAt).getTime();\n if (created < since) return false;\n }\n\n if (filter.until) {\n const until = new Date(filter.until).getTime();\n const created = new Date(message.createdAt).getTime();\n if (created > until) return false;\n }\n\n return true;\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type {\n Message,\n MessageCreateInput,\n MessageType,\n MessagePriority,\n} from '../types.js';\n\nexport class MessageBuilder {\n private message: Partial<Message>;\n\n constructor() {\n this.message = {\n id: randomUUID(),\n type: 'notification',\n priority: 'normal',\n status: 'unread',\n createdAt: new Date().toISOString(),\n };\n }\n\n static create(): MessageBuilder {\n return new MessageBuilder();\n }\n\n from(agentId: string): this {\n this.message.from = agentId;\n return this;\n }\n\n to(recipient: string): this {\n this.message.to = recipient;\n return this;\n }\n\n subject(subject: string): this {\n this.message.subject = subject;\n return this;\n }\n\n body(body: unknown): this {\n this.message.body = body;\n return this;\n }\n\n type(type: MessageType): this {\n this.message.type = type;\n return this;\n }\n\n priority(priority: MessagePriority): this {\n this.message.priority = priority;\n return this;\n }\n\n replyTo(messageId: string): this {\n this.message.replyTo = messageId;\n return this;\n }\n\n threadId(threadId: string): this {\n this.message.threadId = threadId;\n return this;\n }\n\n metadata(metadata: Record<string, unknown>): this {\n this.message.metadata = metadata;\n return this;\n }\n\n request(): this {\n this.message.type = 'request';\n return this;\n }\n\n response(): this {\n this.message.type = 'response';\n return this;\n }\n\n notification(): this {\n this.message.type = 'notification';\n return this;\n }\n\n update(): this {\n this.message.type = 'update';\n return this;\n }\n\n low(): this {\n this.message.priority = 'low';\n return this;\n }\n\n normal(): this {\n this.message.priority = 'normal';\n return this;\n }\n\n high(): this {\n this.message.priority = 'high';\n return this;\n }\n\n urgent(): this {\n this.message.priority = 'urgent';\n return this;\n }\n\n build(): Message {\n if (!this.message.from) {\n throw new Error('Message must have a \"from\" field');\n }\n if (!this.message.to) {\n throw new Error('Message must have a \"to\" field');\n }\n if (!this.message.subject) {\n throw new Error('Message must have a subject');\n }\n if (this.message.body === undefined) {\n throw new Error('Message must have a body');\n }\n\n return this.message as Message;\n }\n}\n\nexport function createMessage(from: string, input: MessageCreateInput): Message {\n const builder = MessageBuilder.create()\n .from(from)\n .to(input.to)\n .subject(input.subject)\n .body(input.body);\n\n if (input.type) builder.type(input.type);\n if (input.priority) builder.priority(input.priority);\n if (input.replyTo) builder.replyTo(input.replyTo);\n if (input.threadId) builder.threadId(input.threadId);\n if (input.metadata) builder.metadata(input.metadata);\n\n return builder.build();\n}\n\nexport function createReply(\n originalMessage: Message,\n from: string,\n body: unknown\n): Message {\n return MessageBuilder.create()\n .from(from)\n .to(originalMessage.from)\n .subject(`Re: ${originalMessage.subject}`)\n .body(body)\n .type('response')\n .priority(originalMessage.priority)\n .replyTo(originalMessage.id)\n .threadId(originalMessage.threadId ?? originalMessage.id)\n .build();\n}\n\nexport function createForward(\n originalMessage: Message,\n from: string,\n to: string,\n additionalBody?: unknown\n): Message {\n const forwardBody = {\n forwardedFrom: originalMessage.from,\n originalSubject: originalMessage.subject,\n originalBody: originalMessage.body,\n ...(additionalBody ? { note: additionalBody } : {}),\n };\n\n return MessageBuilder.create()\n .from(from)\n .to(to)\n .subject(`Fwd: ${originalMessage.subject}`)\n .body(forwardBody)\n .type(originalMessage.type)\n .priority(originalMessage.priority)\n .build();\n}\n","import type { Message, MessageDeliveryResult } from '../types.js';\nimport { InboxStorage } from '../storage/inbox.js';\nimport { SentStorage } from '../storage/sent.js';\nimport { ArchivedStorage } from '../storage/archived.js';\n\nexport interface RouterConfig {\n localAgentId: string;\n inboxStorage: InboxStorage;\n sentStorage: SentStorage;\n archivedStorage: ArchivedStorage;\n}\n\nexport interface RemoteDeliveryHandler {\n (message: Message, hostAddress: string): Promise<MessageDeliveryResult>;\n}\n\nexport class MessageRouter {\n private config: RouterConfig;\n private localAgents: Map<string, InboxStorage> = new Map();\n private remoteHandler?: RemoteDeliveryHandler;\n\n constructor(config: RouterConfig) {\n this.config = config;\n this.localAgents.set(config.localAgentId, config.inboxStorage);\n }\n\n registerLocalAgent(agentId: string, inbox: InboxStorage): void {\n this.localAgents.set(agentId, inbox);\n }\n\n unregisterLocalAgent(agentId: string): void {\n if (agentId !== this.config.localAgentId) {\n this.localAgents.delete(agentId);\n }\n }\n\n setRemoteHandler(handler: RemoteDeliveryHandler): void {\n this.remoteHandler = handler;\n }\n\n async route(message: Message): Promise<MessageDeliveryResult> {\n const recipient = this.parseRecipient(message.to);\n\n await this.config.sentStorage.save(message);\n\n if (recipient.isLocal) {\n return this.deliverLocal(message, recipient.agentId);\n }\n\n return this.deliverRemote(message, recipient.host!, recipient.agentId);\n }\n\n async deliverLocal(message: Message, agentId: string): Promise<MessageDeliveryResult> {\n const inbox = this.localAgents.get(agentId);\n\n if (!inbox) {\n return {\n messageId: message.id,\n delivered: false,\n error: `Agent ${agentId} not found locally`,\n via: 'local',\n };\n }\n\n try {\n await inbox.save(message);\n\n return {\n messageId: message.id,\n delivered: true,\n deliveredAt: new Date().toISOString(),\n via: 'local',\n };\n } catch (err: any) {\n return {\n messageId: message.id,\n delivered: false,\n error: err.message,\n via: 'local',\n };\n }\n }\n\n async deliverRemote(\n message: Message,\n hostAddress: string,\n _agentId: string\n ): Promise<MessageDeliveryResult> {\n if (!this.remoteHandler) {\n return {\n messageId: message.id,\n delivered: false,\n error: 'No remote delivery handler configured',\n via: 'remote',\n };\n }\n\n try {\n return await this.remoteHandler(message, hostAddress);\n } catch (err: any) {\n return {\n messageId: message.id,\n delivered: false,\n error: err.message,\n via: 'remote',\n };\n }\n }\n\n async archive(messageId: string): Promise<boolean> {\n const message = await this.config.inboxStorage.get(messageId);\n if (!message) return false;\n\n await this.config.archivedStorage.save(message);\n await this.config.inboxStorage.delete(messageId);\n\n return true;\n }\n\n async unarchive(messageId: string): Promise<boolean> {\n const message = await this.config.archivedStorage.get(messageId);\n if (!message) return false;\n\n message.status = 'read';\n await this.config.inboxStorage.save(message);\n await this.config.archivedStorage.delete(messageId);\n\n return true;\n }\n\n getLocalAgents(): string[] {\n return Array.from(this.localAgents.keys());\n }\n\n isLocalAgent(agentId: string): boolean {\n return this.localAgents.has(agentId);\n }\n\n private parseRecipient(to: string): {\n agentId: string;\n host?: string;\n isLocal: boolean;\n } {\n if (to.includes('@')) {\n const [agentId, host] = to.split('@');\n return { agentId, host, isLocal: false };\n }\n\n return {\n agentId: to,\n isLocal: this.localAgents.has(to),\n };\n }\n}\n","import type { Message, MessageDeliveryResult } from '../types.js';\nimport { InboxStorage } from '../storage/inbox.js';\n\nexport class LocalTransport {\n private agents: Map<string, InboxStorage> = new Map();\n\n register(agentId: string, inbox: InboxStorage): void {\n this.agents.set(agentId, inbox);\n }\n\n unregister(agentId: string): void {\n this.agents.delete(agentId);\n }\n\n async deliver(message: Message): Promise<MessageDeliveryResult> {\n const inbox = this.agents.get(message.to);\n\n if (!inbox) {\n return {\n messageId: message.id,\n delivered: false,\n error: `Agent ${message.to} not found locally`,\n via: 'local',\n };\n }\n\n try {\n await inbox.save(message);\n\n return {\n messageId: message.id,\n delivered: true,\n deliveredAt: new Date().toISOString(),\n via: 'local',\n };\n } catch (err: any) {\n return {\n messageId: message.id,\n delivered: false,\n error: err.message,\n via: 'local',\n };\n }\n }\n\n async broadcast(message: Message, excludeFrom = true): Promise<Map<string, MessageDeliveryResult>> {\n const results = new Map<string, MessageDeliveryResult>();\n\n for (const [agentId] of this.agents) {\n if (excludeFrom && agentId === message.from) continue;\n\n const targetMessage = { ...message, to: agentId };\n const result = await this.deliver(targetMessage);\n results.set(agentId, result);\n }\n\n return results;\n }\n\n getRegisteredAgents(): string[] {\n return Array.from(this.agents.keys());\n }\n\n isRegistered(agentId: string): boolean {\n return this.agents.has(agentId);\n }\n}\n\nlet globalTransport: LocalTransport | null = null;\n\nexport function getLocalTransport(): LocalTransport {\n if (!globalTransport) {\n globalTransport = new LocalTransport();\n }\n return globalTransport;\n}\n","import got from \"got\";\nimport type { Message, MessageDeliveryResult } from \"../types.js\";\n\nexport interface RemoteTransportOptions {\n timeout?: number;\n retries?: number;\n useHttps?: boolean;\n rejectUnauthorized?: boolean;\n}\n\nexport class RemoteTransport {\n private options: Required<RemoteTransportOptions>;\n\n constructor(options: RemoteTransportOptions = {}) {\n this.options = {\n timeout: options.timeout ?? 10000,\n retries: options.retries ?? 2,\n useHttps: options.useHttps ?? false,\n rejectUnauthorized: options.rejectUnauthorized ?? true,\n };\n }\n\n private getProtocol(hostAddress: string): string {\n const isLocalhost =\n hostAddress === \"localhost\" ||\n hostAddress === \"127.0.0.1\" ||\n hostAddress === \"::1\";\n return this.options.useHttps && !isLocalhost ? \"https\" : \"http\";\n }\n\n private formatHost(hostAddress: string): string {\n return hostAddress.includes(\":\") && !hostAddress.startsWith(\"[\")\n ? `[${hostAddress}]`\n : hostAddress;\n }\n\n async deliver(\n message: Message,\n hostAddress: string,\n hostPort: number,\n ): Promise<MessageDeliveryResult> {\n const url = `${this.getProtocol(hostAddress)}://${this.formatHost(hostAddress)}:${hostPort}/message`;\n\n try {\n const response = await got.post(url, {\n json: message,\n timeout: { request: this.options.timeout },\n retry: { limit: this.options.retries },\n throwHttpErrors: false,\n ...(this.options.useHttps && {\n https: { rejectUnauthorized: this.options.rejectUnauthorized },\n }),\n });\n\n if (response.statusCode === 200 || response.statusCode === 201) {\n return {\n messageId: message.id,\n delivered: true,\n deliveredAt: new Date().toISOString(),\n via: \"remote\",\n };\n }\n\n return {\n messageId: message.id,\n delivered: false,\n error: `HTTP ${response.statusCode}: ${response.body}`,\n via: \"remote\",\n };\n } catch (err: any) {\n return {\n messageId: message.id,\n delivered: false,\n error: err.message || \"Connection failed\",\n via: \"remote\",\n };\n }\n }\n\n async deliverToAgent(\n message: Message,\n agentAddress: string,\n ): Promise<MessageDeliveryResult> {\n const parts = agentAddress.split(\"@\");\n if (parts.length !== 2) {\n return {\n messageId: message.id,\n delivered: false,\n error: \"Invalid agent address format. Expected: agentId@host:port\",\n via: \"remote\",\n };\n }\n\n const [, hostPart] = parts;\n const lastColon = hostPart.lastIndexOf(\":\");\n const host = lastColon > 0 ? hostPart.slice(0, lastColon) : hostPart;\n const portStr = lastColon > 0 ? hostPart.slice(lastColon + 1) : undefined;\n const port = portStr ? parseInt(portStr, 10) : 9876;\n\n return this.deliver(message, host, port);\n }\n\n async broadcast(\n message: Message,\n hosts: Array<{ address: string; port: number }>,\n ): Promise<Map<string, MessageDeliveryResult>> {\n const results = new Map<string, MessageDeliveryResult>();\n\n await Promise.all(\n hosts.map(async ({ address, port }) => {\n const result = await this.deliver(message, address, port);\n results.set(`${address}:${port}`, result);\n }),\n );\n\n return results;\n }\n\n async ping(hostAddress: string, hostPort: number): Promise<boolean> {\n const url = `${this.getProtocol(hostAddress)}://${this.formatHost(hostAddress)}:${hostPort}/health`;\n\n try {\n const response = await got.get(url, {\n timeout: { request: 5000 },\n retry: { limit: 0 },\n throwHttpErrors: false,\n ...(this.options.useHttps && {\n https: { rejectUnauthorized: this.options.rejectUnauthorized },\n }),\n });\n\n return response.statusCode === 200;\n } catch {\n return false;\n }\n }\n}\n","export * from './types.js';\n\nexport { InboxStorage } from './storage/inbox.js';\nexport { SentStorage } from './storage/sent.js';\nexport { ArchivedStorage } from './storage/archived.js';\n\nexport {\n MessageBuilder,\n createMessage,\n createReply,\n createForward,\n} from './message/builder.js';\n\nexport {\n MessageRouter,\n type RouterConfig,\n type RemoteDeliveryHandler,\n} from './message/router.js';\n\nexport { LocalTransport, getLocalTransport } from './transport/local.js';\nexport { RemoteTransport, type RemoteTransportOptions } from './transport/remote.js';\n\nimport { InboxStorage } from './storage/inbox.js';\nimport { SentStorage } from './storage/sent.js';\nimport { ArchivedStorage } from './storage/archived.js';\nimport { MessageRouter } from './message/router.js';\nimport { createMessage as _createMessage, createReply as _createReply, createForward as _createForward } from './message/builder.js';\nimport type { MessageCreateInput, MessageDeliveryResult, Message, MessageFilter, InboxSummary } from './types.js';\n\nexport interface MessagingServiceConfig {\n agentId: string;\n storagePath?: string;\n}\n\nexport class MessagingService {\n private config: MessagingServiceConfig;\n private inbox: InboxStorage;\n private sent: SentStorage;\n private archived: ArchivedStorage;\n private router: MessageRouter;\n\n constructor(config: MessagingServiceConfig) {\n this.config = config;\n\n this.inbox = new InboxStorage(config.agentId, config.storagePath);\n this.sent = new SentStorage(config.agentId, config.storagePath);\n this.archived = new ArchivedStorage(config.agentId, config.storagePath);\n\n this.router = new MessageRouter({\n localAgentId: config.agentId,\n inboxStorage: this.inbox,\n sentStorage: this.sent,\n archivedStorage: this.archived,\n });\n }\n\n async initialize(): Promise<void> {\n await this.inbox.initialize();\n await this.sent.initialize();\n await this.archived.initialize();\n }\n\n async send(input: MessageCreateInput): Promise<MessageDeliveryResult> {\n const message = _createMessage(this.config.agentId, input);\n return this.router.route(message);\n }\n\n async reply(messageId: string, body: unknown): Promise<MessageDeliveryResult> {\n const original = await this.inbox.get(messageId);\n if (!original) {\n throw new Error(`Message ${messageId} not found`);\n }\n\n const reply = _createReply(original, this.config.agentId, body);\n return this.router.route(reply);\n }\n\n async forward(messageId: string, to: string, note?: unknown): Promise<MessageDeliveryResult> {\n const original = await this.inbox.get(messageId);\n if (!original) {\n throw new Error(`Message ${messageId} not found`);\n }\n\n const forwarded = _createForward(original, this.config.agentId, to, note);\n return this.router.route(forwarded);\n }\n\n async getInbox(filter?: MessageFilter): Promise<Message[]> {\n return this.inbox.list(filter);\n }\n\n async getSent(filter?: MessageFilter): Promise<Message[]> {\n return this.sent.list(filter);\n }\n\n async getArchived(filter?: MessageFilter): Promise<Message[]> {\n return this.archived.list(filter);\n }\n\n async getMessage(messageId: string): Promise<Message | null> {\n return this.inbox.get(messageId);\n }\n\n async markAsRead(messageId: string): Promise<Message | null> {\n return this.inbox.markAsRead(messageId);\n }\n\n async archive(messageId: string): Promise<boolean> {\n return this.router.archive(messageId);\n }\n\n async deleteMessage(messageId: string): Promise<boolean> {\n return this.inbox.delete(messageId);\n }\n\n async getInboxSummary(): Promise<InboxSummary> {\n return this.inbox.getSummary();\n }\n\n getRouter(): MessageRouter {\n return this.router;\n }\n}\n\nexport async function createMessagingService(\n agentId: string,\n storagePath?: string\n): Promise<MessagingService> {\n const service = new MessagingService({ agentId, storagePath });\n await service.initialize();\n return service;\n}\n"],"mappings":"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","names":["readFile","writeFile","mkdir","readdir","unlink","existsSync","join","dirname","homedir","readFile","writeFile","mkdir","readdir","unlink","existsSync","join","dirname","homedir"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skillkit/messaging",
3
- "version": "1.19.1",
3
+ "version": "1.20.0",
4
4
  "description": "Inter-agent messaging system for SkillKit",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -16,8 +16,8 @@
16
16
  ],
17
17
  "dependencies": {
18
18
  "got": "^14.2.0",
19
- "@skillkit/core": "1.19.1",
20
- "@skillkit/mesh": "1.19.1"
19
+ "@skillkit/core": "1.20.0",
20
+ "@skillkit/mesh": "1.20.0"
21
21
  },
22
22
  "devDependencies": {
23
23
  "tsup": "^8.0.1",