agent-inbox 0.0.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/CLAUDE.md +113 -0
  2. package/README.md +195 -1
  3. package/dist/federation/address.d.ts +24 -0
  4. package/dist/federation/address.d.ts.map +1 -0
  5. package/dist/federation/address.js +54 -0
  6. package/dist/federation/address.js.map +1 -0
  7. package/dist/federation/connection-manager.d.ts +118 -0
  8. package/dist/federation/connection-manager.d.ts.map +1 -0
  9. package/dist/federation/connection-manager.js +369 -0
  10. package/dist/federation/connection-manager.js.map +1 -0
  11. package/dist/federation/delivery-queue.d.ts +66 -0
  12. package/dist/federation/delivery-queue.d.ts.map +1 -0
  13. package/dist/federation/delivery-queue.js +199 -0
  14. package/dist/federation/delivery-queue.js.map +1 -0
  15. package/dist/federation/index.d.ts +7 -0
  16. package/dist/federation/index.d.ts.map +1 -0
  17. package/dist/federation/index.js +6 -0
  18. package/dist/federation/index.js.map +1 -0
  19. package/dist/federation/routing-engine.d.ts +74 -0
  20. package/dist/federation/routing-engine.d.ts.map +1 -0
  21. package/dist/federation/routing-engine.js +158 -0
  22. package/dist/federation/routing-engine.js.map +1 -0
  23. package/dist/federation/trust.d.ts +39 -0
  24. package/dist/federation/trust.d.ts.map +1 -0
  25. package/dist/federation/trust.js +64 -0
  26. package/dist/federation/trust.js.map +1 -0
  27. package/dist/index.d.ts +60 -2
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +217 -18
  30. package/dist/index.js.map +1 -1
  31. package/dist/ipc/ipc-server.d.ts +21 -0
  32. package/dist/ipc/ipc-server.d.ts.map +1 -0
  33. package/dist/ipc/ipc-server.js +173 -0
  34. package/dist/ipc/ipc-server.js.map +1 -0
  35. package/dist/jsonrpc/mail-server.d.ts +45 -0
  36. package/dist/jsonrpc/mail-server.d.ts.map +1 -0
  37. package/dist/jsonrpc/mail-server.js +284 -0
  38. package/dist/jsonrpc/mail-server.js.map +1 -0
  39. package/dist/map/map-client.d.ts +91 -0
  40. package/dist/map/map-client.d.ts.map +1 -0
  41. package/dist/map/map-client.js +202 -0
  42. package/dist/map/map-client.js.map +1 -0
  43. package/dist/mcp/mcp-server.d.ts +23 -0
  44. package/dist/mcp/mcp-server.d.ts.map +1 -0
  45. package/dist/mcp/mcp-server.js +226 -0
  46. package/dist/mcp/mcp-server.js.map +1 -0
  47. package/dist/push/notifier.d.ts +49 -0
  48. package/dist/push/notifier.d.ts.map +1 -0
  49. package/dist/push/notifier.js +150 -0
  50. package/dist/push/notifier.js.map +1 -0
  51. package/dist/registry/warm-registry.d.ts +63 -0
  52. package/dist/registry/warm-registry.d.ts.map +1 -0
  53. package/dist/registry/warm-registry.js +173 -0
  54. package/dist/registry/warm-registry.js.map +1 -0
  55. package/dist/router/message-router.d.ts +44 -0
  56. package/dist/router/message-router.d.ts.map +1 -0
  57. package/dist/router/message-router.js +137 -0
  58. package/dist/router/message-router.js.map +1 -0
  59. package/dist/storage/interface.d.ts +31 -0
  60. package/dist/storage/interface.d.ts.map +1 -0
  61. package/dist/storage/interface.js +2 -0
  62. package/dist/storage/interface.js.map +1 -0
  63. package/dist/storage/memory.d.ts +28 -0
  64. package/dist/storage/memory.d.ts.map +1 -0
  65. package/dist/storage/memory.js +118 -0
  66. package/dist/storage/memory.js.map +1 -0
  67. package/dist/storage/sqlite.d.ts +35 -0
  68. package/dist/storage/sqlite.d.ts.map +1 -0
  69. package/dist/storage/sqlite.js +445 -0
  70. package/dist/storage/sqlite.js.map +1 -0
  71. package/dist/traceability/traceability.d.ts +29 -0
  72. package/dist/traceability/traceability.d.ts.map +1 -0
  73. package/dist/traceability/traceability.js +150 -0
  74. package/dist/traceability/traceability.js.map +1 -0
  75. package/dist/types.d.ts +261 -0
  76. package/dist/types.d.ts.map +1 -0
  77. package/dist/types.js +3 -0
  78. package/dist/types.js.map +1 -0
  79. package/docs/DESIGN.md +1156 -0
  80. package/docs/PLAN.md +545 -0
  81. package/hooks/inbox-hook.mjs +119 -0
  82. package/hooks/register-hook.mjs +69 -0
  83. package/package.json +33 -25
  84. package/rules/agent-inbox.md +78 -0
  85. package/src/federation/address.ts +61 -0
  86. package/src/federation/connection-manager.ts +458 -0
  87. package/src/federation/delivery-queue.ts +222 -0
  88. package/src/federation/index.ts +6 -0
  89. package/src/federation/routing-engine.ts +188 -0
  90. package/src/federation/trust.ts +71 -0
  91. package/src/index.ts +299 -0
  92. package/src/ipc/ipc-server.ts +207 -0
  93. package/src/jsonrpc/mail-server.ts +356 -0
  94. package/src/map/map-client.ts +260 -0
  95. package/src/mcp/mcp-server.ts +272 -0
  96. package/src/push/notifier.ts +192 -0
  97. package/src/registry/warm-registry.ts +210 -0
  98. package/src/router/message-router.ts +175 -0
  99. package/src/storage/interface.ts +48 -0
  100. package/src/storage/memory.ts +145 -0
  101. package/src/storage/sqlite.ts +645 -0
  102. package/src/traceability/traceability.ts +183 -0
  103. package/src/types.ts +297 -0
  104. package/test/federation/address.test.ts +101 -0
  105. package/test/federation/connection-manager.test.ts +546 -0
  106. package/test/federation/delivery-queue.test.ts +159 -0
  107. package/test/federation/integration.test.ts +823 -0
  108. package/test/federation/routing-engine.test.ts +117 -0
  109. package/test/federation/sdk-integration.test.ts +748 -0
  110. package/test/federation/trust.test.ts +89 -0
  111. package/test/ipc-jsonrpc.test.ts +113 -0
  112. package/test/ipc-server.test.ts +197 -0
  113. package/test/mail-server.test.ts +208 -0
  114. package/test/map-client.test.ts +408 -0
  115. package/test/message-router.test.ts +184 -0
  116. package/test/push-notifier.test.ts +139 -0
  117. package/test/registry/warm-registry.test.ts +171 -0
  118. package/test/sqlite-storage.test.ts +243 -0
  119. package/test/storage.test.ts +196 -0
  120. package/test/traceability.test.ts +123 -0
  121. package/tsconfig.json +20 -0
  122. package/tsup.config.ts +10 -0
  123. package/vitest.config.ts +8 -0
  124. package/dist/index.d.mts +0 -2
  125. package/dist/index.mjs +0 -1
  126. package/dist/index.mjs.map +0 -1
@@ -0,0 +1,173 @@
1
+ const DEFAULT_CONFIG = {
2
+ gracePeriodMs: 60_000,
3
+ retainExpiredMs: 3_600_000,
4
+ requeueOnReconnect: true,
5
+ };
6
+ /**
7
+ * Warm agent registry with active/away/expired lifecycle.
8
+ *
9
+ * Wraps the storage layer to add TTL-based status management.
10
+ * Agents transition: active → away (on disconnect) → expired (after grace period).
11
+ */
12
+ export class WarmRegistry {
13
+ storage;
14
+ events;
15
+ entries = new Map();
16
+ config;
17
+ constructor(storage, events, config) {
18
+ this.storage = storage;
19
+ this.events = events;
20
+ this.config = { ...DEFAULT_CONFIG, ...config };
21
+ }
22
+ /**
23
+ * Register an agent. First-wins — rejects if ID is taken by an active/away agent.
24
+ * Returns true if registered, false if ID conflict.
25
+ */
26
+ register(agent) {
27
+ const existing = this.entries.get(agent.agent_id);
28
+ if (existing && (existing.warmStatus === "active" || existing.warmStatus === "away")) {
29
+ return false; // ID conflict
30
+ }
31
+ // Clear any existing timers
32
+ if (existing) {
33
+ this.clearTimers(existing);
34
+ }
35
+ this.entries.set(agent.agent_id, {
36
+ agentId: agent.agent_id,
37
+ warmStatus: "active",
38
+ });
39
+ agent.status = "active";
40
+ this.storage.putAgent(agent);
41
+ this.events.emit("registry.registered", agent.agent_id);
42
+ return true;
43
+ }
44
+ /**
45
+ * Mark an agent as disconnected. Starts grace period timer.
46
+ */
47
+ disconnect(agentId) {
48
+ const entry = this.entries.get(agentId);
49
+ if (!entry || entry.warmStatus !== "active")
50
+ return false;
51
+ entry.warmStatus = "away";
52
+ entry.disconnectedAt = new Date().toISOString();
53
+ // Start grace period timer
54
+ entry.graceTimer = setTimeout(() => {
55
+ this.expire(agentId);
56
+ }, this.config.gracePeriodMs);
57
+ // Update storage
58
+ const agent = this.storage.getAgent(agentId);
59
+ if (agent) {
60
+ agent.status = "idle"; // Map "away" to "idle" in the existing AgentStatus type
61
+ this.storage.putAgent(agent);
62
+ }
63
+ this.events.emit("registry.disconnected", agentId);
64
+ return true;
65
+ }
66
+ /**
67
+ * Reconnect a previously disconnected agent.
68
+ * Cancels grace period and restores active status.
69
+ */
70
+ reconnect(agentId) {
71
+ const entry = this.entries.get(agentId);
72
+ if (!entry)
73
+ return false;
74
+ if (entry.warmStatus !== "away")
75
+ return false;
76
+ this.clearTimers(entry);
77
+ entry.warmStatus = "active";
78
+ entry.disconnectedAt = undefined;
79
+ const agent = this.storage.getAgent(agentId);
80
+ if (agent) {
81
+ agent.status = "active";
82
+ agent.last_active_at = new Date().toISOString();
83
+ this.storage.putAgent(agent);
84
+ }
85
+ this.events.emit("registry.reconnected", agentId);
86
+ return true;
87
+ }
88
+ /**
89
+ * Transition agent to expired. Not routable, but retained for audit.
90
+ */
91
+ expire(agentId) {
92
+ const entry = this.entries.get(agentId);
93
+ if (!entry)
94
+ return;
95
+ this.clearTimers(entry);
96
+ entry.warmStatus = "expired";
97
+ const agent = this.storage.getAgent(agentId);
98
+ if (agent) {
99
+ agent.status = "offline";
100
+ this.storage.putAgent(agent);
101
+ }
102
+ // Schedule cleanup after retainExpiredMs
103
+ entry.expireTimer = setTimeout(() => {
104
+ this.remove(agentId);
105
+ }, this.config.retainExpiredMs);
106
+ this.events.emit("registry.expired", agentId);
107
+ }
108
+ /**
109
+ * Fully remove an agent from the registry.
110
+ */
111
+ remove(agentId) {
112
+ const entry = this.entries.get(agentId);
113
+ if (entry) {
114
+ this.clearTimers(entry);
115
+ this.entries.delete(agentId);
116
+ }
117
+ this.storage.removeAgent(agentId);
118
+ this.events.emit("registry.removed", agentId);
119
+ }
120
+ /**
121
+ * Check if an agent is routable (active or away).
122
+ */
123
+ isRoutable(agentId) {
124
+ const entry = this.entries.get(agentId);
125
+ if (!entry)
126
+ return false;
127
+ return entry.warmStatus === "active" || entry.warmStatus === "away";
128
+ }
129
+ /**
130
+ * Get the warm status of an agent.
131
+ */
132
+ getStatus(agentId) {
133
+ const entry = this.entries.get(agentId);
134
+ return entry?.warmStatus ?? "unknown";
135
+ }
136
+ /**
137
+ * List all entries with their warm status.
138
+ */
139
+ listEntries() {
140
+ return Array.from(this.entries.values()).map((e) => ({
141
+ agentId: e.agentId,
142
+ warmStatus: e.warmStatus,
143
+ }));
144
+ }
145
+ /**
146
+ * List all routable agent IDs.
147
+ */
148
+ listRoutable() {
149
+ return Array.from(this.entries.values())
150
+ .filter((e) => e.warmStatus === "active" || e.warmStatus === "away")
151
+ .map((e) => e.agentId);
152
+ }
153
+ /**
154
+ * Clean up all timers. Call on shutdown.
155
+ */
156
+ destroy() {
157
+ for (const entry of this.entries.values()) {
158
+ this.clearTimers(entry);
159
+ }
160
+ this.entries.clear();
161
+ }
162
+ clearTimers(entry) {
163
+ if (entry.graceTimer) {
164
+ clearTimeout(entry.graceTimer);
165
+ entry.graceTimer = undefined;
166
+ }
167
+ if (entry.expireTimer) {
168
+ clearTimeout(entry.expireTimer);
169
+ entry.expireTimer = undefined;
170
+ }
171
+ }
172
+ }
173
+ //# sourceMappingURL=warm-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warm-registry.js","sourceRoot":"","sources":["../../src/registry/warm-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { EventEmitter } from "node:events";
2
+ import type { Message, MessageContent, Recipient, RecipientKind, Importance } from "../types.js";
3
+ import type { Storage } from "../storage/interface.js";
4
+ import type { ConnectionManager } from "../federation/connection-manager.js";
5
+ export interface SendOptions {
6
+ from: string;
7
+ to: string | string[] | {
8
+ agent_id: string;
9
+ kind?: RecipientKind;
10
+ }[];
11
+ payload: unknown;
12
+ scope?: string;
13
+ threadTag?: string;
14
+ inReplyTo?: string;
15
+ importance?: Importance;
16
+ conversationId?: string;
17
+ subject?: string;
18
+ metadata?: Record<string, unknown>;
19
+ }
20
+ export declare class MessageRouter {
21
+ private storage;
22
+ private events;
23
+ private defaultScope;
24
+ private federation;
25
+ constructor(storage: Storage, events: EventEmitter, defaultScope?: string);
26
+ /**
27
+ * Attach a federation connection manager for cross-system routing.
28
+ */
29
+ setFederation(federation: ConnectionManager): void;
30
+ routeMessage(opts: SendOptions): Promise<Message>;
31
+ markRead(messageId: string, agentId: string): boolean;
32
+ markAcknowledged(messageId: string, agentId: string): boolean;
33
+ resolveRecipients(to: string | string[] | {
34
+ agent_id: string;
35
+ kind?: RecipientKind;
36
+ }[]): Recipient[];
37
+ isLocal(agentId: string): boolean;
38
+ /**
39
+ * Get the federation connection manager (if attached).
40
+ */
41
+ getFederation(): ConnectionManager | null;
42
+ }
43
+ export declare function normalizeContent(payload: unknown): MessageContent;
44
+ //# sourceMappingURL=message-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-router.d.ts","sourceRoot":"","sources":["../../src/router/message-router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,SAAS,EACT,aAAa,EACb,UAAU,EACX,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAG7E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,aAAa,CAAA;KAAE,EAAE,CAAC;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,qBAAa,aAAa;IAItB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;IALtB,OAAO,CAAC,UAAU,CAAkC;gBAG1C,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,YAAY,EACpB,YAAY,GAAE,MAAkB;IAG1C;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI;IAI5C,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAmEvD,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAUrD,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAU7D,iBAAiB,CACf,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,aAAa,CAAA;KAAE,EAAE,GACnE,SAAS,EAAE;IAed,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOjC;;OAEG;IACH,aAAa,IAAI,iBAAiB,GAAG,IAAI;CAG1C;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAajE"}
@@ -0,0 +1,137 @@
1
+ import { ulid } from "ulid";
2
+ import { parseAddress, isRemoteAddress } from "../federation/address.js";
3
+ export class MessageRouter {
4
+ storage;
5
+ events;
6
+ defaultScope;
7
+ federation = null;
8
+ constructor(storage, events, defaultScope = "default") {
9
+ this.storage = storage;
10
+ this.events = events;
11
+ this.defaultScope = defaultScope;
12
+ }
13
+ /**
14
+ * Attach a federation connection manager for cross-system routing.
15
+ */
16
+ setFederation(federation) {
17
+ this.federation = federation;
18
+ }
19
+ async routeMessage(opts) {
20
+ const recipients = this.resolveRecipients(opts.to);
21
+ const content = normalizeContent(opts.payload);
22
+ const scope = opts.scope ?? this.defaultScope;
23
+ const now = new Date().toISOString();
24
+ // If replying, inherit thread_tag and scope from the parent message
25
+ let threadTag = opts.threadTag;
26
+ let conversationId = opts.conversationId;
27
+ if (opts.inReplyTo) {
28
+ const parent = this.storage.getMessage(opts.inReplyTo);
29
+ if (parent) {
30
+ threadTag = threadTag ?? parent.thread_tag;
31
+ conversationId = conversationId ?? parent.conversation_id;
32
+ }
33
+ }
34
+ const message = {
35
+ id: ulid(),
36
+ scope,
37
+ sender_id: opts.from,
38
+ recipients,
39
+ subject: opts.subject,
40
+ content,
41
+ thread_tag: threadTag,
42
+ in_reply_to: opts.inReplyTo,
43
+ conversation_id: conversationId,
44
+ importance: opts.importance ?? "normal",
45
+ metadata: opts.metadata ?? {},
46
+ created_at: now,
47
+ };
48
+ // Mark local recipients as delivered; route remote ones via federation
49
+ for (const r of message.recipients) {
50
+ const addr = parseAddress(r.agent_id);
51
+ if (!isRemoteAddress(addr) && this.isLocal(r.agent_id)) {
52
+ r.delivered_at = now;
53
+ }
54
+ }
55
+ this.storage.putMessage(message);
56
+ // Update sender's last_active_at
57
+ const sender = this.storage.getAgent(opts.from);
58
+ if (sender) {
59
+ sender.last_active_at = now;
60
+ this.storage.putAgent(sender);
61
+ }
62
+ this.events.emit("message.created", message);
63
+ // Route remote recipients via federation
64
+ if (this.federation) {
65
+ const hasRemote = message.recipients.some((r) => isRemoteAddress(parseAddress(r.agent_id)));
66
+ if (hasRemote) {
67
+ // Fire-and-forget federation routing (results tracked via events)
68
+ this.federation.route(message).catch(() => {
69
+ // Federation routing failures are handled by the delivery queue
70
+ });
71
+ }
72
+ }
73
+ return message;
74
+ }
75
+ markRead(messageId, agentId) {
76
+ const msg = this.storage.getMessage(messageId);
77
+ if (!msg)
78
+ return false;
79
+ const recipient = msg.recipients.find((r) => r.agent_id === agentId);
80
+ if (!recipient)
81
+ return false;
82
+ recipient.read_at = new Date().toISOString();
83
+ this.storage.putMessage(msg);
84
+ return true;
85
+ }
86
+ markAcknowledged(messageId, agentId) {
87
+ const msg = this.storage.getMessage(messageId);
88
+ if (!msg)
89
+ return false;
90
+ const recipient = msg.recipients.find((r) => r.agent_id === agentId);
91
+ if (!recipient)
92
+ return false;
93
+ recipient.ack_at = new Date().toISOString();
94
+ this.storage.putMessage(msg);
95
+ return true;
96
+ }
97
+ resolveRecipients(to) {
98
+ if (typeof to === "string") {
99
+ return [{ agent_id: to, kind: "to" }];
100
+ }
101
+ if (Array.isArray(to)) {
102
+ return to.map((item) => {
103
+ if (typeof item === "string") {
104
+ return { agent_id: item, kind: "to" };
105
+ }
106
+ return { agent_id: item.agent_id, kind: item.kind ?? "to" };
107
+ });
108
+ }
109
+ return [{ agent_id: String(to), kind: "to" }];
110
+ }
111
+ isLocal(agentId) {
112
+ // Remote addresses are never local
113
+ const addr = parseAddress(agentId);
114
+ if (isRemoteAddress(addr))
115
+ return false;
116
+ return this.storage.getAgent(agentId) !== undefined;
117
+ }
118
+ /**
119
+ * Get the federation connection manager (if attached).
120
+ */
121
+ getFederation() {
122
+ return this.federation;
123
+ }
124
+ }
125
+ export function normalizeContent(payload) {
126
+ if (typeof payload === "string") {
127
+ return { type: "text", text: payload };
128
+ }
129
+ if (payload !== null &&
130
+ typeof payload === "object" &&
131
+ "type" in payload &&
132
+ typeof payload.type === "string") {
133
+ return payload;
134
+ }
135
+ return { type: "data", data: payload };
136
+ }
137
+ //# sourceMappingURL=message-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-router.js","sourceRoot":"","sources":["../../src/router/message-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { Agent, Message, Conversation, Turn, Thread } from "../types.js";
2
+ export interface InboxQuery {
3
+ unreadOnly?: boolean;
4
+ limit?: number;
5
+ since?: string;
6
+ }
7
+ export interface ThreadQuery {
8
+ threadTag: string;
9
+ scope: string;
10
+ }
11
+ export interface Storage {
12
+ getAgent(agentId: string): Agent | undefined;
13
+ putAgent(agent: Agent): void;
14
+ listAgents(scope?: string): Agent[];
15
+ removeAgent(agentId: string): boolean;
16
+ getMessage(id: string): Message | undefined;
17
+ putMessage(message: Message): Message;
18
+ getInbox(agentId: string, opts?: InboxQuery): Message[];
19
+ getThread(query: ThreadQuery): Message[];
20
+ getSentMessages(agentId: string, limit?: number): Message[];
21
+ searchMessages(query: string, scope?: string): Message[];
22
+ getConversation(id: string): Conversation | undefined;
23
+ putConversation(conversation: Conversation): Conversation;
24
+ listConversations(scope?: string): Conversation[];
25
+ addTurn(turn: Turn): void;
26
+ getTurns(conversationId: string): Turn[];
27
+ getThread2(id: string): Thread | undefined;
28
+ putThread(thread: Thread): Thread;
29
+ getThreadsByConversation(conversationId: string): Thread[];
30
+ }
31
+ //# sourceMappingURL=interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/storage/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,OAAO,EACP,YAAY,EACZ,IAAI,EACJ,MAAM,EACP,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IAEtB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,CAAC;IACpC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAGtC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAC5C,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,EAAE,CAAC;IACxD,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,EAAE,CAAC;IACzC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE,CAAC;IAC5D,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE,CAAC;IAGzD,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAAC;IACtD,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,YAAY,CAAC;IAC1D,iBAAiB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;IAGlD,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC;IAGzC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC3C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,wBAAwB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC5D"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/storage/interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import type { Agent, Message, Conversation, Turn, Thread } from "../types.js";
2
+ import type { Storage, InboxQuery, ThreadQuery } from "./interface.js";
3
+ export declare class InMemoryStorage implements Storage {
4
+ private agents;
5
+ private messages;
6
+ private conversations;
7
+ private turns;
8
+ private threads;
9
+ getAgent(agentId: string): Agent | undefined;
10
+ putAgent(agent: Agent): void;
11
+ listAgents(scope?: string): Agent[];
12
+ removeAgent(agentId: string): boolean;
13
+ getMessage(id: string): Message | undefined;
14
+ putMessage(message: Message): Message;
15
+ getInbox(agentId: string, opts?: InboxQuery): Message[];
16
+ getThread(query: ThreadQuery): Message[];
17
+ getSentMessages(agentId: string, limit?: number): Message[];
18
+ searchMessages(query: string, scope?: string): Message[];
19
+ getConversation(id: string): Conversation | undefined;
20
+ putConversation(conversation: Conversation): Conversation;
21
+ listConversations(scope?: string): Conversation[];
22
+ addTurn(turn: Turn): void;
23
+ getTurns(conversationId: string): Turn[];
24
+ getThread2(id: string): Thread | undefined;
25
+ putThread(thread: Thread): Thread;
26
+ getThreadsByConversation(conversationId: string): Thread[];
27
+ }
28
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,OAAO,EACP,YAAY,EACZ,IAAI,EACJ,MAAM,EACP,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEvE,qBAAa,eAAgB,YAAW,OAAO;IAC7C,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,OAAO,CAA6B;IAI5C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAI5C,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAI5B,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE;IAMnC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAMrC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI3C,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO;IAKrC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,EAAE;IAcvD,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,EAAE;IAUxC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE;IAU3D,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE;IAoBxD,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIrD,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,YAAY;IAKzD,iBAAiB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE;IAQjD,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAIzB,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,EAAE;IAQxC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI1C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAKjC,wBAAwB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE;CAK3D"}
@@ -0,0 +1,118 @@
1
+ export class InMemoryStorage {
2
+ agents = new Map();
3
+ messages = new Map();
4
+ conversations = new Map();
5
+ turns = [];
6
+ threads = new Map();
7
+ // --- Agents ---
8
+ getAgent(agentId) {
9
+ return this.agents.get(agentId);
10
+ }
11
+ putAgent(agent) {
12
+ this.agents.set(agent.agent_id, agent);
13
+ }
14
+ listAgents(scope) {
15
+ const all = Array.from(this.agents.values());
16
+ if (!scope)
17
+ return all;
18
+ return all.filter((a) => a.scope === scope);
19
+ }
20
+ removeAgent(agentId) {
21
+ return this.agents.delete(agentId);
22
+ }
23
+ // --- Messages ---
24
+ getMessage(id) {
25
+ return this.messages.get(id);
26
+ }
27
+ putMessage(message) {
28
+ this.messages.set(message.id, message);
29
+ return message;
30
+ }
31
+ getInbox(agentId, opts) {
32
+ const results = [];
33
+ for (const msg of this.messages.values()) {
34
+ const recipient = msg.recipients.find((r) => r.agent_id === agentId);
35
+ if (!recipient)
36
+ continue;
37
+ if (opts?.unreadOnly && recipient.read_at)
38
+ continue;
39
+ if (opts?.since && msg.created_at < opts.since)
40
+ continue;
41
+ results.push(msg);
42
+ }
43
+ results.sort((a, b) => a.created_at.localeCompare(b.created_at));
44
+ if (opts?.limit)
45
+ return results.slice(0, opts.limit);
46
+ return results;
47
+ }
48
+ getThread(query) {
49
+ const results = [];
50
+ for (const msg of this.messages.values()) {
51
+ if (msg.thread_tag === query.threadTag && msg.scope === query.scope) {
52
+ results.push(msg);
53
+ }
54
+ }
55
+ return results.sort((a, b) => a.created_at.localeCompare(b.created_at));
56
+ }
57
+ getSentMessages(agentId, limit) {
58
+ const results = [];
59
+ for (const msg of this.messages.values()) {
60
+ if (msg.sender_id === agentId)
61
+ results.push(msg);
62
+ }
63
+ results.sort((a, b) => a.created_at.localeCompare(b.created_at));
64
+ if (limit)
65
+ return results.slice(0, limit);
66
+ return results;
67
+ }
68
+ searchMessages(query, scope) {
69
+ const lower = query.toLowerCase();
70
+ const results = [];
71
+ for (const msg of this.messages.values()) {
72
+ if (scope && msg.scope !== scope)
73
+ continue;
74
+ const text = msg.content.type === "text" ? msg.content.text : "";
75
+ const subject = msg.subject ?? "";
76
+ if (text.toLowerCase().includes(lower) ||
77
+ subject.toLowerCase().includes(lower)) {
78
+ results.push(msg);
79
+ }
80
+ }
81
+ return results.sort((a, b) => a.created_at.localeCompare(b.created_at));
82
+ }
83
+ // --- Conversations ---
84
+ getConversation(id) {
85
+ return this.conversations.get(id);
86
+ }
87
+ putConversation(conversation) {
88
+ this.conversations.set(conversation.id, conversation);
89
+ return conversation;
90
+ }
91
+ listConversations(scope) {
92
+ const all = Array.from(this.conversations.values());
93
+ if (!scope)
94
+ return all;
95
+ return all.filter((c) => c.scope === scope);
96
+ }
97
+ // --- Turns ---
98
+ addTurn(turn) {
99
+ this.turns.push(turn);
100
+ }
101
+ getTurns(conversationId) {
102
+ return this.turns
103
+ .filter((t) => t.conversation_id === conversationId)
104
+ .sort((a, b) => a.created_at.localeCompare(b.created_at));
105
+ }
106
+ // --- Threads ---
107
+ getThread2(id) {
108
+ return this.threads.get(id);
109
+ }
110
+ putThread(thread) {
111
+ this.threads.set(thread.id, thread);
112
+ return thread;
113
+ }
114
+ getThreadsByConversation(conversationId) {
115
+ return Array.from(this.threads.values()).filter((t) => t.conversation_id === conversationId);
116
+ }
117
+ }
118
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { Agent, Message, Conversation, Turn, Thread } from "../types.js";
2
+ import type { Storage, InboxQuery, ThreadQuery } from "./interface.js";
3
+ export interface SqliteStorageOptions {
4
+ path: string;
5
+ }
6
+ export declare class SqliteStorage implements Storage {
7
+ private db;
8
+ constructor(opts: SqliteStorageOptions);
9
+ private migrate;
10
+ getAgent(agentId: string): Agent | undefined;
11
+ putAgent(agent: Agent): void;
12
+ listAgents(scope?: string): Agent[];
13
+ removeAgent(agentId: string): boolean;
14
+ getMessage(id: string): Message | undefined;
15
+ putMessage(message: Message): Message;
16
+ getInbox(agentId: string, opts?: InboxQuery): Message[];
17
+ getThread(query: ThreadQuery): Message[];
18
+ getSentMessages(agentId: string, limit?: number): Message[];
19
+ searchMessages(query: string, scope?: string): Message[];
20
+ private searchMessagesLike;
21
+ getConversation(id: string): Conversation | undefined;
22
+ putConversation(conversation: Conversation): Conversation;
23
+ listConversations(scope?: string): Conversation[];
24
+ addTurn(turn: Turn): void;
25
+ getTurns(conversationId: string): Turn[];
26
+ getThread2(id: string): Thread | undefined;
27
+ putThread(thread: Thread): Thread;
28
+ getThreadsByConversation(conversationId: string): Thread[];
29
+ private getRecipients;
30
+ private getParticipants;
31
+ private rowToMessage;
32
+ private rowToConversation;
33
+ close(): void;
34
+ }
35
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/storage/sqlite.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,KAAK,EACL,OAAO,EACP,YAAY,EACZ,IAAI,EACJ,MAAM,EAIP,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEvE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,aAAc,YAAW,OAAO;IAC3C,OAAO,CAAC,EAAE,CAAoB;gBAElB,IAAI,EAAE,oBAAoB;IAOtC,OAAO,CAAC,OAAO;IAsIf,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAO5C,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAoB5B,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE;IASnC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IASrC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAQ3C,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO;IA6CrC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,EAAE;IAyBvD,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,EAAE;IASxC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE;IAW3D,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE;IA+BxD,OAAO,CAAC,kBAAkB;IAkB1B,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAQrD,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,YAAY;IA+BzD,iBAAiB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE;IAgBjD,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAoBzB,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,EAAE;IAWxC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAO1C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAkBjC,wBAAwB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE;IAS1D,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,iBAAiB;IAazB,KAAK,IAAI,IAAI;CAGd"}