@vibegrid/mcp 0.4.0-beta.0 → 0.4.0-beta.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 (2) hide show
  1. package/dist/index.js +164 -2
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -237,7 +237,8 @@ function createSchema() {
237
237
  remote_host_label TEXT,
238
238
  hook_session_id TEXT,
239
239
  status_source TEXT,
240
- saved_at INTEGER
240
+ saved_at INTEGER,
241
+ sort_order INTEGER NOT NULL DEFAULT 0
241
242
  );
242
243
 
243
244
  CREATE TABLE IF NOT EXISTS schedule_log (
@@ -300,6 +301,34 @@ function createSchema() {
300
301
  CREATE INDEX IF NOT EXISTS idx_workflow_runs_task ON workflow_runs(trigger_task_id);
301
302
  CREATE INDEX IF NOT EXISTS idx_workflow_run_nodes_run ON workflow_run_nodes(run_id);
302
303
  CREATE INDEX IF NOT EXISTS idx_workflow_run_nodes_task ON workflow_run_nodes(task_id);
304
+
305
+ CREATE TABLE IF NOT EXISTS session_logs (
306
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
307
+ task_id TEXT NOT NULL,
308
+ session_id TEXT NOT NULL,
309
+ agent_type TEXT,
310
+ branch TEXT,
311
+ status TEXT NOT NULL DEFAULT 'running',
312
+ started_at TEXT NOT NULL,
313
+ completed_at TEXT,
314
+ exit_code INTEGER,
315
+ logs TEXT,
316
+ project_name TEXT
317
+ );
318
+
319
+ CREATE INDEX IF NOT EXISTS idx_session_logs_task ON session_logs(task_id);
320
+ CREATE INDEX IF NOT EXISTS idx_session_logs_session ON session_logs(session_id);
321
+
322
+ CREATE TABLE IF NOT EXISTS session_events (
323
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
324
+ session_id TEXT NOT NULL,
325
+ event_type TEXT NOT NULL,
326
+ timestamp TEXT NOT NULL,
327
+ metadata TEXT
328
+ );
329
+
330
+ CREATE INDEX IF NOT EXISTS idx_session_events_session ON session_events(session_id, timestamp DESC);
331
+ CREATE INDEX IF NOT EXISTS idx_session_events_type ON session_events(event_type, timestamp DESC);
303
332
  `);
304
333
  migrateSchema(d);
305
334
  }
@@ -359,6 +388,18 @@ function migrateSchema(d) {
359
388
  })();
360
389
  logger_default.info("[database] migrated schema to version 2 (ssh credential vault)");
361
390
  }
391
+ if (version < 3) {
392
+ d.transaction(() => {
393
+ const sessionCols = d.prepare("PRAGMA table_info(sessions)").all();
394
+ if (!sessionCols.some((c) => c.name === "sort_order")) {
395
+ d.exec("ALTER TABLE sessions ADD COLUMN sort_order INTEGER NOT NULL DEFAULT 0");
396
+ }
397
+ d.prepare(
398
+ "INSERT OR REPLACE INTO schema_meta (key, value) VALUES ('schema_version', '3')"
399
+ ).run();
400
+ })();
401
+ logger_default.info("[database] migrated schema to version 3 (session sort order)");
402
+ }
362
403
  }
363
404
  function loadConfig() {
364
405
  const d = getDb();
@@ -1648,6 +1689,91 @@ function registerSessionTools(server) {
1648
1689
  }
1649
1690
  }
1650
1691
  );
1692
+ server.tool(
1693
+ "rename_session",
1694
+ "Rename a terminal session. Changes the display name shown in the UI.",
1695
+ {
1696
+ id: V.id.describe("Session ID"),
1697
+ display_name: V.shortText.describe("New display name")
1698
+ },
1699
+ async (args) => {
1700
+ try {
1701
+ await rpcCall("terminal:rename", { id: args.id, displayName: args.display_name });
1702
+ return {
1703
+ content: [{ type: "text", text: `Renamed session ${args.id} to "${args.display_name}"` }]
1704
+ };
1705
+ } catch (err) {
1706
+ return {
1707
+ content: [
1708
+ {
1709
+ type: "text",
1710
+ text: `Error renaming session: ${err instanceof Error ? err.message : err}`
1711
+ }
1712
+ ],
1713
+ isError: true
1714
+ };
1715
+ }
1716
+ }
1717
+ );
1718
+ server.tool(
1719
+ "reorder_sessions",
1720
+ "Reorder terminal sessions in the grid. Provide session IDs in the desired display order.",
1721
+ {
1722
+ session_ids: z4.array(V.id).min(1, "At least one session ID is required").describe("Session IDs in desired order")
1723
+ },
1724
+ async (args) => {
1725
+ try {
1726
+ await rpcCall("terminal:reorder", args.session_ids);
1727
+ return {
1728
+ content: [
1729
+ {
1730
+ type: "text",
1731
+ text: `Reordered ${args.session_ids.length} sessions`
1732
+ }
1733
+ ]
1734
+ };
1735
+ } catch (err) {
1736
+ return {
1737
+ content: [
1738
+ {
1739
+ type: "text",
1740
+ text: `Error reordering sessions: ${err instanceof Error ? err.message : err}`
1741
+ }
1742
+ ],
1743
+ isError: true
1744
+ };
1745
+ }
1746
+ }
1747
+ );
1748
+ server.tool(
1749
+ "read_session_output",
1750
+ "Read terminal output from a running session. Output is stored in a rolling 1000-line buffer with ANSI codes stripped.",
1751
+ {
1752
+ id: V.id.describe("Session ID"),
1753
+ lines: z4.number().int().min(1).max(1e3).optional().describe("Number of lines to read from the end (default: all)")
1754
+ },
1755
+ async (args) => {
1756
+ try {
1757
+ const output = await rpcCall("terminal:readOutput", {
1758
+ id: args.id,
1759
+ lines: args.lines
1760
+ });
1761
+ return {
1762
+ content: [{ type: "text", text: output.join("\n") }]
1763
+ };
1764
+ } catch (err) {
1765
+ return {
1766
+ content: [
1767
+ {
1768
+ type: "text",
1769
+ text: `Error reading session output: ${err instanceof Error ? err.message : err}`
1770
+ }
1771
+ ],
1772
+ isError: true
1773
+ };
1774
+ }
1775
+ }
1776
+ );
1651
1777
  server.tool(
1652
1778
  "write_to_terminal",
1653
1779
  "Send input to a running terminal session. Requires the VibeGrid app to be running.",
@@ -1674,6 +1800,42 @@ function registerSessionTools(server) {
1674
1800
  }
1675
1801
  }
1676
1802
  );
1803
+ server.tool(
1804
+ "list_session_events",
1805
+ "List session lifecycle events (created, exited, task_linked, renamed, archived, unarchived). Use for post-mortem analysis and multi-agent coordination.",
1806
+ {
1807
+ session_id: V.id.optional().describe("Filter by session ID"),
1808
+ event_type: z4.enum(["created", "exited", "task_linked", "renamed", "archived", "unarchived"]).optional().describe("Filter by event type"),
1809
+ limit: z4.number().int().min(1).max(200).optional().describe("Max events to return (default: 50)")
1810
+ },
1811
+ async (args) => {
1812
+ try {
1813
+ let events;
1814
+ if (args.session_id) {
1815
+ events = await rpcCall("sessionEvent:listBySession", {
1816
+ sessionId: args.session_id,
1817
+ limit: args.limit ?? 50
1818
+ });
1819
+ } else {
1820
+ events = await rpcCall("sessionEvent:list", {
1821
+ eventType: args.event_type,
1822
+ limit: args.limit ?? 50
1823
+ });
1824
+ }
1825
+ return { content: [{ type: "text", text: JSON.stringify(events, null, 2) }] };
1826
+ } catch (err) {
1827
+ return {
1828
+ content: [
1829
+ {
1830
+ type: "text",
1831
+ text: `Error listing session events: ${err instanceof Error ? err.message : err}`
1832
+ }
1833
+ ],
1834
+ isError: true
1835
+ };
1836
+ }
1837
+ }
1838
+ );
1677
1839
  }
1678
1840
 
1679
1841
  // src/tools/workflows.ts
@@ -2053,7 +2215,7 @@ console.warn = (...args) => _origError("[mcp:warn]", ...args);
2053
2215
  console.error = (...args) => _origError("[mcp:error]", ...args);
2054
2216
  async function main() {
2055
2217
  configManager.init();
2056
- const version = true ? "0.4.0-beta.0" : createRequire(import.meta.url)("../package.json").version;
2218
+ const version = true ? "0.4.0-beta.2" : createRequire(import.meta.url)("../package.json").version;
2057
2219
  const server = createMcpServer(version);
2058
2220
  const transport = new StdioServerTransport();
2059
2221
  await server.connect(transport);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibegrid/mcp",
3
- "version": "0.4.0-beta.0",
3
+ "version": "0.4.0-beta.2",
4
4
  "description": "VibeGrid MCP server — task management, git, and workflow tools for AI coding agents",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -33,7 +33,7 @@
33
33
  "dependencies": {
34
34
  "@modelcontextprotocol/sdk": "^1.28.0",
35
35
  "libsql": "^0.5.22",
36
- "pino": "^9.6.0",
36
+ "pino": "^10.3.1",
37
37
  "ws": "^8.18.0",
38
38
  "zod": "^3.23.0"
39
39
  },