@basegrid_tech/mcp 0.15.2 → 0.16.0

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 +204 -10
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -8,19 +8,59 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
8
8
  import fs4 from "fs";
9
9
 
10
10
  // ../shared/src/types.ts
11
- var CLAUDE_DEFAULT_MODEL_ID = "claude-sonnet-5";
11
+ var CLAUDE_DEFAULT_MODEL_ID = "claude-opus-5";
12
12
  var CLAUDE_DEFAULT_EFFORT = "medium";
13
13
  var CLAUDE_OBSOLETE_MODEL_IDS = [
14
14
  "claude-opus-4-7[1m]",
15
- "claude-opus-4-6[1m]"
15
+ "claude-opus-4-6[1m]",
16
+ // Opus 4.1 уходит в retirement 2026-08-05 — после этой даты Anthropic
17
+ // отвечает 404, поэтому убран из пикера и мигрируется на дефолт.
18
+ "claude-opus-4-1"
16
19
  ];
17
- var CODEX_DEFAULT_MODEL_ID = "gpt-5.5";
20
+ var CODEX_EFFORT_LEVELS = [
21
+ "low",
22
+ "medium",
23
+ "high",
24
+ "xhigh",
25
+ "max",
26
+ "ultra"
27
+ ];
28
+ var CODEX_DEFAULT_MODEL_ID = "gpt-5.6-terra";
18
29
  var CODEX_OBSOLETE_MODEL_IDS = [
19
30
  "gpt-5-codex",
20
- "gpt-5.4-mini",
21
- "gpt-5.2"
31
+ "gpt-5.2",
32
+ // Выпали из shipping-списка CLI к 0.145.0. `gpt-5.4-mini` наоборот
33
+ // вернулся в пикер, поэтому в obsolete его больше нет.
34
+ "gpt-5.4",
35
+ "gpt-5.3-codex-spark",
36
+ "gpt-5.3-codex",
37
+ "gpt-5.2-codex"
22
38
  ];
23
39
  var CODEX_DEFAULT_EFFORT = "medium";
40
+ var CODEX_EFFORTS_BY_MODEL = {
41
+ "gpt-5.6-terra": ["low", "medium", "high", "xhigh", "max", "ultra"],
42
+ "gpt-5.6-luna": ["low", "medium", "high", "xhigh", "max"],
43
+ "gpt-5.5": ["low", "medium", "high", "xhigh"],
44
+ "gpt-5.4-mini": ["low", "medium", "high", "xhigh"]
45
+ };
46
+ var CODEX_EFFORTS_FALLBACK = ["low", "medium", "high", "xhigh"];
47
+ function getCodexEfforts(model) {
48
+ if (!model) return CODEX_EFFORTS_FALLBACK;
49
+ return CODEX_EFFORTS_BY_MODEL[model] ?? CODEX_EFFORTS_FALLBACK;
50
+ }
51
+ function normalizeCodexEffort(value, model) {
52
+ const supported = getCodexEfforts(model);
53
+ const raw = value === "minimal" ? "low" : value;
54
+ if (typeof raw === "string" && supported.includes(raw)) {
55
+ return raw;
56
+ }
57
+ const idx = CODEX_EFFORT_LEVELS.indexOf(raw);
58
+ if (idx < 0) return CODEX_DEFAULT_EFFORT;
59
+ for (let i = idx; i >= 0; i--) {
60
+ if (supported.includes(CODEX_EFFORT_LEVELS[i])) return CODEX_EFFORT_LEVELS[i];
61
+ }
62
+ return CODEX_DEFAULT_EFFORT;
63
+ }
24
64
  var DEFAULT_WORKSPACE = {
25
65
  id: "personal",
26
66
  name: "Personal",
@@ -513,6 +553,23 @@ function createSchema() {
513
553
  value TEXT NOT NULL
514
554
  );
515
555
 
556
+ -- \u0423\u0434\u0430\u043B\u0451\u043D\u043D\u044B\u0439 \u0434\u043E\u0441\u0442\u0443\u043F \u0441 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430: \u043E\u0434\u0438\u043D \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0439 VPS \u043D\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u043B\u044F\u0446\u0438\u044E.
557
+ -- \u0421\u0442\u0440\u043E\u043A\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u043E\u0434\u043D\u0430 (id = 'default'); \u043F\u0440\u0438 \u043F\u0435\u0440\u0435\u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0435 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u044B\u0432\u0430\u0435\u0442\u0441\u044F.
558
+ -- \u041F\u0430\u0440\u043E\u043B\u044C root \u041D\u0415 \u0445\u0440\u0430\u043D\u0438\u043C \u2014 \u043E\u043D \u043D\u0443\u0436\u0435\u043D \u0442\u043E\u043B\u044C\u043A\u043E \u043D\u0430 \u0432\u0440\u0435\u043C\u044F \u043F\u0435\u0440\u0432\u043E\u0439 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0438,
559
+ -- \u0434\u0430\u043B\u044C\u0448\u0435 \u0432\u0445\u043E\u0434 \u043F\u043E \u043A\u043B\u044E\u0447\u0443.
560
+ CREATE TABLE IF NOT EXISTS remote_access (
561
+ id TEXT PRIMARY KEY,
562
+ host TEXT NOT NULL,
563
+ ssh_user TEXT NOT NULL,
564
+ ssh_port INTEGER NOT NULL DEFAULT 22,
565
+ domain TEXT NOT NULL,
566
+ token TEXT NOT NULL,
567
+ tunnel_user TEXT NOT NULL,
568
+ remote_port INTEGER NOT NULL,
569
+ created_at TEXT NOT NULL,
570
+ updated_at TEXT NOT NULL
571
+ );
572
+
516
573
  CREATE TABLE IF NOT EXISTS tasks (
517
574
  id TEXT PRIMARY KEY,
518
575
  project_name TEXT NOT NULL,
@@ -675,6 +732,12 @@ function createSchema() {
675
732
  updated_at INTEGER NOT NULL
676
733
  );
677
734
 
735
+ CREATE TABLE IF NOT EXISTS worktree_view_modes (
736
+ worktree_path TEXT PRIMARY KEY,
737
+ view_mode TEXT NOT NULL,
738
+ updated_at INTEGER NOT NULL
739
+ );
740
+
678
741
  CREATE TABLE IF NOT EXISTS worktree_list_cache (
679
742
  project_path TEXT NOT NULL,
680
743
  worktree_path TEXT NOT NULL,
@@ -685,6 +748,7 @@ function createSchema() {
685
748
  alias_generated_at INTEGER,
686
749
  sort_order INTEGER NOT NULL DEFAULT 0,
687
750
  is_auto_generated INTEGER,
751
+ ownership TEXT,
688
752
  updated_at INTEGER NOT NULL,
689
753
  PRIMARY KEY (project_path, worktree_path)
690
754
  );
@@ -692,6 +756,17 @@ function createSchema() {
692
756
  CREATE INDEX IF NOT EXISTS idx_worktree_list_project
693
757
  ON worktree_list_cache(project_path);
694
758
 
759
+ CREATE TABLE IF NOT EXISTS external_worktree_settings (
760
+ project_path TEXT PRIMARY KEY,
761
+ visibility TEXT NOT NULL DEFAULT 'hide',
762
+ prompt_dismissed_at INTEGER,
763
+ discovery_suppressed_at INTEGER,
764
+ imported_paths TEXT NOT NULL DEFAULT '[]',
765
+ hidden_paths TEXT NOT NULL DEFAULT '[]',
766
+ baseline_paths TEXT NOT NULL DEFAULT '[]',
767
+ updated_at INTEGER NOT NULL
768
+ );
769
+
695
770
  CREATE TABLE IF NOT EXISTS usage_metrics (
696
771
  id INTEGER PRIMARY KEY AUTOINCREMENT,
697
772
  terminal_id TEXT NOT NULL,
@@ -724,6 +799,22 @@ function createSchema() {
724
799
  -- sparkline reads with, so no extra index is needed.
725
800
  CREATE UNIQUE INDEX IF NOT EXISTS idx_usage_limit_snap_unique
726
801
  ON usage_limit_snapshots(window_type, snapshot_at);
802
+
803
+ -- \u041F\u0440\u0438\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0430: \u0443 \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 \u0441\u0432\u043E\u0439 \u0442\u043E\u043A\u0435\u043D \u0432\u043C\u0435\u0441\u0442\u043E \u043E\u0431\u0449\u0435\u0433\u043E
804
+ -- \u043F\u0430\u0440\u043E\u043B\u044F. \u0425\u0440\u0430\u043D\u0438\u043C \u0442\u043E\u043B\u044C\u043A\u043E sha256 \u2014 \u0431\u0430\u0437\u0430 \u043B\u0435\u0436\u0438\u0442 \u043E\u0431\u044B\u0447\u043D\u044B\u043C \u0444\u0430\u0439\u043B\u043E\u043C, \u0438 \u0435\u0451 \u0443\u0442\u0435\u0447\u043A\u0430
805
+ -- \u043D\u0435 \u0434\u043E\u043B\u0436\u043D\u0430 \u0440\u0430\u0437\u0434\u0430\u0432\u0430\u0442\u044C \u0434\u043E\u0441\u0442\u0443\u043F. \u0418\u043D\u0434\u0435\u043A\u0441 \u043F\u043E \u0445\u0435\u0448\u0443: \u043F\u043E \u043D\u0435\u043C\u0443 \u0438\u0434\u0451\u0442 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430
806
+ -- \u043D\u0430 \u043A\u0430\u0436\u0434\u043E\u043C \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0438.
807
+ CREATE TABLE IF NOT EXISTS devices (
808
+ id TEXT PRIMARY KEY,
809
+ token_hash TEXT NOT NULL,
810
+ kind TEXT NOT NULL DEFAULT 'mobile',
811
+ name TEXT NOT NULL DEFAULT '',
812
+ paired_at INTEGER NOT NULL,
813
+ last_seen_at INTEGER NOT NULL,
814
+ revoked_at INTEGER
815
+ );
816
+
817
+ CREATE INDEX IF NOT EXISTS idx_devices_token_hash ON devices(token_hash);
727
818
  `);
728
819
  migrateSchema(d);
729
820
  verifySchema(d);
@@ -1306,6 +1397,73 @@ function migrateSchema(d) {
1306
1397
  })();
1307
1398
  logger_default.info("[database] migrated schema to version 27 (projects.basegrid_config overrides)");
1308
1399
  }
1400
+ if (version < 28) {
1401
+ d.transaction(() => {
1402
+ const cols = d.prepare("PRAGMA table_info(worktree_list_cache)").all();
1403
+ if (!cols.some((c) => c.name === "ownership")) {
1404
+ d.exec("ALTER TABLE worktree_list_cache ADD COLUMN ownership TEXT");
1405
+ }
1406
+ d.exec("UPDATE worktree_list_cache SET ownership = 'managed' WHERE ownership IS NULL");
1407
+ d.prepare(
1408
+ "INSERT OR REPLACE INTO schema_meta (key, value) VALUES ('schema_version', '28')"
1409
+ ).run();
1410
+ })();
1411
+ logger_default.info("[database] migrated schema to version 28 (worktree_list_cache.ownership)");
1412
+ }
1413
+ if (version < 29) {
1414
+ d.transaction(() => {
1415
+ d.exec(`
1416
+ CREATE TABLE IF NOT EXISTS external_worktree_settings (
1417
+ project_path TEXT PRIMARY KEY,
1418
+ visibility TEXT NOT NULL DEFAULT 'hide',
1419
+ prompt_dismissed_at INTEGER,
1420
+ discovery_suppressed_at INTEGER,
1421
+ imported_paths TEXT NOT NULL DEFAULT '[]',
1422
+ hidden_paths TEXT NOT NULL DEFAULT '[]',
1423
+ baseline_paths TEXT NOT NULL DEFAULT '[]',
1424
+ updated_at INTEGER NOT NULL
1425
+ );
1426
+ `);
1427
+ d.prepare(
1428
+ "INSERT OR REPLACE INTO schema_meta (key, value) VALUES ('schema_version', '29')"
1429
+ ).run();
1430
+ })();
1431
+ logger_default.info("[database] migrated schema to version 29 (external_worktree_settings)");
1432
+ }
1433
+ if (version < 30) {
1434
+ d.transaction(() => {
1435
+ const cols = d.prepare("PRAGMA table_info(external_worktree_settings)").all();
1436
+ if (!cols.some((c) => c.name === "hidden_paths")) {
1437
+ d.exec(
1438
+ "ALTER TABLE external_worktree_settings ADD COLUMN hidden_paths TEXT NOT NULL DEFAULT '[]'"
1439
+ );
1440
+ }
1441
+ d.prepare(
1442
+ "INSERT OR REPLACE INTO schema_meta (key, value) VALUES ('schema_version', '30')"
1443
+ ).run();
1444
+ })();
1445
+ logger_default.info("[database] migrated schema to version 30 (external_worktree_settings.hidden_paths)");
1446
+ }
1447
+ if (version < 31) {
1448
+ d.transaction(() => {
1449
+ d.exec(`
1450
+ CREATE TABLE IF NOT EXISTS devices (
1451
+ id TEXT PRIMARY KEY,
1452
+ token_hash TEXT NOT NULL,
1453
+ kind TEXT NOT NULL DEFAULT 'mobile',
1454
+ name TEXT NOT NULL DEFAULT '',
1455
+ paired_at INTEGER NOT NULL,
1456
+ last_seen_at INTEGER NOT NULL,
1457
+ revoked_at INTEGER
1458
+ );
1459
+ CREATE INDEX IF NOT EXISTS idx_devices_token_hash ON devices(token_hash);
1460
+ `);
1461
+ d.prepare(
1462
+ "INSERT OR REPLACE INTO schema_meta (key, value) VALUES ('schema_version', '31')"
1463
+ ).run();
1464
+ })();
1465
+ logger_default.info("[database] migrated schema to version 31 (devices)");
1466
+ }
1309
1467
  }
1310
1468
  function verifySchema(d) {
1311
1469
  const expectedTables = [
@@ -1472,6 +1630,16 @@ function verifySchema(d) {
1472
1630
  {
1473
1631
  column: "is_auto_generated",
1474
1632
  ddl: "ALTER TABLE worktree_list_cache ADD COLUMN is_auto_generated INTEGER"
1633
+ },
1634
+ {
1635
+ column: "ownership",
1636
+ ddl: "ALTER TABLE worktree_list_cache ADD COLUMN ownership TEXT"
1637
+ }
1638
+ ],
1639
+ external_worktree_settings: [
1640
+ {
1641
+ column: "hidden_paths",
1642
+ ddl: "ALTER TABLE external_worktree_settings ADD COLUMN hidden_paths TEXT NOT NULL DEFAULT '[]'"
1475
1643
  }
1476
1644
  ]
1477
1645
  };
@@ -1524,8 +1692,10 @@ var DEFAULTS_KEYS_MAP = {
1524
1692
  hasSeenOnboarding: true,
1525
1693
  widgetEnabled: true,
1526
1694
  minimizeToTray: true,
1695
+ singleMobileClient: true,
1527
1696
  slashCommandFallbackDescription: true,
1528
1697
  taskViewMode: true,
1698
+ usagePopoverMode: true,
1529
1699
  taskListCollapsedStatuses: true,
1530
1700
  layoutMode: true,
1531
1701
  mainViewMode: true,
@@ -2222,6 +2392,22 @@ function listWorkflowRunsByTask(taskId, limit = 20) {
2222
2392
  nodeStates: nodesByRunId.get(r.id) ?? []
2223
2393
  }));
2224
2394
  }
2395
+ var LIMIT_HISTORY_WINDOW_MINUTES = {
2396
+ session: 300,
2397
+ // Claude, 5 часов
2398
+ weekly: 10080,
2399
+ // Claude, 7 дней
2400
+ fable: 10080,
2401
+ // Claude Fable, 7 дней
2402
+ // Длительность окон Codex зависит от тарифа (free — одно 30-дневное ведро,
2403
+ // платные — 5ч + неделя), а сервер её не знает. Отдаём с запасом на 30 дней;
2404
+ // спарклайн в рендерере обрезает точки по реальному окну.
2405
+ "codex-session": 43200,
2406
+ "codex-weekly": 43200
2407
+ };
2408
+ var LIMIT_HISTORY_WINDOW_TYPES = Object.keys(
2409
+ LIMIT_HISTORY_WINDOW_MINUTES
2410
+ );
2225
2411
 
2226
2412
  // ../server/src/config-manager.ts
2227
2413
  var DB_DIR = getDataDir();
@@ -2308,20 +2494,28 @@ var ConfigManager = class {
2308
2494
  seedCodexDefaults(config) {
2309
2495
  const stored = config.defaults.codexDefaultModel;
2310
2496
  const needsModel = stored == null || typeof stored === "string" && CODEX_OBSOLETE_MODEL_IDS.includes(stored);
2311
- const needsEffort = config.defaults.codexDefaultEffort == null;
2312
- if (!needsModel && !needsEffort) return config;
2497
+ const model = needsModel ? CODEX_DEFAULT_MODEL_ID : stored;
2498
+ const storedEffort = config.defaults.codexDefaultEffort;
2499
+ const effort = storedEffort == null ? CODEX_DEFAULT_EFFORT : normalizeCodexEffort(storedEffort, model);
2500
+ const needsEffort = effort !== storedEffort;
2501
+ const storedReviewEffort = config.defaults.reviewCodexEffort;
2502
+ const reviewModel = config.defaults.reviewCodexModel ?? model;
2503
+ const reviewEffort = storedReviewEffort == null ? void 0 : normalizeCodexEffort(storedReviewEffort, reviewModel);
2504
+ const needsReviewEffort = reviewEffort !== void 0 && reviewEffort !== storedReviewEffort;
2505
+ if (!needsModel && !needsEffort && !needsReviewEffort) return config;
2313
2506
  const seeded = {
2314
2507
  ...config,
2315
2508
  defaults: {
2316
2509
  ...config.defaults,
2317
2510
  ...needsModel ? { codexDefaultModel: CODEX_DEFAULT_MODEL_ID } : {},
2318
- ...needsEffort ? { codexDefaultEffort: CODEX_DEFAULT_EFFORT } : {}
2511
+ ...needsEffort ? { codexDefaultEffort: effort } : {},
2512
+ ...needsReviewEffort ? { reviewCodexEffort: reviewEffort } : {}
2319
2513
  }
2320
2514
  };
2321
2515
  try {
2322
2516
  saveConfig(seeded);
2323
2517
  logger_default.info(
2324
- `[config-manager] seeded codex defaults: model=${needsModel ? CODEX_DEFAULT_MODEL_ID : "(kept)"} effort=${needsEffort ? CODEX_DEFAULT_EFFORT : "(kept)"}`
2518
+ `[config-manager] seeded codex defaults: model=${needsModel ? CODEX_DEFAULT_MODEL_ID : "(kept)"} effort=${needsEffort ? effort : "(kept)"} reviewEffort=${needsReviewEffort ? reviewEffort : "(kept)"}`
2325
2519
  );
2326
2520
  } catch (err) {
2327
2521
  logger_default.warn(
@@ -3769,7 +3963,7 @@ console.warn = (...args) => _origError("[mcp:warn]", ...args);
3769
3963
  console.error = (...args) => _origError("[mcp:error]", ...args);
3770
3964
  async function main() {
3771
3965
  configManager.init();
3772
- const version = true ? "0.15.2" : createRequire(import.meta.url)("../package.json").version;
3966
+ const version = true ? "0.16.0" : createRequire(import.meta.url)("../package.json").version;
3773
3967
  const server = createMcpServer(version);
3774
3968
  const transport = new StdioServerTransport();
3775
3969
  await server.connect(transport);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@basegrid_tech/mcp",
3
- "version": "0.15.2",
3
+ "version": "0.16.0",
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.15.2",
46
- "@basegrid/shared": "0.15.2",
45
+ "@basegrid/server": "0.16.0",
46
+ "@basegrid/shared": "0.16.0",
47
47
  "tsup": "^8.5.1",
48
48
  "tsx": "^4.21.0",
49
49
  "typescript": "^6.0.3"