botinabox 0.3.0 → 0.3.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.
Files changed (2) hide show
  1. package/dist/index.js +77 -7
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -830,14 +830,14 @@ var SessionManager = class {
830
830
  async save(agentId, channelId, peerId, params) {
831
831
  const existing = await this._find(agentId, channelId, peerId);
832
832
  if (existing) {
833
- await this.db.update("messages", { id: existing["id"] }, {
833
+ await this.db.update("sessions", { id: existing["id"] }, {
834
834
  context: JSON.stringify(params),
835
835
  last_message_at: (/* @__PURE__ */ new Date()).toISOString(),
836
836
  message_count: (existing["message_count"] ?? 0) + 1
837
837
  });
838
838
  return existing["id"];
839
839
  } else {
840
- const row = await this.db.insert("messages", {
840
+ const row = await this.db.insert("sessions", {
841
841
  agent_id: agentId,
842
842
  channel: channelId,
843
843
  peer_id: peerId,
@@ -857,7 +857,7 @@ var SessionManager = class {
857
857
  async clear(agentId, channelId, peerId) {
858
858
  const session = await this._find(agentId, channelId, peerId);
859
859
  if (session) {
860
- await this.db.delete("messages", { id: session["id"] });
860
+ await this.db.delete("sessions", { id: session["id"] });
861
861
  }
862
862
  }
863
863
  async shouldClear(session, opts) {
@@ -876,7 +876,7 @@ var SessionManager = class {
876
876
  return false;
877
877
  }
878
878
  async _find(agentId, channelId, peerId) {
879
- const rows = await this.db.query("messages", {
879
+ const rows = await this.db.query("sessions", {
880
880
  where: { agent_id: agentId, channel: channelId, peer_id: peerId }
881
881
  });
882
882
  return rows[0] ?? void 0;
@@ -1369,20 +1369,41 @@ function defineCoreTables(db) {
1369
1369
  ]
1370
1370
  });
1371
1371
  db.define("messages", {
1372
+ columns: {
1373
+ id: "TEXT PRIMARY KEY",
1374
+ channel: "TEXT NOT NULL DEFAULT 'slack'",
1375
+ direction: "TEXT NOT NULL DEFAULT 'inbound'",
1376
+ from_user: "TEXT",
1377
+ from_agent: "TEXT",
1378
+ agent_id: "TEXT",
1379
+ user_id: "TEXT",
1380
+ body: "TEXT NOT NULL",
1381
+ thread_id: "TEXT",
1382
+ task_id: "TEXT",
1383
+ created_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
1384
+ deleted_at: "TEXT"
1385
+ },
1386
+ tableConstraints: [
1387
+ "CREATE INDEX IF NOT EXISTS idx_messages_created ON messages(created_at)",
1388
+ "CREATE INDEX IF NOT EXISTS idx_messages_thread ON messages(thread_id)",
1389
+ "CREATE INDEX IF NOT EXISTS idx_messages_agent ON messages(agent_id)"
1390
+ ]
1391
+ });
1392
+ db.define("sessions", {
1372
1393
  columns: {
1373
1394
  id: "TEXT PRIMARY KEY",
1374
1395
  agent_id: "TEXT NOT NULL",
1375
1396
  channel: "TEXT NOT NULL",
1376
1397
  peer_id: "TEXT NOT NULL",
1377
1398
  user_id: "TEXT",
1378
- last_message_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
1379
- message_count: "INTEGER NOT NULL DEFAULT 0",
1380
1399
  context: "TEXT NOT NULL DEFAULT '{}'",
1400
+ message_count: "INTEGER NOT NULL DEFAULT 0",
1401
+ last_message_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
1381
1402
  created_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
1382
1403
  expires_at: "TEXT"
1383
1404
  },
1384
1405
  tableConstraints: [
1385
- "CREATE UNIQUE INDEX IF NOT EXISTS idx_messages_agent_channel_peer ON messages(agent_id, channel, peer_id)"
1406
+ "CREATE UNIQUE INDEX IF NOT EXISTS idx_sessions_agent_channel_peer ON sessions(agent_id, channel, peer_id)"
1386
1407
  ]
1387
1408
  });
1388
1409
  db.define("skills", {
@@ -1671,6 +1692,55 @@ ${s.definition}` : null,
1671
1692
  }
1672
1693
  }
1673
1694
  });
1695
+ db.defineEntityContext("messages", {
1696
+ table: "messages",
1697
+ directory: "messages",
1698
+ slugColumn: "id",
1699
+ indexFile: "messages/MESSAGES.md",
1700
+ indexRender: (rows) => {
1701
+ const active = rows.filter((r) => r.deleted_at == null);
1702
+ if (!active.length) return "# Messages\n\nNo messages.\n";
1703
+ const recent = active.slice(-100);
1704
+ const lines = recent.map((r) => {
1705
+ const dir = r.direction === "outbound" ? "\u2192" : "\u2190";
1706
+ const who = r.from_agent ?? r.from_user ?? "unknown";
1707
+ const time = (r.created_at ?? "").slice(0, 16);
1708
+ const preview = (r.body ?? "").slice(0, 80);
1709
+ return `- ${dir} **${who}** (${time}): ${preview}`;
1710
+ });
1711
+ return `# Messages
1712
+
1713
+ Last ${lines.length} messages:
1714
+
1715
+ ${lines.join("\n")}
1716
+ `;
1717
+ },
1718
+ files: {
1719
+ "MESSAGE.md": {
1720
+ source: { type: "self" },
1721
+ render: (rows) => {
1722
+ const m = rows[0];
1723
+ if (!m) return "";
1724
+ return [
1725
+ "# Message",
1726
+ "",
1727
+ `**Direction:** ${m.direction}`,
1728
+ m.from_user ? `**From User:** ${m.from_user}` : null,
1729
+ m.from_agent ? `**From Agent:** ${m.from_agent}` : null,
1730
+ `**Channel:** ${m.channel}`,
1731
+ m.thread_id ? `**Thread:** ${m.thread_id}` : null,
1732
+ m.task_id ? `**Task:** ${m.task_id}` : null,
1733
+ `**Time:** ${m.created_at}`,
1734
+ "",
1735
+ "---",
1736
+ "",
1737
+ m.body,
1738
+ ""
1739
+ ].filter(Boolean).join("\n");
1740
+ }
1741
+ }
1742
+ }
1743
+ });
1674
1744
  }
1675
1745
 
1676
1746
  // src/core/data/domain-schema.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "botinabox",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Bot in a Box — framework for building multi-agent bots",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",