agent-mailbox-core 1.0.0 → 1.0.1
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/database.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +12 -0
- package/dist/plugin.js +10 -0
- package/dist/plugin.js.map +79 -0
- package/package.json +2 -3
package/dist/database.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,QAAQ,CA+G7D"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// src/database.ts
|
|
3
3
|
import { Database } from "bun:sqlite";
|
|
4
|
+
import { mkdirSync, existsSync } from "fs";
|
|
5
|
+
import { dirname } from "path";
|
|
4
6
|
var SCHEMA_VERSION = 1;
|
|
5
7
|
function initDatabase(config) {
|
|
8
|
+
if (config.dbPath !== ":memory:") {
|
|
9
|
+
const dir = dirname(config.dbPath);
|
|
10
|
+
if (!existsSync(dir)) {
|
|
11
|
+
mkdirSync(dir, { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
}
|
|
6
14
|
const db = new Database(config.dbPath);
|
|
7
15
|
if (config.walMode) {
|
|
8
16
|
db.exec("PRAGMA journal_mode=WAL");
|
|
@@ -554,3 +562,5 @@ export {
|
|
|
554
562
|
formatAgents,
|
|
555
563
|
Mailbox
|
|
556
564
|
};
|
|
565
|
+
|
|
566
|
+
//# debugId=EDBAF90F8B44502C64756E2164756E21
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/database.ts", "../src/mailbox.ts", "../src/format.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Database initialization and schema management for Agent Mailbox\n */\n\nimport { Database } from \"bun:sqlite\";\nimport { mkdirSync, existsSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { ResolvedConfig } from \"./types.js\";\n\nconst SCHEMA_VERSION = 1;\n\nexport function initDatabase(config: ResolvedConfig): Database {\n // Ensure parent directory exists for non-memory databases\n if (config.dbPath !== \":memory:\") {\n const dir = dirname(config.dbPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n const db = new Database(config.dbPath);\n\n if (config.walMode) {\n db.exec(\"PRAGMA journal_mode=WAL\");\n db.exec(\"PRAGMA synchronous=NORMAL\");\n }\n db.exec(\"PRAGMA foreign_keys=ON\");\n\n db.exec(`\n CREATE TABLE IF NOT EXISTS schema_version (\n version INTEGER NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS messages (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n from_agent TEXT NOT NULL,\n to_agent TEXT NOT NULL,\n subject TEXT NOT NULL,\n body TEXT NOT NULL,\n thread_id TEXT NOT NULL,\n priority TEXT NOT NULL DEFAULT 'normal' CHECK (priority IN ('high', 'normal', 'low')),\n status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'delivered', 'read', 'acked', 'expired', 'dead')),\n ttl_seconds INTEGER NOT NULL DEFAULT 86400,\n idempotency_key TEXT,\n trace_id TEXT,\n receive_count INTEGER NOT NULL DEFAULT 0,\n visible_after TEXT,\n session_id TEXT NOT NULL DEFAULT '',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n read_at TEXT,\n ack_at TEXT,\n expires_at TEXT NOT NULL DEFAULT (datetime('now', '+86400 seconds'))\n );\n\n CREATE INDEX IF NOT EXISTS idx_messages_to_agent_status ON messages(to_agent, status);\n CREATE INDEX IF NOT EXISTS idx_messages_thread ON messages(thread_id);\n CREATE INDEX IF NOT EXISTS idx_messages_created ON messages(created_at);\n CREATE INDEX IF NOT EXISTS idx_messages_expires ON messages(expires_at);\n CREATE INDEX IF NOT EXISTS idx_messages_visible ON messages(visible_after);\n CREATE UNIQUE INDEX IF NOT EXISTS idx_messages_idempotency ON messages(idempotency_key) WHERE idempotency_key IS NOT NULL;\n\n CREATE TABLE IF NOT EXISTS threads (\n id TEXT PRIMARY KEY,\n subject TEXT NOT NULL,\n participants TEXT NOT NULL DEFAULT '[]',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n last_message_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n\n CREATE TABLE IF NOT EXISTS dead_letters (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n original_message_id INTEGER NOT NULL,\n from_agent TEXT NOT NULL,\n to_agent TEXT NOT NULL,\n subject TEXT NOT NULL,\n body TEXT NOT NULL,\n thread_id TEXT NOT NULL,\n reason TEXT NOT NULL,\n moved_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n\n CREATE TABLE IF NOT EXISTS rate_limits (\n agent TEXT NOT NULL,\n window_start TEXT NOT NULL,\n message_count INTEGER NOT NULL DEFAULT 1,\n PRIMARY KEY (agent, window_start)\n );\n\n CREATE TABLE IF NOT EXISTS agent_registry (\n name TEXT PRIMARY KEY,\n role TEXT,\n registered_at TEXT NOT NULL DEFAULT (datetime('now')),\n last_active TEXT NOT NULL DEFAULT (datetime('now'))\n );\n `);\n\n // FTS5 for full-text search (separate try since it may already exist)\n try {\n db.exec(`\n CREATE VIRTUAL TABLE IF NOT EXISTS messages_fts USING fts5(\n subject, body, content=messages, content_rowid=id\n );\n\n CREATE TRIGGER IF NOT EXISTS messages_ai AFTER INSERT ON messages BEGIN\n INSERT INTO messages_fts(rowid, subject, body) VALUES (new.id, new.subject, new.body);\n END;\n\n CREATE TRIGGER IF NOT EXISTS messages_ad AFTER DELETE ON messages BEGIN\n INSERT INTO messages_fts(messages_fts, rowid, subject, body) VALUES ('delete', old.id, old.subject, old.body);\n END;\n `);\n } catch {\n // FTS5 tables may already exist\n }\n\n // Set schema version\n const currentVersion = db.prepare(\"SELECT version FROM schema_version LIMIT 1\").get() as { version: number } | null;\n if (!currentVersion) {\n db.prepare(\"INSERT INTO schema_version (version) VALUES (?)\").run(SCHEMA_VERSION);\n }\n\n return db;\n}\n",
|
|
6
|
+
"/**\n * Core Mailbox class — the main API for agent-mailbox\n */\n\nimport { Database } from \"bun:sqlite\";\nimport { initDatabase } from \"./database.js\";\nimport type {\n MailboxConfig,\n ResolvedConfig,\n Message,\n SendOptions,\n SendResult,\n InboxOptions,\n SearchOptions,\n Thread,\n DeadLetter,\n MailboxMetrics,\n AgentInfo,\n Priority,\n} from \"./types.js\";\n\nconst DEFAULT_CONFIG: ResolvedConfig = {\n dbPath: \":memory:\",\n defaultTTL: 86400,\n visibilityTimeout: 300,\n maxRetries: 3,\n maxBodySize: 65536,\n rateLimitPerMinute: 60,\n walMode: true,\n cleanupInterval: 300,\n};\n\nfunction resolveConfig(config?: MailboxConfig): ResolvedConfig {\n return { ...DEFAULT_CONFIG, ...config };\n}\n\nfunction generateThreadId(): string {\n return `thread-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction generateIdempotencyKey(): string {\n return `idem-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport class Mailbox {\n readonly db: Database;\n readonly config: ResolvedConfig;\n private cleanupTimer: ReturnType<typeof setInterval> | null = null;\n\n // Prepared statements\n private stmts: ReturnType<typeof this.prepareStatements>;\n\n constructor(config?: MailboxConfig) {\n this.config = resolveConfig(config);\n this.db = initDatabase(this.config);\n this.stmts = this.prepareStatements();\n\n if (this.config.cleanupInterval > 0) {\n this.cleanupTimer = setInterval(\n () => this.cleanup(),\n this.config.cleanupInterval * 1000\n );\n }\n }\n\n private prepareStatements() {\n return {\n insertMessage: this.db.prepare(`\n INSERT INTO messages (from_agent, to_agent, subject, body, thread_id, priority, ttl_seconds, idempotency_key, trace_id, session_id, expires_at)\n VALUES ($from, $to, $subject, $body, $thread_id, $priority, $ttl, $idem_key, $trace_id, $session_id, datetime('now', '+' || $ttl || ' seconds'))\n `),\n\n insertThread: this.db.prepare(`\n INSERT OR IGNORE INTO threads (id, subject, participants) VALUES ($id, $subject, $participants)\n `),\n\n updateThreadTimestamp: this.db.prepare(`\n UPDATE threads SET last_message_at = datetime('now') WHERE id = $id\n `),\n\n // Visibility timeout: only fetch messages that are visible (visible_after IS NULL or past)\n getInbox: this.db.prepare(`\n SELECT * FROM messages\n WHERE (to_agent = $agent OR to_agent = 'broadcast')\n AND from_agent != $agent\n AND status IN ('pending', 'delivered')\n AND (visible_after IS NULL OR visible_after <= datetime('now'))\n AND expires_at > datetime('now')\n ORDER BY\n CASE priority WHEN 'high' THEN 0 WHEN 'normal' THEN 1 WHEN 'low' THEN 2 END,\n created_at DESC\n LIMIT $limit\n `),\n\n getInboxIncludeRead: this.db.prepare(`\n SELECT * FROM messages\n WHERE (to_agent = $agent OR to_agent = 'broadcast')\n AND from_agent != $agent\n AND status NOT IN ('dead', 'expired')\n AND expires_at > datetime('now')\n ORDER BY created_at DESC\n LIMIT $limit\n `),\n\n // Claim: set visibility timeout + increment receive_count\n claimMessage: this.db.prepare(`\n UPDATE messages\n SET status = 'delivered',\n receive_count = receive_count + 1,\n visible_after = datetime('now', '+' || $timeout || ' seconds')\n WHERE id = $id\n `),\n\n markRead: this.db.prepare(`\n UPDATE messages SET status = 'read', read_at = datetime('now'), visible_after = NULL WHERE id = $id\n `),\n\n markAcked: this.db.prepare(`\n UPDATE messages SET status = 'acked', ack_at = datetime('now'), visible_after = NULL WHERE id = $id\n `),\n\n getMessage: this.db.prepare(`SELECT * FROM messages WHERE id = $id`),\n\n searchFTS: this.db.prepare(`\n SELECT m.* FROM messages m\n JOIN messages_fts fts ON m.id = fts.rowid\n WHERE messages_fts MATCH $query\n AND m.expires_at > datetime('now')\n ORDER BY m.created_at DESC\n LIMIT $limit\n `),\n\n searchLIKE: this.db.prepare(`\n SELECT * FROM messages\n WHERE (subject LIKE $q OR body LIKE $q)\n AND expires_at > datetime('now')\n ORDER BY created_at DESC\n LIMIT $limit\n `),\n\n listThreads: this.db.prepare(`\n SELECT t.*,\n COUNT(m.id) as message_count,\n SUM(CASE WHEN m.status IN ('pending', 'delivered') AND (m.to_agent = $agent OR m.to_agent = 'broadcast') THEN 1 ELSE 0 END) as unread_count\n FROM threads t\n LEFT JOIN messages m ON m.thread_id = t.id\n GROUP BY t.id\n ORDER BY t.last_message_at DESC\n LIMIT $limit\n `),\n\n getThreadMessages: this.db.prepare(`\n SELECT * FROM messages WHERE thread_id = $thread_id ORDER BY created_at ASC\n `),\n\n getReply: this.db.prepare(`\n SELECT * FROM messages\n WHERE thread_id = $thread_id AND from_agent = $from AND to_agent = $to AND id > $after_id\n ORDER BY created_at ASC LIMIT 1\n `),\n\n // Dead letter operations\n moveToDLQ: this.db.prepare(`\n INSERT INTO dead_letters (original_message_id, from_agent, to_agent, subject, body, thread_id, reason)\n SELECT id, from_agent, to_agent, subject, body, thread_id, $reason\n FROM messages WHERE id = $id\n `),\n\n markDead: this.db.prepare(`\n UPDATE messages SET status = 'dead' WHERE id = $id\n `),\n\n getDeadLetters: this.db.prepare(`\n SELECT * FROM dead_letters ORDER BY moved_at DESC LIMIT $limit\n `),\n\n replayDeadLetter: this.db.prepare(`\n SELECT * FROM dead_letters WHERE id = $id\n `),\n\n deleteDeadLetter: this.db.prepare(`\n DELETE FROM dead_letters WHERE id = $id\n `),\n\n // Rate limiting\n checkRate: this.db.prepare(`\n SELECT message_count FROM rate_limits\n WHERE agent = $agent AND window_start = $window\n `),\n\n upsertRate: this.db.prepare(`\n INSERT INTO rate_limits (agent, window_start, message_count)\n VALUES ($agent, $window, 1)\n ON CONFLICT(agent, window_start)\n DO UPDATE SET message_count = message_count + 1\n `),\n\n // Agent registry\n upsertAgent: this.db.prepare(`\n INSERT INTO agent_registry (name, role, last_active)\n VALUES ($name, $role, datetime('now'))\n ON CONFLICT(name)\n DO UPDATE SET role = COALESCE($role, role), last_active = datetime('now')\n `),\n\n listAgents: this.db.prepare(`\n SELECT ar.name, ar.role, ar.last_active,\n (SELECT COUNT(*) FROM messages WHERE from_agent = ar.name) as message_count\n FROM agent_registry ar\n ORDER BY ar.last_active DESC\n `),\n\n // Cleanup\n expireMessages: this.db.prepare(`\n UPDATE messages SET status = 'expired' WHERE expires_at <= datetime('now') AND status NOT IN ('acked', 'expired', 'dead')\n `),\n\n requeueTimedOut: this.db.prepare(`\n UPDATE messages SET status = 'pending', visible_after = NULL\n WHERE status = 'delivered'\n AND visible_after IS NOT NULL\n AND visible_after <= datetime('now')\n AND receive_count < $max_retries\n `),\n\n moveExhaustedToDLQ: this.db.prepare(`\n SELECT id FROM messages\n WHERE status = 'delivered'\n AND visible_after IS NOT NULL\n AND visible_after <= datetime('now')\n AND receive_count >= $max_retries\n `),\n\n cleanRateLimits: this.db.prepare(`\n DELETE FROM rate_limits WHERE window_start < $cutoff\n `),\n\n // Metrics\n countByStatus: this.db.prepare(`\n SELECT status, COUNT(*) as cnt FROM messages GROUP BY status\n `),\n\n countDeadLetters: this.db.prepare(`\n SELECT COUNT(*) as cnt FROM dead_letters\n `),\n\n countActiveThreads: this.db.prepare(`\n SELECT COUNT(*) as cnt FROM threads WHERE last_message_at > datetime('now', '-1 hour')\n `),\n\n messagesPerAgent: this.db.prepare(`\n SELECT from_agent, COUNT(*) as cnt FROM messages GROUP BY from_agent ORDER BY cnt DESC\n `),\n\n avgDeliveryTime: this.db.prepare(`\n SELECT AVG((julianday(read_at) - julianday(created_at)) * 86400000) as avg_ms\n FROM messages WHERE read_at IS NOT NULL\n `),\n\n // Idempotency check\n checkIdempotency: this.db.prepare(`\n SELECT id, thread_id FROM messages WHERE idempotency_key = $key\n `),\n };\n }\n\n // ─── Core Operations ─────────────────────────────────────────────\n\n /** Send a message to an agent */\n send(opts: SendOptions): SendResult {\n // Validate body size\n if (Buffer.byteLength(opts.body, \"utf-8\") > this.config.maxBodySize) {\n throw new Error(`Message body exceeds max size of ${this.config.maxBodySize} bytes`);\n }\n\n // Check rate limit\n this.checkRateLimit(opts.from);\n\n // Idempotency check\n if (opts.idempotencyKey) {\n const existing = this.stmts.checkIdempotency.get({ $key: opts.idempotencyKey }) as { id: number; thread_id: string } | null;\n if (existing) {\n return { messageId: existing.id, threadId: existing.thread_id, idempotencyKey: opts.idempotencyKey };\n }\n }\n\n const threadId = opts.threadId ?? generateThreadId();\n const ttl = opts.ttlSeconds ?? this.config.defaultTTL;\n\n // Create/update thread\n this.stmts.insertThread.run({\n $id: threadId,\n $subject: opts.subject,\n $participants: JSON.stringify([opts.from, opts.to]),\n });\n this.stmts.updateThreadTimestamp.run({ $id: threadId });\n\n // Insert message\n const result = this.stmts.insertMessage.run({\n $from: opts.from,\n $to: opts.to,\n $subject: opts.subject,\n $body: opts.body,\n $thread_id: threadId,\n $priority: opts.priority ?? \"normal\",\n $ttl: ttl,\n $idem_key: opts.idempotencyKey ?? null,\n $trace_id: opts.traceId ?? null,\n $session_id: opts.sessionId ?? \"\",\n });\n\n // Update agent registry\n this.stmts.upsertAgent.run({ $name: opts.from, $role: null });\n\n return {\n messageId: Number(result.lastInsertRowid),\n threadId,\n idempotencyKey: opts.idempotencyKey ?? null,\n };\n }\n\n /** Broadcast a message to all agents */\n broadcast(opts: Omit<SendOptions, \"to\">): SendResult {\n return this.send({ ...opts, to: \"broadcast\" });\n }\n\n /** Read inbox with visibility timeout */\n readInbox(opts: InboxOptions): Message[] {\n const limit = opts.limit ?? 20;\n\n if (opts.includeRead) {\n return this.stmts.getInboxIncludeRead.all({ $agent: opts.agent, $limit: limit }) as Message[];\n }\n\n const rows = this.stmts.getInbox.all({ $agent: opts.agent, $limit: limit }) as Message[];\n\n // Claim messages with visibility timeout\n for (const row of rows) {\n this.stmts.claimMessage.run({\n $id: row.id,\n $timeout: this.config.visibilityTimeout,\n });\n }\n\n return rows;\n }\n\n /** Mark a message as read (clears visibility timeout) */\n markRead(messageId: number): void {\n this.stmts.markRead.run({ $id: messageId });\n }\n\n /** Acknowledge a message (confirms processing complete) */\n acknowledge(messageId: number, response?: { from: string; body: string; sessionId?: string }): SendResult | null {\n this.stmts.markAcked.run({ $id: messageId });\n\n if (response) {\n const original = this.stmts.getMessage.get({ $id: messageId }) as Message | null;\n if (original) {\n return this.send({\n from: response.from,\n to: original.from_agent,\n subject: `Re: ${original.subject}`,\n body: response.body,\n threadId: original.thread_id,\n priority: \"normal\",\n sessionId: response.sessionId,\n });\n }\n }\n return null;\n }\n\n /** Search messages using FTS5 with LIKE fallback */\n search(opts: SearchOptions): { messages: Message[]; usedFallback: boolean } {\n const limit = opts.limit ?? 10;\n\n try {\n const rows = this.stmts.searchFTS.all({ $query: opts.query, $limit: limit }) as Message[];\n return { messages: rows, usedFallback: false };\n } catch {\n const rows = this.stmts.searchLIKE.all({ $q: `%${opts.query}%`, $limit: limit }) as Message[];\n return { messages: rows, usedFallback: true };\n }\n }\n\n /** List conversation threads */\n listThreads(agent: string, limit = 10): Thread[] {\n return this.stmts.listThreads.all({ $agent: agent, $limit: limit }) as Thread[];\n }\n\n /** Get all messages in a thread */\n getThread(threadId: string): Message[] {\n return this.stmts.getThreadMessages.all({ $thread_id: threadId }) as Message[];\n }\n\n /** Send a request and poll for reply with exponential backoff */\n async request(\n opts: SendOptions & { timeoutMs?: number }\n ): Promise<{ reply: Message } | { timeout: true; messageId: number; threadId: string }> {\n const timeout = opts.timeoutMs ?? 120_000;\n const { messageId, threadId } = this.send({\n ...opts,\n priority: \"high\",\n body: opts.body + \"\\n\\n---\\nREPLY REQUESTED — sender is waiting.\",\n });\n\n const startTime = Date.now();\n let delay = 500; // Start at 500ms, exponential backoff\n\n while (Date.now() - startTime < timeout) {\n const reply = this.stmts.getReply.get({\n $thread_id: threadId,\n $from: opts.to,\n $to: opts.from,\n $after_id: messageId,\n }) as Message | null;\n\n if (reply) {\n this.markRead(reply.id);\n return { reply };\n }\n\n await new Promise((r) => setTimeout(r, delay));\n delay = Math.min(delay * 1.5, 10_000); // Cap at 10s\n }\n\n return { timeout: true, messageId, threadId };\n }\n\n // ─── Agent Registry ──────────────────────────────────────────────\n\n /** Register an agent (upsert) */\n registerAgent(name: string, role?: string): void {\n this.stmts.upsertAgent.run({ $name: name, $role: role ?? null });\n }\n\n /** List all registered agents */\n listAgents(): AgentInfo[] {\n return this.stmts.listAgents.all() as AgentInfo[];\n }\n\n // ─── Dead Letter Queue ───────────────────────────────────────────\n\n /** Get messages in the dead letter queue */\n getDeadLetters(limit = 20): DeadLetter[] {\n return this.stmts.getDeadLetters.all({ $limit: limit }) as DeadLetter[];\n }\n\n /** Replay a dead letter (re-send the original message) */\n replayDeadLetter(dlqId: number): SendResult | null {\n const dl = this.stmts.replayDeadLetter.get({ $id: dlqId }) as DeadLetter | null;\n if (!dl) return null;\n\n const result = this.send({\n from: dl.from_agent,\n to: dl.to_agent,\n subject: dl.subject,\n body: dl.body,\n threadId: dl.thread_id,\n });\n\n this.stmts.deleteDeadLetter.run({ $id: dlqId });\n return result;\n }\n\n // ─── Metrics ─────────────────────────────────────────────────────\n\n /** Get mailbox metrics snapshot */\n metrics(): MailboxMetrics {\n const statusCounts = this.stmts.countByStatus.all() as { status: string; cnt: number }[];\n const statusMap: Record<string, number> = {};\n let total = 0;\n for (const row of statusCounts) {\n statusMap[row.status] = row.cnt;\n total += row.cnt;\n }\n\n const dlCount = (this.stmts.countDeadLetters.get() as { cnt: number }).cnt;\n const threadCount = (this.stmts.countActiveThreads.get() as { cnt: number }).cnt;\n const perAgent = this.stmts.messagesPerAgent.all() as { from_agent: string; cnt: number }[];\n const avgDel = this.stmts.avgDeliveryTime.get() as { avg_ms: number | null };\n\n return {\n totalMessages: total,\n pendingMessages: statusMap[\"pending\"] ?? 0,\n deliveredMessages: statusMap[\"delivered\"] ?? 0,\n deadLetters: dlCount,\n activeThreads: threadCount,\n messagesPerAgent: Object.fromEntries(perAgent.map((r) => [r.from_agent, r.cnt])),\n avgDeliveryTimeMs: avgDel.avg_ms,\n };\n }\n\n // ─── Maintenance ─────────────────────────────────────────────────\n\n /** Run cleanup: expire messages, requeue timed-out, move exhausted to DLQ */\n cleanup(): { expired: number; requeued: number; deadLettered: number } {\n // Expire old messages\n const expired = this.stmts.expireMessages.run().changes;\n\n // Requeue messages that timed out (visibility expired) but have retries left\n const requeued = this.stmts.requeueTimedOut.run({ $max_retries: this.config.maxRetries }).changes;\n\n // Move exhausted messages to DLQ\n const exhausted = this.stmts.moveExhaustedToDLQ.all({ $max_retries: this.config.maxRetries }) as { id: number }[];\n for (const { id } of exhausted) {\n this.stmts.moveToDLQ.run({ $id: id, $reason: `Max retries (${this.config.maxRetries}) exceeded` });\n this.stmts.markDead.run({ $id: id });\n }\n\n // Clean old rate limit entries\n const cutoff = new Date(Date.now() - 120_000).toISOString().slice(0, 16);\n this.stmts.cleanRateLimits.run({ $cutoff: cutoff });\n\n return { expired, requeued, deadLettered: exhausted.length };\n }\n\n /** Close the database and stop cleanup timer */\n close(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n this.db.close();\n }\n\n // ─── Private ─────────────────────────────────────────────────────\n\n private checkRateLimit(agent: string): void {\n const window = new Date().toISOString().slice(0, 16); // Per-minute window\n const current = this.stmts.checkRate.get({ $agent: agent, $window: window }) as { message_count: number } | null;\n\n if (current && current.message_count >= this.config.rateLimitPerMinute) {\n throw new Error(`Rate limit exceeded for agent '${agent}': ${this.config.rateLimitPerMinute}/min`);\n }\n\n this.stmts.upsertRate.run({ $agent: agent, $window: window });\n }\n}\n",
|
|
7
|
+
"/**\n * Message formatting utilities\n */\n\nimport type { Message, Thread, AgentInfo, DeadLetter, MailboxMetrics } from \"./types.js\";\n\nexport function formatMessages(rows: Message[]): string {\n if (!rows || rows.length === 0) return \"No messages found.\";\n return rows\n .map(\n (m) =>\n `[#${m.id}] ${m.priority === \"high\" ? \"!! \" : m.priority === \"low\" ? \"-- \" : \"\"}` +\n `From: @${m.from_agent} -> To: @${m.to_agent}\\n` +\n `Subject: ${m.subject}\\n` +\n `Thread: ${m.thread_id} | Status: ${m.status} | Receives: ${m.receive_count}\\n` +\n `Time: ${m.created_at} | Expires: ${m.expires_at}` +\n `${m.read_at ? ` | Read: ${m.read_at}` : \"\"}` +\n `${m.ack_at ? ` | Acked: ${m.ack_at}` : \"\"}\\n` +\n `${m.trace_id ? `Trace: ${m.trace_id}\\n` : \"\"}` +\n `---\\n${m.body}\\n`\n )\n .join(\"\\n\" + \"=\".repeat(50) + \"\\n\\n\");\n}\n\nexport function formatThreads(threads: Thread[]): string {\n if (!threads || threads.length === 0) return \"No active threads.\";\n return threads\n .map(\n (t) =>\n `[${t.id}] ${t.subject}\\n` +\n ` Messages: ${t.message_count} | Unread: ${t.unread_count}\\n` +\n ` Last activity: ${t.last_message_at}`\n )\n .join(\"\\n\\n\");\n}\n\nexport function formatAgents(agents: AgentInfo[]): string {\n if (!agents || agents.length === 0) return \"No registered agents.\";\n return agents\n .map(\n (a) =>\n `@${a.name} [${a.messageCount} msgs]` +\n `${a.lastActive ? ` last active: ${a.lastActive}` : \" (never active)\"}\\n` +\n ` ${a.role ?? \"No role defined\"}`\n )\n .join(\"\\n\\n\");\n}\n\nexport function formatDeadLetters(dls: DeadLetter[]): string {\n if (!dls || dls.length === 0) return \"Dead letter queue is empty.\";\n return dls\n .map(\n (d) =>\n `[DLQ #${d.id}] Original: #${d.original_message_id}\\n` +\n `From: @${d.from_agent} -> To: @${d.to_agent}\\n` +\n `Subject: ${d.subject}\\n` +\n `Reason: ${d.reason}\\n` +\n `Moved: ${d.moved_at}\\n` +\n `---\\n${d.body}\\n`\n )\n .join(\"\\n\" + \"=\".repeat(50) + \"\\n\\n\");\n}\n\nexport function formatMetrics(m: MailboxMetrics): string {\n const lines = [\n `Mailbox Metrics`,\n `${\"=\".repeat(40)}`,\n `Total messages: ${m.totalMessages}`,\n `Pending: ${m.pendingMessages}`,\n `Delivered (in-flight): ${m.deliveredMessages}`,\n `Dead letters: ${m.deadLetters}`,\n `Active threads (last 1h): ${m.activeThreads}`,\n `Avg delivery time: ${m.avgDeliveryTimeMs ? `${Math.round(m.avgDeliveryTimeMs)}ms` : \"N/A\"}`,\n ``,\n `Messages per agent:`,\n ...Object.entries(m.messagesPerAgent).map(([a, c]) => ` @${a}: ${c}`),\n ];\n return lines.join(\"\\n\");\n}\n"
|
|
8
|
+
],
|
|
9
|
+
"mappings": ";;AAIA;AACA;AACA;AAGA,IAAM,iBAAiB;AAEhB,SAAS,YAAY,CAAC,QAAkC;AAAA,EAE7D,IAAI,OAAO,WAAW,YAAY;AAAA,IAChC,MAAM,MAAM,QAAQ,OAAO,MAAM;AAAA,IACjC,IAAI,CAAC,WAAW,GAAG,GAAG;AAAA,MACpB,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,IAAI,SAAS,OAAO,MAAM;AAAA,EAErC,IAAI,OAAO,SAAS;AAAA,IAClB,GAAG,KAAK,yBAAyB;AAAA,IACjC,GAAG,KAAK,2BAA2B;AAAA,EACrC;AAAA,EACA,GAAG,KAAK,wBAAwB;AAAA,EAEhC,GAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAkEP;AAAA,EAGD,IAAI;AAAA,IACF,GAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAYP;AAAA,IACD,MAAM;AAAA,EAKR,MAAM,iBAAiB,GAAG,QAAQ,4CAA4C,EAAE,IAAI;AAAA,EACpF,IAAI,CAAC,gBAAgB;AAAA,IACnB,GAAG,QAAQ,iDAAiD,EAAE,IAAI,cAAc;AAAA,EAClF;AAAA,EAEA,OAAO;AAAA;;;ACpGT,IAAM,iBAAiC;AAAA,EACrC,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,oBAAoB;AAAA,EACpB,SAAS;AAAA,EACT,iBAAiB;AACnB;AAEA,SAAS,aAAa,CAAC,QAAwC;AAAA,EAC7D,OAAO,KAAK,mBAAmB,OAAO;AAAA;AAGxC,SAAS,gBAAgB,GAAW;AAAA,EAClC,OAAO,UAAU,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC;AAAA;AAO/D,MAAM,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,EACD,eAAsD;AAAA,EAGtD;AAAA,EAER,WAAW,CAAC,QAAwB;AAAA,IAClC,KAAK,SAAS,cAAc,MAAM;AAAA,IAClC,KAAK,KAAK,aAAa,KAAK,MAAM;AAAA,IAClC,KAAK,QAAQ,KAAK,kBAAkB;AAAA,IAEpC,IAAI,KAAK,OAAO,kBAAkB,GAAG;AAAA,MACnC,KAAK,eAAe,YAClB,MAAM,KAAK,QAAQ,GACnB,KAAK,OAAO,kBAAkB,IAChC;AAAA,IACF;AAAA;AAAA,EAGM,iBAAiB,GAAG;AAAA,IAC1B,OAAO;AAAA,MACL,eAAe,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA,OAG9B;AAAA,MAED,cAAc,KAAK,GAAG,QAAQ;AAAA;AAAA,OAE7B;AAAA,MAED,uBAAuB,KAAK,GAAG,QAAQ;AAAA;AAAA,OAEtC;AAAA,MAGD,UAAU,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAWzB;AAAA,MAED,qBAAqB,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAQpC;AAAA,MAGD,cAAc,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAM7B;AAAA,MAED,UAAU,KAAK,GAAG,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,WAAW,KAAK,GAAG,QAAQ;AAAA;AAAA,OAE1B;AAAA,MAED,YAAY,KAAK,GAAG,QAAQ,uCAAuC;AAAA,MAEnE,WAAW,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAO1B;AAAA,MAED,YAAY,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAM3B;AAAA,MAED,aAAa,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAS5B;AAAA,MAED,mBAAmB,KAAK,GAAG,QAAQ;AAAA;AAAA,OAElC;AAAA,MAED,UAAU,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA,OAIzB;AAAA,MAGD,WAAW,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA,OAI1B;AAAA,MAED,UAAU,KAAK,GAAG,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,gBAAgB,KAAK,GAAG,QAAQ;AAAA;AAAA,OAE/B;AAAA,MAED,kBAAkB,KAAK,GAAG,QAAQ;AAAA;AAAA,OAEjC;AAAA,MAED,kBAAkB,KAAK,GAAG,QAAQ;AAAA;AAAA,OAEjC;AAAA,MAGD,WAAW,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA,OAG1B;AAAA,MAED,YAAY,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,OAK3B;AAAA,MAGD,aAAa,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,OAK5B;AAAA,MAED,YAAY,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,OAK3B;AAAA,MAGD,gBAAgB,KAAK,GAAG,QAAQ;AAAA;AAAA,OAE/B;AAAA,MAED,iBAAiB,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAMhC;AAAA,MAED,oBAAoB,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAMnC;AAAA,MAED,iBAAiB,KAAK,GAAG,QAAQ;AAAA;AAAA,OAEhC;AAAA,MAGD,eAAe,KAAK,GAAG,QAAQ;AAAA;AAAA,OAE9B;AAAA,MAED,kBAAkB,KAAK,GAAG,QAAQ;AAAA;AAAA,OAEjC;AAAA,MAED,oBAAoB,KAAK,GAAG,QAAQ;AAAA;AAAA,OAEnC;AAAA,MAED,kBAAkB,KAAK,GAAG,QAAQ;AAAA;AAAA,OAEjC;AAAA,MAED,iBAAiB,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA,OAGhC;AAAA,MAGD,kBAAkB,KAAK,GAAG,QAAQ;AAAA;AAAA,OAEjC;AAAA,IACH;AAAA;AAAA,EAMF,IAAI,CAAC,MAA+B;AAAA,IAElC,IAAI,OAAO,WAAW,KAAK,MAAM,OAAO,IAAI,KAAK,OAAO,aAAa;AAAA,MACnE,MAAM,IAAI,MAAM,oCAAoC,KAAK,OAAO,mBAAmB;AAAA,IACrF;AAAA,IAGA,KAAK,eAAe,KAAK,IAAI;AAAA,IAG7B,IAAI,KAAK,gBAAgB;AAAA,MACvB,MAAM,WAAW,KAAK,MAAM,iBAAiB,IAAI,EAAE,MAAM,KAAK,eAAe,CAAC;AAAA,MAC9E,IAAI,UAAU;AAAA,QACZ,OAAO,EAAE,WAAW,SAAS,IAAI,UAAU,SAAS,WAAW,gBAAgB,KAAK,eAAe;AAAA,MACrG;AAAA,IACF;AAAA,IAEA,MAAM,WAAW,KAAK,YAAY,iBAAiB;AAAA,IACnD,MAAM,MAAM,KAAK,cAAc,KAAK,OAAO;AAAA,IAG3C,KAAK,MAAM,aAAa,IAAI;AAAA,MAC1B,KAAK;AAAA,MACL,UAAU,KAAK;AAAA,MACf,eAAe,KAAK,UAAU,CAAC,KAAK,MAAM,KAAK,EAAE,CAAC;AAAA,IACpD,CAAC;AAAA,IACD,KAAK,MAAM,sBAAsB,IAAI,EAAE,KAAK,SAAS,CAAC;AAAA,IAGtD,MAAM,SAAS,KAAK,MAAM,cAAc,IAAI;AAAA,MAC1C,OAAO,KAAK;AAAA,MACZ,KAAK,KAAK;AAAA,MACV,UAAU,KAAK;AAAA,MACf,OAAO,KAAK;AAAA,MACZ,YAAY;AAAA,MACZ,WAAW,KAAK,YAAY;AAAA,MAC5B,MAAM;AAAA,MACN,WAAW,KAAK,kBAAkB;AAAA,MAClC,WAAW,KAAK,WAAW;AAAA,MAC3B,aAAa,KAAK,aAAa;AAAA,IACjC,CAAC;AAAA,IAGD,KAAK,MAAM,YAAY,IAAI,EAAE,OAAO,KAAK,MAAM,OAAO,KAAK,CAAC;AAAA,IAE5D,OAAO;AAAA,MACL,WAAW,OAAO,OAAO,eAAe;AAAA,MACxC;AAAA,MACA,gBAAgB,KAAK,kBAAkB;AAAA,IACzC;AAAA;AAAA,EAIF,SAAS,CAAC,MAA2C;AAAA,IACnD,OAAO,KAAK,KAAK,KAAK,MAAM,IAAI,YAAY,CAAC;AAAA;AAAA,EAI/C,SAAS,CAAC,MAA+B;AAAA,IACvC,MAAM,QAAQ,KAAK,SAAS;AAAA,IAE5B,IAAI,KAAK,aAAa;AAAA,MACpB,OAAO,KAAK,MAAM,oBAAoB,IAAI,EAAE,QAAQ,KAAK,OAAO,QAAQ,MAAM,CAAC;AAAA,IACjF;AAAA,IAEA,MAAM,OAAO,KAAK,MAAM,SAAS,IAAI,EAAE,QAAQ,KAAK,OAAO,QAAQ,MAAM,CAAC;AAAA,IAG1E,WAAW,OAAO,MAAM;AAAA,MACtB,KAAK,MAAM,aAAa,IAAI;AAAA,QAC1B,KAAK,IAAI;AAAA,QACT,UAAU,KAAK,OAAO;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,IAEA,OAAO;AAAA;AAAA,EAIT,QAAQ,CAAC,WAAyB;AAAA,IAChC,KAAK,MAAM,SAAS,IAAI,EAAE,KAAK,UAAU,CAAC;AAAA;AAAA,EAI5C,WAAW,CAAC,WAAmB,UAAkF;AAAA,IAC/G,KAAK,MAAM,UAAU,IAAI,EAAE,KAAK,UAAU,CAAC;AAAA,IAE3C,IAAI,UAAU;AAAA,MACZ,MAAM,WAAW,KAAK,MAAM,WAAW,IAAI,EAAE,KAAK,UAAU,CAAC;AAAA,MAC7D,IAAI,UAAU;AAAA,QACZ,OAAO,KAAK,KAAK;AAAA,UACf,MAAM,SAAS;AAAA,UACf,IAAI,SAAS;AAAA,UACb,SAAS,OAAO,SAAS;AAAA,UACzB,MAAM,SAAS;AAAA,UACf,UAAU,SAAS;AAAA,UACnB,UAAU;AAAA,UACV,WAAW,SAAS;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,OAAO;AAAA;AAAA,EAIT,MAAM,CAAC,MAAqE;AAAA,IAC1E,MAAM,QAAQ,KAAK,SAAS;AAAA,IAE5B,IAAI;AAAA,MACF,MAAM,OAAO,KAAK,MAAM,UAAU,IAAI,EAAE,QAAQ,KAAK,OAAO,QAAQ,MAAM,CAAC;AAAA,MAC3E,OAAO,EAAE,UAAU,MAAM,cAAc,MAAM;AAAA,MAC7C,MAAM;AAAA,MACN,MAAM,OAAO,KAAK,MAAM,WAAW,IAAI,EAAE,IAAI,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,MAC/E,OAAO,EAAE,UAAU,MAAM,cAAc,KAAK;AAAA;AAAA;AAAA,EAKhD,WAAW,CAAC,OAAe,QAAQ,IAAc;AAAA,IAC/C,OAAO,KAAK,MAAM,YAAY,IAAI,EAAE,QAAQ,OAAO,QAAQ,MAAM,CAAC;AAAA;AAAA,EAIpE,SAAS,CAAC,UAA6B;AAAA,IACrC,OAAO,KAAK,MAAM,kBAAkB,IAAI,EAAE,YAAY,SAAS,CAAC;AAAA;AAAA,OAI5D,QAAO,CACX,MACsF;AAAA,IACtF,MAAM,UAAU,KAAK,aAAa;AAAA,IAClC,QAAQ,WAAW,aAAa,KAAK,KAAK;AAAA,SACrC;AAAA,MACH,UAAU;AAAA,MACV,MAAM,KAAK,OAAO;AAAA;AAAA;AAAA;AAAA,IACpB,CAAC;AAAA,IAED,MAAM,YAAY,KAAK,IAAI;AAAA,IAC3B,IAAI,QAAQ;AAAA,IAEZ,OAAO,KAAK,IAAI,IAAI,YAAY,SAAS;AAAA,MACvC,MAAM,QAAQ,KAAK,MAAM,SAAS,IAAI;AAAA,QACpC,YAAY;AAAA,QACZ,OAAO,KAAK;AAAA,QACZ,KAAK,KAAK;AAAA,QACV,WAAW;AAAA,MACb,CAAC;AAAA,MAED,IAAI,OAAO;AAAA,QACT,KAAK,SAAS,MAAM,EAAE;AAAA,QACtB,OAAO,EAAE,MAAM;AAAA,MACjB;AAAA,MAEA,MAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AAAA,MAC7C,QAAQ,KAAK,IAAI,QAAQ,KAAK,GAAM;AAAA,IACtC;AAAA,IAEA,OAAO,EAAE,SAAS,MAAM,WAAW,SAAS;AAAA;AAAA,EAM9C,aAAa,CAAC,MAAc,MAAqB;AAAA,IAC/C,KAAK,MAAM,YAAY,IAAI,EAAE,OAAO,MAAM,OAAO,QAAQ,KAAK,CAAC;AAAA;AAAA,EAIjE,UAAU,GAAgB;AAAA,IACxB,OAAO,KAAK,MAAM,WAAW,IAAI;AAAA;AAAA,EAMnC,cAAc,CAAC,QAAQ,IAAkB;AAAA,IACvC,OAAO,KAAK,MAAM,eAAe,IAAI,EAAE,QAAQ,MAAM,CAAC;AAAA;AAAA,EAIxD,gBAAgB,CAAC,OAAkC;AAAA,IACjD,MAAM,KAAK,KAAK,MAAM,iBAAiB,IAAI,EAAE,KAAK,MAAM,CAAC;AAAA,IACzD,IAAI,CAAC;AAAA,MAAI,OAAO;AAAA,IAEhB,MAAM,SAAS,KAAK,KAAK;AAAA,MACvB,MAAM,GAAG;AAAA,MACT,IAAI,GAAG;AAAA,MACP,SAAS,GAAG;AAAA,MACZ,MAAM,GAAG;AAAA,MACT,UAAU,GAAG;AAAA,IACf,CAAC;AAAA,IAED,KAAK,MAAM,iBAAiB,IAAI,EAAE,KAAK,MAAM,CAAC;AAAA,IAC9C,OAAO;AAAA;AAAA,EAMT,OAAO,GAAmB;AAAA,IACxB,MAAM,eAAe,KAAK,MAAM,cAAc,IAAI;AAAA,IAClD,MAAM,YAAoC,CAAC;AAAA,IAC3C,IAAI,QAAQ;AAAA,IACZ,WAAW,OAAO,cAAc;AAAA,MAC9B,UAAU,IAAI,UAAU,IAAI;AAAA,MAC5B,SAAS,IAAI;AAAA,IACf;AAAA,IAEA,MAAM,UAAW,KAAK,MAAM,iBAAiB,IAAI,EAAsB;AAAA,IACvE,MAAM,cAAe,KAAK,MAAM,mBAAmB,IAAI,EAAsB;AAAA,IAC7E,MAAM,WAAW,KAAK,MAAM,iBAAiB,IAAI;AAAA,IACjD,MAAM,SAAS,KAAK,MAAM,gBAAgB,IAAI;AAAA,IAE9C,OAAO;AAAA,MACL,eAAe;AAAA,MACf,iBAAiB,UAAU,cAAc;AAAA,MACzC,mBAAmB,UAAU,gBAAgB;AAAA,MAC7C,aAAa;AAAA,MACb,eAAe;AAAA,MACf,kBAAkB,OAAO,YAAY,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;AAAA,MAC/E,mBAAmB,OAAO;AAAA,IAC5B;AAAA;AAAA,EAMF,OAAO,GAAgE;AAAA,IAErE,MAAM,UAAU,KAAK,MAAM,eAAe,IAAI,EAAE;AAAA,IAGhD,MAAM,WAAW,KAAK,MAAM,gBAAgB,IAAI,EAAE,cAAc,KAAK,OAAO,WAAW,CAAC,EAAE;AAAA,IAG1F,MAAM,YAAY,KAAK,MAAM,mBAAmB,IAAI,EAAE,cAAc,KAAK,OAAO,WAAW,CAAC;AAAA,IAC5F,aAAa,QAAQ,WAAW;AAAA,MAC9B,KAAK,MAAM,UAAU,IAAI,EAAE,KAAK,IAAI,SAAS,gBAAgB,KAAK,OAAO,uBAAuB,CAAC;AAAA,MACjG,KAAK,MAAM,SAAS,IAAI,EAAE,KAAK,GAAG,CAAC;AAAA,IACrC;AAAA,IAGA,MAAM,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,MAAO,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,IACvE,KAAK,MAAM,gBAAgB,IAAI,EAAE,SAAS,OAAO,CAAC;AAAA,IAElD,OAAO,EAAE,SAAS,UAAU,cAAc,UAAU,OAAO;AAAA;AAAA,EAI7D,KAAK,GAAS;AAAA,IACZ,IAAI,KAAK,cAAc;AAAA,MACrB,cAAc,KAAK,YAAY;AAAA,MAC/B,KAAK,eAAe;AAAA,IACtB;AAAA,IACA,KAAK,GAAG,MAAM;AAAA;AAAA,EAKR,cAAc,CAAC,OAAqB;AAAA,IAC1C,MAAM,SAAS,IAAI,KAAK,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,IACnD,MAAM,UAAU,KAAK,MAAM,UAAU,IAAI,EAAE,QAAQ,OAAO,SAAS,OAAO,CAAC;AAAA,IAE3E,IAAI,WAAW,QAAQ,iBAAiB,KAAK,OAAO,oBAAoB;AAAA,MACtE,MAAM,IAAI,MAAM,kCAAkC,WAAW,KAAK,OAAO,wBAAwB;AAAA,IACnG;AAAA,IAEA,KAAK,MAAM,WAAW,IAAI,EAAE,QAAQ,OAAO,SAAS,OAAO,CAAC;AAAA;AAEhE;;ACrhBO,SAAS,cAAc,CAAC,MAAyB;AAAA,EACtD,IAAI,CAAC,QAAQ,KAAK,WAAW;AAAA,IAAG,OAAO;AAAA,EACvC,OAAO,KACJ,IACC,CAAC,MACC,KAAK,EAAE,OAAO,EAAE,aAAa,SAAS,QAAQ,EAAE,aAAa,QAAQ,QAAQ,OAC7E,UAAU,EAAE,sBAAsB,EAAE;AAAA,IACpC,YAAY,EAAE;AAAA,IACd,WAAW,EAAE,uBAAuB,EAAE,sBAAsB,EAAE;AAAA,IAC9D,SAAS,EAAE,yBAAyB,EAAE,eACtC,GAAG,EAAE,UAAU,YAAY,EAAE,YAAY,OACzC,GAAG,EAAE,SAAS,aAAa,EAAE,WAAW;AAAA,IACxC,GAAG,EAAE,WAAW,UAAU,EAAE;AAAA,IAAe,OAC3C;AAAA,EAAQ,EAAE;AAAA,CACd,EACC,KAAK;AAAA,IAAO,IAAI,OAAO,EAAE,IAAI;AAAA;AAAA,CAAM;AAAA;AAGjC,SAAS,aAAa,CAAC,SAA2B;AAAA,EACvD,IAAI,CAAC,WAAW,QAAQ,WAAW;AAAA,IAAG,OAAO;AAAA,EAC7C,OAAO,QACJ,IACC,CAAC,MACC,IAAI,EAAE,OAAO,EAAE;AAAA,IACf,eAAe,EAAE,2BAA2B,EAAE;AAAA,IAC9C,oBAAoB,EAAE,iBAC1B,EACC,KAAK;AAAA;AAAA,CAAM;AAAA;AAGT,SAAS,YAAY,CAAC,QAA6B;AAAA,EACxD,IAAI,CAAC,UAAU,OAAO,WAAW;AAAA,IAAG,OAAO;AAAA,EAC3C,OAAO,OACJ,IACC,CAAC,MACC,IAAI,EAAE,SAAS,EAAE,uBACjB,GAAG,EAAE,aAAa,iBAAiB,EAAE,eAAe;AAAA,IACpD,KAAK,EAAE,QAAQ,mBACnB,EACC,KAAK;AAAA;AAAA,CAAM;AAAA;AAGT,SAAS,iBAAiB,CAAC,KAA2B;AAAA,EAC3D,IAAI,CAAC,OAAO,IAAI,WAAW;AAAA,IAAG,OAAO;AAAA,EACrC,OAAO,IACJ,IACC,CAAC,MACC,SAAS,EAAE,kBAAkB,EAAE;AAAA,IAC/B,UAAU,EAAE,sBAAsB,EAAE;AAAA,IACpC,YAAY,EAAE;AAAA,IACd,WAAW,EAAE;AAAA,IACb,UAAU,EAAE;AAAA,IACZ;AAAA,EAAQ,EAAE;AAAA,CACd,EACC,KAAK;AAAA,IAAO,IAAI,OAAO,EAAE,IAAI;AAAA;AAAA,CAAM;AAAA;AAGjC,SAAS,aAAa,CAAC,GAA2B;AAAA,EACvD,MAAM,QAAQ;AAAA,IACZ;AAAA,IACA,GAAG,IAAI,OAAO,EAAE;AAAA,IAChB,mBAAmB,EAAE;AAAA,IACrB,YAAY,EAAE;AAAA,IACd,0BAA0B,EAAE;AAAA,IAC5B,iBAAiB,EAAE;AAAA,IACnB,6BAA6B,EAAE;AAAA,IAC/B,sBAAsB,EAAE,oBAAoB,GAAG,KAAK,MAAM,EAAE,iBAAiB,QAAQ;AAAA,IACrF;AAAA,IACA;AAAA,IACA,GAAG,OAAO,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,GAAG,OAAO,MAAM,MAAM,GAAG;AAAA,EACvE;AAAA,EACA,OAAO,MAAM,KAAK;AAAA,CAAI;AAAA;",
|
|
10
|
+
"debugId": "EDBAF90F8B44502C64756E2164756E21",
|
|
11
|
+
"names": []
|
|
12
|
+
}
|
package/dist/plugin.js
CHANGED
|
@@ -12336,8 +12336,16 @@ function tool(input) {
|
|
|
12336
12336
|
tool.schema = exports_external;
|
|
12337
12337
|
// src/database.ts
|
|
12338
12338
|
import { Database } from "bun:sqlite";
|
|
12339
|
+
import { mkdirSync, existsSync } from "fs";
|
|
12340
|
+
import { dirname } from "path";
|
|
12339
12341
|
var SCHEMA_VERSION = 1;
|
|
12340
12342
|
function initDatabase(config2) {
|
|
12343
|
+
if (config2.dbPath !== ":memory:") {
|
|
12344
|
+
const dir = dirname(config2.dbPath);
|
|
12345
|
+
if (!existsSync(dir)) {
|
|
12346
|
+
mkdirSync(dir, { recursive: true });
|
|
12347
|
+
}
|
|
12348
|
+
}
|
|
12341
12349
|
const db = new Database(config2.dbPath);
|
|
12342
12350
|
if (config2.walMode) {
|
|
12343
12351
|
db.exec("PRAGMA journal_mode=WAL");
|
|
@@ -13109,3 +13117,5 @@ ${"=".repeat(50)}
|
|
|
13109
13117
|
export {
|
|
13110
13118
|
plugin_default as default
|
|
13111
13119
|
};
|
|
13120
|
+
|
|
13121
|
+
//# debugId=E4FD3D19E59A42E164756E2164756E21
|