@basegrid_tech/mcp 0.18.6 → 0.18.8
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.js +70 -13
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -74,6 +74,7 @@ var QUICK_COMMAND_LIMITS = {
|
|
|
74
74
|
maxBody: 4e3,
|
|
75
75
|
maxShellPath: 512
|
|
76
76
|
};
|
|
77
|
+
var DEFAULT_FONT_SIZE = 13;
|
|
77
78
|
|
|
78
79
|
// ../shared/src/agent-defaults.ts
|
|
79
80
|
var DEFAULT_AGENT_COMMANDS = {
|
|
@@ -283,7 +284,7 @@ function initDatabase() {
|
|
|
283
284
|
createSchema();
|
|
284
285
|
seedSystemDefaults();
|
|
285
286
|
} catch (err) {
|
|
286
|
-
logger_default.error("[database] Failed to open database
|
|
287
|
+
logger_default.error({ err }, "[database] Failed to open database");
|
|
287
288
|
const message = err instanceof Error ? err.message : String(err);
|
|
288
289
|
const isCorrupt = /corrupt|notadb|malformed|not a database|file is not a database/i.test(
|
|
289
290
|
message
|
|
@@ -348,7 +349,7 @@ function recoverCorruptDatabase() {
|
|
|
348
349
|
if (fs3.existsSync(file)) fs3.unlinkSync(file);
|
|
349
350
|
}
|
|
350
351
|
} catch (backupErr) {
|
|
351
|
-
logger_default.error("[database] Failed to back up corrupt database
|
|
352
|
+
logger_default.error({ err: backupErr }, "[database] Failed to back up corrupt database");
|
|
352
353
|
}
|
|
353
354
|
try {
|
|
354
355
|
db = new Database(DB_PATH);
|
|
@@ -358,7 +359,7 @@ function recoverCorruptDatabase() {
|
|
|
358
359
|
seedSystemDefaults();
|
|
359
360
|
logger_default.info("[database] Successfully created fresh database after corruption recovery");
|
|
360
361
|
} catch (freshErr) {
|
|
361
|
-
logger_default.error("[database] Failed to create fresh database after corruption
|
|
362
|
+
logger_default.error({ err: freshErr }, "[database] Failed to create fresh database after corruption");
|
|
362
363
|
throw freshErr;
|
|
363
364
|
}
|
|
364
365
|
logger_default.warn(`[database] Database was corrupted and has been reset. Backup saved to: ${backupPath}`);
|
|
@@ -528,6 +529,7 @@ function createSchema() {
|
|
|
528
529
|
email TEXT NOT NULL,
|
|
529
530
|
plan TEXT NOT NULL DEFAULT 'free',
|
|
530
531
|
plan_expires_at TEXT,
|
|
532
|
+
member_since TEXT,
|
|
531
533
|
encrypted_access_token TEXT NOT NULL,
|
|
532
534
|
encrypted_refresh_token TEXT NOT NULL,
|
|
533
535
|
token_expires_at INTEGER NOT NULL,
|
|
@@ -703,6 +705,10 @@ function createSchema() {
|
|
|
703
705
|
ON session_activity(agent_session_id, id);
|
|
704
706
|
CREATE INDEX IF NOT EXISTS idx_session_activity_terminal
|
|
705
707
|
ON session_activity(terminal_id, id);
|
|
708
|
+
-- \u0422\u0435\u043F\u043B\u043E\u0432\u0430\u044F \u043A\u0430\u0440\u0442\u0430 Home \u0447\u0438\u0442\u0430\u0435\u0442 \u043E\u043A\u043D\u043E \u043F\u043E \u0432\u0440\u0435\u043C\u0435\u043D\u0438, \u0430 \u043D\u0435 \u043F\u043E \u0441\u0435\u0441\u0441\u0438\u0438: \u0431\u0435\u0437 \u044D\u0442\u043E\u0433\u043E
|
|
709
|
+
-- \u0438\u043D\u0434\u0435\u043A\u0441\u0430 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044F \u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0435\u0442 \u0442\u0430\u0431\u043B\u0438\u0446\u0443 \u0446\u0435\u043B\u0438\u043A\u043E\u043C (\u043E\u043D\u0430 \u0440\u0430\u0441\u0442\u0451\u0442 \u0432\u0435\u0447\u043D\u043E, prune \u043D\u0435\u0442).
|
|
710
|
+
CREATE INDEX IF NOT EXISTS idx_session_activity_ts
|
|
711
|
+
ON session_activity(timestamp);
|
|
706
712
|
|
|
707
713
|
-- \u0413\u0430\u043B\u0435\u0440\u0435\u044F \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u043E\u0432. \u041E\u0434\u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0430 = \u043E\u0434\u043D\u0430 \u0432\u0435\u0440\u0441\u0438\u044F \u043E\u0434\u043D\u043E\u0433\u043E \u0444\u0430\u0439\u043B\u0430; \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0432
|
|
708
714
|
-- UI \u2014 \u044D\u0442\u043E \u0433\u0440\u0443\u043F\u043F\u0430 \u0441\u0442\u0440\u043E\u043A \u0441 \u043E\u0431\u0449\u0438\u043C group_key (\u043F\u043E\u0441\u043B\u0435\u0434\u043D\u044F\u044F \u0432\u0435\u0440\u0441\u0438\u044F + \u0441\u0447\u0451\u0442\u0447\u0438\u043A).
|
|
@@ -1327,6 +1333,7 @@ function migrateSchema(d) {
|
|
|
1327
1333
|
email TEXT NOT NULL,
|
|
1328
1334
|
plan TEXT NOT NULL DEFAULT 'free',
|
|
1329
1335
|
plan_expires_at TEXT,
|
|
1336
|
+
member_since TEXT,
|
|
1330
1337
|
encrypted_access_token TEXT NOT NULL,
|
|
1331
1338
|
encrypted_refresh_token TEXT NOT NULL,
|
|
1332
1339
|
token_expires_at INTEGER NOT NULL,
|
|
@@ -1571,9 +1578,48 @@ function migrateSchema(d) {
|
|
|
1571
1578
|
})();
|
|
1572
1579
|
logger_default.info("[database] migrated schema to version 35 (video artifact type)");
|
|
1573
1580
|
}
|
|
1581
|
+
if (version < 36) {
|
|
1582
|
+
d.transaction(() => {
|
|
1583
|
+
d.exec(`
|
|
1584
|
+
CREATE TABLE IF NOT EXISTS pending_worktree_cleanup (
|
|
1585
|
+
worktree_path TEXT PRIMARY KEY,
|
|
1586
|
+
project_path TEXT NOT NULL,
|
|
1587
|
+
last_error TEXT NOT NULL,
|
|
1588
|
+
attempts INTEGER NOT NULL DEFAULT 0,
|
|
1589
|
+
updated_at INTEGER NOT NULL
|
|
1590
|
+
);
|
|
1591
|
+
`);
|
|
1592
|
+
d.prepare(
|
|
1593
|
+
"INSERT OR REPLACE INTO schema_meta (key, value) VALUES ('schema_version', '36')"
|
|
1594
|
+
).run();
|
|
1595
|
+
})();
|
|
1596
|
+
logger_default.info("[database] migrated schema to version 36 (persistent worktree cleanup queue)");
|
|
1597
|
+
}
|
|
1598
|
+
if (version < 37) {
|
|
1599
|
+
d.transaction(() => {
|
|
1600
|
+
d.exec(`
|
|
1601
|
+
CREATE INDEX IF NOT EXISTS idx_session_activity_ts
|
|
1602
|
+
ON session_activity(timestamp);
|
|
1603
|
+
`);
|
|
1604
|
+
d.prepare(
|
|
1605
|
+
"INSERT OR REPLACE INTO schema_meta (key, value) VALUES ('schema_version', '37')"
|
|
1606
|
+
).run();
|
|
1607
|
+
})();
|
|
1608
|
+
logger_default.info("[database] migrated schema to version 37 (session_activity timestamp index)");
|
|
1609
|
+
}
|
|
1574
1610
|
}
|
|
1575
1611
|
function verifySchema(d) {
|
|
1576
1612
|
const expectedTables = [
|
|
1613
|
+
{
|
|
1614
|
+
name: "pending_worktree_cleanup",
|
|
1615
|
+
ddl: `CREATE TABLE IF NOT EXISTS pending_worktree_cleanup (
|
|
1616
|
+
worktree_path TEXT PRIMARY KEY,
|
|
1617
|
+
project_path TEXT NOT NULL,
|
|
1618
|
+
last_error TEXT NOT NULL,
|
|
1619
|
+
attempts INTEGER NOT NULL DEFAULT 0,
|
|
1620
|
+
updated_at INTEGER NOT NULL
|
|
1621
|
+
)`
|
|
1622
|
+
},
|
|
1577
1623
|
{
|
|
1578
1624
|
name: "source_connections",
|
|
1579
1625
|
ddl: `CREATE TABLE IF NOT EXISTS source_connections (
|
|
@@ -1629,7 +1675,7 @@ function verifySchema(d) {
|
|
|
1629
1675
|
d.exec(ddl);
|
|
1630
1676
|
logger_default.warn(`[database] self-heal: created missing table ${name}`);
|
|
1631
1677
|
} catch (err) {
|
|
1632
|
-
logger_default.error(`[database] self-heal: failed to create table ${name}
|
|
1678
|
+
logger_default.error({ err }, `[database] self-heal: failed to create table ${name}`);
|
|
1633
1679
|
}
|
|
1634
1680
|
}
|
|
1635
1681
|
const expectedByTable = {
|
|
@@ -1757,7 +1803,8 @@ function verifySchema(d) {
|
|
|
1757
1803
|
ddl: "ALTER TABLE external_worktree_settings ADD COLUMN hidden_paths TEXT NOT NULL DEFAULT '[]'"
|
|
1758
1804
|
}
|
|
1759
1805
|
],
|
|
1760
|
-
quick_commands: [{ column: "shell", ddl: "ALTER TABLE quick_commands ADD COLUMN shell TEXT" }]
|
|
1806
|
+
quick_commands: [{ column: "shell", ddl: "ALTER TABLE quick_commands ADD COLUMN shell TEXT" }],
|
|
1807
|
+
account: [{ column: "member_since", ddl: "ALTER TABLE account ADD COLUMN member_since TEXT" }]
|
|
1761
1808
|
};
|
|
1762
1809
|
for (const [table, columns] of Object.entries(expectedByTable)) {
|
|
1763
1810
|
const existing = new Set(
|
|
@@ -1769,7 +1816,7 @@ function verifySchema(d) {
|
|
|
1769
1816
|
d.exec(ddl);
|
|
1770
1817
|
logger_default.warn(`[database] self-heal: added missing column ${table}.${column}`);
|
|
1771
1818
|
} catch (err) {
|
|
1772
|
-
logger_default.error(`[database] self-heal: failed to add ${table}.${column}
|
|
1819
|
+
logger_default.error({ err }, `[database] self-heal: failed to add ${table}.${column}`);
|
|
1773
1820
|
}
|
|
1774
1821
|
}
|
|
1775
1822
|
}
|
|
@@ -1901,7 +1948,7 @@ function loadDefaults(d) {
|
|
|
1901
1948
|
defaults: {
|
|
1902
1949
|
...result,
|
|
1903
1950
|
shell: result.shell ?? defaultShell,
|
|
1904
|
-
fontSize: result.fontSize ??
|
|
1951
|
+
fontSize: result.fontSize ?? DEFAULT_FONT_SIZE,
|
|
1905
1952
|
theme: result.theme ?? "dark"
|
|
1906
1953
|
},
|
|
1907
1954
|
unknownKeys
|
|
@@ -2535,6 +2582,8 @@ function listWorkflowRunsByTask(taskId, limit = 20) {
|
|
|
2535
2582
|
nodeStates: nodesByRunId.get(r.id) ?? []
|
|
2536
2583
|
}));
|
|
2537
2584
|
}
|
|
2585
|
+
var HEATMAP_MAX_WINDOW_MS = 7 * 24 * 60 * 60 * 1e3;
|
|
2586
|
+
var HEATMAP_MAX_BUCKET_MS = 60 * 60 * 1e3;
|
|
2538
2587
|
var LIMIT_HISTORY_WINDOW_MINUTES = {
|
|
2539
2588
|
session: 300,
|
|
2540
2589
|
// Claude, 5 часов
|
|
@@ -2567,11 +2616,19 @@ var ConfigManager = class {
|
|
|
2567
2616
|
closeDatabase();
|
|
2568
2617
|
}
|
|
2569
2618
|
/** Полный сброс — удаляет БД и переинициализирует пустую схему.
|
|
2570
|
-
* Инвалидирует кэш и будит подписчиков, чтобы UI увидел пустой конфиг.
|
|
2619
|
+
* Инвалидирует кэш и будит подписчиков, чтобы UI увидел пустой конфиг.
|
|
2620
|
+
* Вотчер останавливаем только на время сброса и сразу поднимаем обратно:
|
|
2621
|
+
* иначе `.db-signal`-touch'и от внешних писателей (MCP stdio-процесс)
|
|
2622
|
+
* игнорировались бы до перезапуска сервера. */
|
|
2571
2623
|
factoryReset() {
|
|
2624
|
+
const wasWatching = this.dbWatcher !== null;
|
|
2572
2625
|
this.stopWatchingDb();
|
|
2573
2626
|
this.cachedConfig = null;
|
|
2574
|
-
|
|
2627
|
+
try {
|
|
2628
|
+
factoryResetDatabase();
|
|
2629
|
+
} finally {
|
|
2630
|
+
if (wasWatching) this.watchDb();
|
|
2631
|
+
}
|
|
2575
2632
|
this.notifyChanged();
|
|
2576
2633
|
}
|
|
2577
2634
|
loadConfig() {
|
|
@@ -2582,12 +2639,12 @@ var ConfigManager = class {
|
|
|
2582
2639
|
this.cachedConfig = seeded;
|
|
2583
2640
|
return seeded;
|
|
2584
2641
|
} catch (err) {
|
|
2585
|
-
logger_default.error("[config-manager] loadConfig failed, returning defaults
|
|
2642
|
+
logger_default.error({ err }, "[config-manager] loadConfig failed, returning defaults");
|
|
2586
2643
|
return {
|
|
2587
2644
|
version: 1,
|
|
2588
2645
|
defaults: {
|
|
2589
2646
|
shell: process.platform === "win32" ? process.env.COMSPEC || "powershell.exe" : process.env.SHELL || "/bin/zsh",
|
|
2590
|
-
fontSize:
|
|
2647
|
+
fontSize: DEFAULT_FONT_SIZE,
|
|
2591
2648
|
theme: "dark"
|
|
2592
2649
|
},
|
|
2593
2650
|
projects: [],
|
|
@@ -2672,7 +2729,7 @@ var ConfigManager = class {
|
|
|
2672
2729
|
saveConfig(config);
|
|
2673
2730
|
this.cachedConfig = null;
|
|
2674
2731
|
} catch (err) {
|
|
2675
|
-
logger_default.error("[config-manager] saveConfig failed
|
|
2732
|
+
logger_default.error({ err }, "[config-manager] saveConfig failed");
|
|
2676
2733
|
throw err;
|
|
2677
2734
|
}
|
|
2678
2735
|
}
|
|
@@ -4505,7 +4562,7 @@ console.warn = (...args) => _origError("[mcp:warn]", ...args);
|
|
|
4505
4562
|
console.error = (...args) => _origError("[mcp:error]", ...args);
|
|
4506
4563
|
async function main() {
|
|
4507
4564
|
configManager.init();
|
|
4508
|
-
const version = true ? "0.18.
|
|
4565
|
+
const version = true ? "0.18.8" : createRequire(import.meta.url)("../package.json").version;
|
|
4509
4566
|
const server = createMcpServer(version);
|
|
4510
4567
|
const transport = new StdioServerTransport();
|
|
4511
4568
|
await server.connect(transport);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@basegrid_tech/mcp",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.8",
|
|
4
4
|
"description": "BaseGrid MCP server — task management, git, and workflow tools for AI coding agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
"zod": "^4.3.6"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@basegrid/server": "0.18.
|
|
46
|
-
"@basegrid/shared": "0.18.
|
|
45
|
+
"@basegrid/server": "0.18.8",
|
|
46
|
+
"@basegrid/shared": "0.18.8",
|
|
47
47
|
"tsup": "^8.5.1",
|
|
48
48
|
"tsx": "^4.21.0",
|
|
49
49
|
"typescript": "^6.0.3"
|