emdash-emit 0.1.18 → 0.1.30
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/CHANGELOG.md +249 -1
- package/README.md +22 -11
- package/dist/cli/commands/conflicts.d.ts.map +1 -1
- package/dist/cli/commands/conflicts.js +2 -22
- package/dist/cli/commands/conflicts.js.map +1 -1
- package/dist/cli/commands/delete.d.ts.map +1 -1
- package/dist/cli/commands/delete.js +1 -13
- package/dist/cli/commands/delete.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +1 -13
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/media.d.ts.map +1 -1
- package/dist/cli/commands/media.js +1 -13
- package/dist/cli/commands/media.js.map +1 -1
- package/dist/cli/commands/new.d.ts.map +1 -1
- package/dist/cli/commands/new.js +31 -13
- package/dist/cli/commands/new.js.map +1 -1
- package/dist/cli/commands/pull.d.ts +1 -1
- package/dist/cli/commands/pull.d.ts.map +1 -1
- package/dist/cli/commands/pull.js +110 -79
- package/dist/cli/commands/pull.js.map +1 -1
- package/dist/cli/commands/push.d.ts +1 -1
- package/dist/cli/commands/push.d.ts.map +1 -1
- package/dist/cli/commands/push.js +32 -90
- package/dist/cli/commands/push.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +7 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/context.d.ts +12 -0
- package/dist/cli/context.d.ts.map +1 -1
- package/dist/cli/context.js +27 -1
- package/dist/cli/context.js.map +1 -1
- package/dist/cli/report-failure.d.ts +6 -0
- package/dist/cli/report-failure.d.ts.map +1 -0
- package/dist/cli/report-failure.js +71 -0
- package/dist/cli/report-failure.js.map +1 -0
- package/dist/client/api.d.ts +20 -0
- package/dist/client/api.d.ts.map +1 -1
- package/dist/client/api.js +90 -1
- package/dist/client/api.js.map +1 -1
- package/dist/client/lock.js.map +1 -1
- package/dist/client/mapper.js.map +1 -1
- package/dist/client/media.d.ts.map +1 -1
- package/dist/client/media.js.map +1 -1
- package/dist/db/baseline.d.ts +19 -3
- package/dist/db/baseline.d.ts.map +1 -1
- package/dist/db/baseline.js +27 -2
- package/dist/db/baseline.js.map +1 -1
- package/dist/db/cache.d.ts +7 -3
- package/dist/db/cache.d.ts.map +1 -1
- package/dist/db/cache.js +24 -295
- package/dist/db/cache.js.map +1 -1
- package/dist/db/migrations.d.ts +7 -0
- package/dist/db/migrations.d.ts.map +1 -0
- package/dist/db/migrations.js +320 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/mcp/heartbeat.d.ts +1 -34
- package/dist/mcp/heartbeat.d.ts.map +1 -1
- package/dist/mcp/heartbeat.js +1 -113
- package/dist/mcp/heartbeat.js.map +1 -1
- package/dist/mcp/tool-errors.d.ts +12 -1
- package/dist/mcp/tool-errors.d.ts.map +1 -1
- package/dist/mcp/tool-errors.js +29 -0
- package/dist/mcp/tool-errors.js.map +1 -1
- package/dist/mcp/tools/sync-conflicts.d.ts.map +1 -1
- package/dist/mcp/tools/sync-conflicts.js +46 -58
- package/dist/mcp/tools/sync-conflicts.js.map +1 -1
- package/dist/mcp/tools/sync-delete.d.ts.map +1 -1
- package/dist/mcp/tools/sync-delete.js +18 -30
- package/dist/mcp/tools/sync-delete.js.map +1 -1
- package/dist/mcp/tools/sync-diff.d.ts.map +1 -1
- package/dist/mcp/tools/sync-diff.js +10 -31
- package/dist/mcp/tools/sync-diff.js.map +1 -1
- package/dist/mcp/tools/sync-doctor.d.ts.map +1 -1
- package/dist/mcp/tools/sync-doctor.js +18 -30
- package/dist/mcp/tools/sync-doctor.js.map +1 -1
- package/dist/mcp/tools/sync-media-search.d.ts.map +1 -1
- package/dist/mcp/tools/sync-media-search.js +40 -52
- package/dist/mcp/tools/sync-media-search.js.map +1 -1
- package/dist/mcp/tools/sync-new.d.ts.map +1 -1
- package/dist/mcp/tools/sync-new.js +54 -34
- package/dist/mcp/tools/sync-new.js.map +1 -1
- package/dist/mcp/tools/sync-pull.d.ts.map +1 -1
- package/dist/mcp/tools/sync-pull.js +194 -220
- package/dist/mcp/tools/sync-pull.js.map +1 -1
- package/dist/mcp/tools/sync-push.d.ts.map +1 -1
- package/dist/mcp/tools/sync-push.js +64 -84
- package/dist/mcp/tools/sync-push.js.map +1 -1
- package/dist/mcp/tools/sync-status.d.ts.map +1 -1
- package/dist/mcp/tools/sync-status.js +4 -13
- package/dist/mcp/tools/sync-status.js.map +1 -1
- package/dist/sync/baseline-reconstruction.d.ts +43 -0
- package/dist/sync/baseline-reconstruction.d.ts.map +1 -0
- package/dist/sync/baseline-reconstruction.js +103 -0
- package/dist/sync/baseline-reconstruction.js.map +1 -0
- package/dist/sync/bylines.d.ts +5 -0
- package/dist/sync/bylines.d.ts.map +1 -1
- package/dist/sync/bylines.js +29 -0
- package/dist/sync/bylines.js.map +1 -1
- package/dist/sync/conflicts.d.ts.map +1 -1
- package/dist/sync/conflicts.js +21 -4
- package/dist/sync/conflicts.js.map +1 -1
- package/dist/sync/delete.d.ts.map +1 -1
- package/dist/sync/delete.js +12 -1
- package/dist/sync/delete.js.map +1 -1
- package/dist/sync/diff.d.ts.map +1 -1
- package/dist/sync/diff.js +62 -26
- package/dist/sync/diff.js.map +1 -1
- package/dist/sync/doctor.d.ts.map +1 -1
- package/dist/sync/doctor.js +13 -3
- package/dist/sync/doctor.js.map +1 -1
- package/dist/sync/guards.d.ts +1 -1
- package/dist/sync/guards.d.ts.map +1 -1
- package/dist/sync/guards.js +3 -2
- package/dist/sync/guards.js.map +1 -1
- package/dist/sync/media/companions.d.ts.map +1 -1
- package/dist/sync/media/companions.js.map +1 -1
- package/dist/sync/media/naming_mirror.d.ts.map +1 -1
- package/dist/sync/media/naming_mirror.js +11 -2
- package/dist/sync/media/naming_mirror.js.map +1 -1
- package/dist/sync/media/pull_article.d.ts +2 -0
- package/dist/sync/media/pull_article.d.ts.map +1 -1
- package/dist/sync/media/pull_article.js +74 -25
- package/dist/sync/media/pull_article.js.map +1 -1
- package/dist/sync/media/pull_library.d.ts.map +1 -1
- package/dist/sync/media/pull_library.js +34 -61
- package/dist/sync/media/pull_library.js.map +1 -1
- package/dist/sync/media/remote_index.d.ts +16 -1
- package/dist/sync/media/remote_index.d.ts.map +1 -1
- package/dist/sync/media/remote_index.js +2 -2
- package/dist/sync/media/remote_index.js.map +1 -1
- package/dist/sync/merge.d.ts +1 -1
- package/dist/sync/merge.d.ts.map +1 -1
- package/dist/sync/merge.js +50 -17
- package/dist/sync/merge.js.map +1 -1
- package/dist/sync/new.d.ts +11 -0
- package/dist/sync/new.d.ts.map +1 -1
- package/dist/sync/new.js +81 -3
- package/dist/sync/new.js.map +1 -1
- package/dist/sync/orchestrator.d.ts +34 -0
- package/dist/sync/orchestrator.d.ts.map +1 -1
- package/dist/sync/orchestrator.js +89 -80
- package/dist/sync/orchestrator.js.map +1 -1
- package/dist/sync/preflight/image_probe.d.ts +28 -0
- package/dist/sync/preflight/image_probe.d.ts.map +1 -0
- package/dist/sync/preflight/image_probe.js +70 -0
- package/dist/sync/preflight/image_probe.js.map +1 -0
- package/dist/sync/preflight.d.ts +7 -0
- package/dist/sync/preflight.d.ts.map +1 -1
- package/dist/sync/preflight.js +127 -31
- package/dist/sync/preflight.js.map +1 -1
- package/dist/sync/pull/fast_path.d.ts +9 -0
- package/dist/sync/pull/fast_path.d.ts.map +1 -0
- package/dist/sync/pull/fast_path.js +341 -0
- package/dist/sync/pull/fast_path.js.map +1 -0
- package/dist/sync/pull/index.d.ts +15 -0
- package/dist/sync/pull/index.d.ts.map +1 -0
- package/dist/sync/pull/index.js +363 -0
- package/dist/sync/pull/index.js.map +1 -0
- package/dist/sync/pull/list.d.ts +22 -0
- package/dist/sync/pull/list.d.ts.map +1 -0
- package/dist/sync/pull/list.js +175 -0
- package/dist/sync/pull/list.js.map +1 -0
- package/dist/sync/pull/media_stage.d.ts +67 -0
- package/dist/sync/pull/media_stage.d.ts.map +1 -0
- package/dist/sync/pull/media_stage.js +599 -0
- package/dist/sync/pull/media_stage.js.map +1 -0
- package/dist/sync/pull/quarantine.d.ts +22 -0
- package/dist/sync/pull/quarantine.d.ts.map +1 -0
- package/dist/sync/pull/quarantine.js +174 -0
- package/dist/sync/pull/quarantine.js.map +1 -0
- package/dist/sync/pull/types.d.ts +125 -0
- package/dist/sync/pull/types.d.ts.map +1 -0
- package/dist/sync/pull/types.js +23 -0
- package/dist/sync/pull/types.js.map +1 -0
- package/dist/sync/pull.d.ts +1 -114
- package/dist/sync/pull.d.ts.map +1 -1
- package/dist/sync/pull.js +1 -806
- package/dist/sync/pull.js.map +1 -1
- package/dist/sync/push/commit.d.ts +1 -0
- package/dist/sync/push/commit.d.ts.map +1 -1
- package/dist/sync/push/commit.js +58 -31
- package/dist/sync/push/commit.js.map +1 -1
- package/dist/sync/push/index.d.ts.map +1 -1
- package/dist/sync/push/index.js +30 -8
- package/dist/sync/push/index.js.map +1 -1
- package/dist/sync/push/media_stage.d.ts +17 -2
- package/dist/sync/push/media_stage.d.ts.map +1 -1
- package/dist/sync/push/media_stage.js +31 -2
- package/dist/sync/push/media_stage.js.map +1 -1
- package/dist/sync/push/merge_stage.d.ts.map +1 -1
- package/dist/sync/push/merge_stage.js +36 -22
- package/dist/sync/push/merge_stage.js.map +1 -1
- package/dist/sync/push/transport.d.ts +6 -2
- package/dist/sync/push/transport.d.ts.map +1 -1
- package/dist/sync/push/transport.js +5 -5
- package/dist/sync/push/transport.js.map +1 -1
- package/dist/sync/status.d.ts +3 -0
- package/dist/sync/status.d.ts.map +1 -1
- package/dist/sync/status.js +18 -55
- package/dist/sync/status.js.map +1 -1
- package/dist/sync/taxonomies.d.ts +25 -0
- package/dist/sync/taxonomies.d.ts.map +1 -1
- package/dist/sync/taxonomies.js +180 -127
- package/dist/sync/taxonomies.js.map +1 -1
- package/dist/sync/workspace/commit.d.ts +46 -0
- package/dist/sync/workspace/commit.d.ts.map +1 -0
- package/dist/sync/workspace/commit.js +85 -0
- package/dist/sync/workspace/commit.js.map +1 -0
- package/dist/sync/workspace/index.d.ts +1 -0
- package/dist/sync/workspace/index.d.ts.map +1 -1
- package/dist/sync/workspace/index.js +1 -0
- package/dist/sync/workspace/index.js.map +1 -1
- package/dist/utils/disk-spelling.d.ts +26 -0
- package/dist/utils/disk-spelling.d.ts.map +1 -0
- package/dist/utils/disk-spelling.js +51 -0
- package/dist/utils/disk-spelling.js.map +1 -0
- package/dist/utils/draft-revision.d.ts +15 -0
- package/dist/utils/draft-revision.d.ts.map +1 -0
- package/dist/utils/draft-revision.js +36 -0
- package/dist/utils/draft-revision.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +21 -2
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +70 -7
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/mcp-heartbeat.d.ts +36 -0
- package/dist/utils/mcp-heartbeat.d.ts.map +1 -0
- package/dist/utils/mcp-heartbeat.js +126 -0
- package/dist/utils/mcp-heartbeat.js.map +1 -0
- package/dist/utils/media-body-refs.d.ts.map +1 -1
- package/dist/utils/media-body-refs.js +2 -2
- package/dist/utils/media-body-refs.js.map +1 -1
- package/dist/utils/taxonomy-key.d.ts +25 -0
- package/dist/utils/taxonomy-key.d.ts.map +1 -0
- package/dist/utils/taxonomy-key.js +51 -0
- package/dist/utils/taxonomy-key.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2026 SPORT-SERVICE RS★R
|
|
3
|
+
*
|
|
4
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
* in the Software without restriction, including without limitation the rights
|
|
7
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
* furnished to do so, subject to the following conditions:
|
|
10
|
+
*
|
|
11
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
12
|
+
* copies or substantial portions of the Software.
|
|
13
|
+
*
|
|
14
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
|
+
* SOFTWARE.
|
|
21
|
+
*/
|
|
22
|
+
import fs from 'node:fs';
|
|
23
|
+
import path from 'node:path';
|
|
24
|
+
import { getPackageVersion } from '../utils/version.js';
|
|
25
|
+
export const CURRENT_CACHE_SCHEMA_VERSION = 5;
|
|
26
|
+
function pruneBackups(dbPath) {
|
|
27
|
+
if (dbPath === ':memory:')
|
|
28
|
+
return;
|
|
29
|
+
try {
|
|
30
|
+
const dbDir = path.dirname(dbPath);
|
|
31
|
+
const dbBase = path.basename(dbPath);
|
|
32
|
+
if (!fs.existsSync(dbDir))
|
|
33
|
+
return;
|
|
34
|
+
const backupFiles = fs
|
|
35
|
+
.readdirSync(dbDir)
|
|
36
|
+
.filter((f) => f.startsWith(`${dbBase}.bak-`))
|
|
37
|
+
.map((f) => path.join(dbDir, f));
|
|
38
|
+
// 1. Unconditionally purge 0-byte backup files
|
|
39
|
+
const validBackups = [];
|
|
40
|
+
for (const bak of backupFiles) {
|
|
41
|
+
try {
|
|
42
|
+
const stat = fs.statSync(bak);
|
|
43
|
+
if (stat.size === 0) {
|
|
44
|
+
fs.unlinkSync(bak);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
validBackups.push(bak);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Ignore stat/unlink errors
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// 2. Retain up to 3 newest valid backups
|
|
55
|
+
validBackups.sort((a, b) => {
|
|
56
|
+
try {
|
|
57
|
+
return fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return 0;
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
if (validBackups.length > 3) {
|
|
64
|
+
for (const oldBak of validBackups.slice(3)) {
|
|
65
|
+
try {
|
|
66
|
+
fs.unlinkSync(oldBak);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Ignore unlink errors
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Ignore backup prune errors
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Initializes SQLite schema tables and executes versioned migrations up to CURRENT_CACHE_SCHEMA_VERSION.
|
|
80
|
+
*/
|
|
81
|
+
export function runCacheMigrations(db, dbPath = ':memory:') {
|
|
82
|
+
// Enable WAL mode for better concurrency and write performance
|
|
83
|
+
db.exec('PRAGMA journal_mode = WAL;');
|
|
84
|
+
// 1. entries table: remote state cache
|
|
85
|
+
db.exec(`
|
|
86
|
+
CREATE TABLE IF NOT EXISTS entries (
|
|
87
|
+
id TEXT PRIMARY KEY,
|
|
88
|
+
collection TEXT NOT NULL,
|
|
89
|
+
slug TEXT NOT NULL,
|
|
90
|
+
status TEXT NOT NULL,
|
|
91
|
+
title TEXT NOT NULL,
|
|
92
|
+
rev TEXT NOT NULL,
|
|
93
|
+
published_at TEXT,
|
|
94
|
+
raw_json TEXT NOT NULL,
|
|
95
|
+
updated_at INTEGER NOT NULL
|
|
96
|
+
);
|
|
97
|
+
CREATE INDEX IF NOT EXISTS idx_entries_collection ON entries (collection);
|
|
98
|
+
CREATE INDEX IF NOT EXISTS idx_entries_slug ON entries (slug);
|
|
99
|
+
`);
|
|
100
|
+
// 2. base_snapshots table: baseline state for 3-way merge
|
|
101
|
+
db.exec(`
|
|
102
|
+
CREATE TABLE IF NOT EXISTS base_snapshots (
|
|
103
|
+
id TEXT PRIMARY KEY,
|
|
104
|
+
rev TEXT NOT NULL,
|
|
105
|
+
body_markdown TEXT NOT NULL,
|
|
106
|
+
frontmatter_yaml TEXT NOT NULL,
|
|
107
|
+
hash TEXT NOT NULL,
|
|
108
|
+
saved_at INTEGER NOT NULL
|
|
109
|
+
);
|
|
110
|
+
`);
|
|
111
|
+
// 3. sync_state table: local path tracking & dirty change detection
|
|
112
|
+
db.exec(`
|
|
113
|
+
CREATE TABLE IF NOT EXISTS sync_state (
|
|
114
|
+
id TEXT PRIMARY KEY,
|
|
115
|
+
local_file_path TEXT NOT NULL,
|
|
116
|
+
local_hash TEXT NOT NULL,
|
|
117
|
+
remote_rev TEXT NOT NULL,
|
|
118
|
+
status TEXT NOT NULL,
|
|
119
|
+
slug TEXT NOT NULL,
|
|
120
|
+
last_synced_at INTEGER NOT NULL,
|
|
121
|
+
conflict_pending INTEGER NOT NULL DEFAULT 0,
|
|
122
|
+
body_conflict_pending INTEGER NOT NULL DEFAULT 0,
|
|
123
|
+
taxonomy_conflict_pending INTEGER NOT NULL DEFAULT 0,
|
|
124
|
+
delete_pending INTEGER NOT NULL DEFAULT 0,
|
|
125
|
+
conflict_copy_hash TEXT,
|
|
126
|
+
conflict_copy_path TEXT,
|
|
127
|
+
conflict_at INTEGER,
|
|
128
|
+
remote_taxonomy_hash TEXT,
|
|
129
|
+
taxonomy_apply_pending INTEGER NOT NULL DEFAULT 0
|
|
130
|
+
);
|
|
131
|
+
CREATE INDEX IF NOT EXISTS idx_sync_state_file_path ON sync_state (local_file_path);
|
|
132
|
+
`);
|
|
133
|
+
// 4. bylines table: local cache for author/byline resolution
|
|
134
|
+
db.exec(`
|
|
135
|
+
CREATE TABLE IF NOT EXISTS bylines (
|
|
136
|
+
id TEXT PRIMARY KEY,
|
|
137
|
+
slug TEXT NOT NULL UNIQUE,
|
|
138
|
+
display_name TEXT NOT NULL,
|
|
139
|
+
is_guest INTEGER NOT NULL DEFAULT 0,
|
|
140
|
+
raw_json TEXT NOT NULL DEFAULT '{}',
|
|
141
|
+
updated_at INTEGER NOT NULL
|
|
142
|
+
);
|
|
143
|
+
CREATE INDEX IF NOT EXISTS idx_bylines_slug ON bylines (slug);
|
|
144
|
+
`);
|
|
145
|
+
// 5. media_state table: local draft media upload tracking & idempotency (Schema v5)
|
|
146
|
+
db.exec(`
|
|
147
|
+
CREATE TABLE IF NOT EXISTS media_state (
|
|
148
|
+
storage_key TEXT PRIMARY KEY,
|
|
149
|
+
media_id TEXT NOT NULL,
|
|
150
|
+
local_content_hash TEXT,
|
|
151
|
+
remote_record_ref TEXT,
|
|
152
|
+
url TEXT NOT NULL,
|
|
153
|
+
workspace_path TEXT,
|
|
154
|
+
markdown_ref TEXT,
|
|
155
|
+
status TEXT NOT NULL,
|
|
156
|
+
uploaded_at INTEGER
|
|
157
|
+
);
|
|
158
|
+
CREATE INDEX IF NOT EXISTS idx_media_state_media_id ON media_state (media_id);
|
|
159
|
+
CREATE INDEX IF NOT EXISTS idx_media_state_status ON media_state (status);
|
|
160
|
+
`);
|
|
161
|
+
const versionRow = db.prepare('PRAGMA user_version;').get();
|
|
162
|
+
const currentVersion = Number(versionRow?.user_version || 0);
|
|
163
|
+
// Guard against opening a database created by a newer version of emdash-emit
|
|
164
|
+
if (currentVersion > CURRENT_CACHE_SCHEMA_VERSION) {
|
|
165
|
+
throw new Error(`[CACHE_SCHEMA_MISMATCH] Cache database at ${dbPath} was created with schema version ${currentVersion}, but current emit supports up to ${CURRENT_CACHE_SCHEMA_VERSION}. Please upgrade emdash-emit.`);
|
|
166
|
+
}
|
|
167
|
+
if (currentVersion < CURRENT_CACHE_SCHEMA_VERSION) {
|
|
168
|
+
// 1. Backup database before running migration via SQLite native VACUUM INTO
|
|
169
|
+
if (dbPath !== ':memory:' && fs.existsSync(dbPath)) {
|
|
170
|
+
try {
|
|
171
|
+
const version = getPackageVersion();
|
|
172
|
+
const versionStr = version !== 'unknown' ? version : CURRENT_CACHE_SCHEMA_VERSION;
|
|
173
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
174
|
+
const bakPath = `${dbPath}.bak-${versionStr}-${timestamp}`;
|
|
175
|
+
db.prepare('VACUUM INTO ?').run(bakPath);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
// Ignore in-memory or constrained test environments
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Unconditionally sweep 0-byte or excess backups
|
|
182
|
+
pruneBackups(dbPath);
|
|
183
|
+
// Migration 1 & 2: schema columns from v1 and v2 if missing
|
|
184
|
+
const columns = db.prepare("PRAGMA table_info('sync_state');").all();
|
|
185
|
+
const columnNames = new Set(columns.map((c) => String(c.name)));
|
|
186
|
+
if (!columnNames.has('conflict_pending')) {
|
|
187
|
+
db.exec('ALTER TABLE sync_state ADD COLUMN conflict_pending INTEGER NOT NULL DEFAULT 0;');
|
|
188
|
+
}
|
|
189
|
+
if (!columnNames.has('delete_pending')) {
|
|
190
|
+
db.exec('ALTER TABLE sync_state ADD COLUMN delete_pending INTEGER NOT NULL DEFAULT 0;');
|
|
191
|
+
}
|
|
192
|
+
if (!columnNames.has('conflict_copy_hash')) {
|
|
193
|
+
db.exec('ALTER TABLE sync_state ADD COLUMN conflict_copy_hash TEXT;');
|
|
194
|
+
}
|
|
195
|
+
if (!columnNames.has('conflict_copy_path')) {
|
|
196
|
+
db.exec('ALTER TABLE sync_state ADD COLUMN conflict_copy_path TEXT;');
|
|
197
|
+
}
|
|
198
|
+
if (!columnNames.has('conflict_at')) {
|
|
199
|
+
db.exec('ALTER TABLE sync_state ADD COLUMN conflict_at INTEGER;');
|
|
200
|
+
}
|
|
201
|
+
if (!columnNames.has('remote_taxonomy_hash')) {
|
|
202
|
+
db.exec('ALTER TABLE sync_state ADD COLUMN remote_taxonomy_hash TEXT;');
|
|
203
|
+
}
|
|
204
|
+
if (!columnNames.has('taxonomy_apply_pending')) {
|
|
205
|
+
db.exec('ALTER TABLE sync_state ADD COLUMN taxonomy_apply_pending INTEGER NOT NULL DEFAULT 0;');
|
|
206
|
+
}
|
|
207
|
+
// Migration 3 (v3): separate body and taxonomy conflict pending flags
|
|
208
|
+
if (!columnNames.has('body_conflict_pending')) {
|
|
209
|
+
db.exec('ALTER TABLE sync_state ADD COLUMN body_conflict_pending INTEGER NOT NULL DEFAULT 0;');
|
|
210
|
+
}
|
|
211
|
+
if (!columnNames.has('taxonomy_conflict_pending')) {
|
|
212
|
+
db.exec('ALTER TABLE sync_state ADD COLUMN taxonomy_conflict_pending INTEGER NOT NULL DEFAULT 0;');
|
|
213
|
+
}
|
|
214
|
+
// Existing rows allocation rule when upgrading to v3
|
|
215
|
+
if (currentVersion < 3) {
|
|
216
|
+
db.exec(`
|
|
217
|
+
UPDATE sync_state
|
|
218
|
+
SET body_conflict_pending = CASE
|
|
219
|
+
WHEN conflict_pending = 1 AND conflict_copy_path LIKE '%.conflict.md' THEN 1
|
|
220
|
+
WHEN conflict_pending = 1 AND remote_taxonomy_hash IS NOT NULL AND (conflict_copy_path IS NULL OR conflict_copy_path NOT LIKE '%.conflict.md') THEN 0
|
|
221
|
+
WHEN conflict_pending = 1 THEN 1
|
|
222
|
+
ELSE 0 END,
|
|
223
|
+
taxonomy_conflict_pending = CASE
|
|
224
|
+
WHEN conflict_pending = 1 AND conflict_copy_path LIKE '%.conflict.md' THEN 0
|
|
225
|
+
WHEN conflict_pending = 1 AND remote_taxonomy_hash IS NOT NULL THEN 1
|
|
226
|
+
WHEN conflict_pending = 1 THEN 1
|
|
227
|
+
ELSE 0 END
|
|
228
|
+
WHERE conflict_pending = 1;
|
|
229
|
+
`);
|
|
230
|
+
}
|
|
231
|
+
db.exec('CREATE INDEX IF NOT EXISTS idx_sync_state_conflict ON sync_state (conflict_pending);');
|
|
232
|
+
db.exec('CREATE INDEX IF NOT EXISTS idx_sync_state_body_conflict ON sync_state (body_conflict_pending);');
|
|
233
|
+
db.exec('CREATE INDEX IF NOT EXISTS idx_sync_state_tax_conflict ON sync_state (taxonomy_conflict_pending);');
|
|
234
|
+
db.exec('CREATE INDEX IF NOT EXISTS idx_sync_state_delete ON sync_state (delete_pending);');
|
|
235
|
+
db.exec('CREATE INDEX IF NOT EXISTS idx_sync_state_tax_apply ON sync_state (taxonomy_apply_pending);');
|
|
236
|
+
// Migration 4 (v4): media mirrors are named after the storageKey
|
|
237
|
+
const mediaColumns = db.prepare("PRAGMA table_info('media_state');").all();
|
|
238
|
+
const mediaColumnNames = new Set(mediaColumns.map((c) => String(c.name)));
|
|
239
|
+
if (!mediaColumnNames.has('markdown_ref')) {
|
|
240
|
+
db.exec('ALTER TABLE media_state ADD COLUMN markdown_ref TEXT;');
|
|
241
|
+
}
|
|
242
|
+
// Migration 5 (v5): recreate media_state with storage_key as PRIMARY KEY,
|
|
243
|
+
// separating local_content_hash (SHA-256) and remote_record_ref (media-record:<id>).
|
|
244
|
+
if (currentVersion < 5) {
|
|
245
|
+
const mediaCols = db.prepare("PRAGMA table_info('media_state');").all();
|
|
246
|
+
const mediaColNames = new Set(mediaCols.map((c) => String(c.name)));
|
|
247
|
+
const storageKeyCol = mediaCols.find((c) => String(c.name) === 'storage_key');
|
|
248
|
+
const isStorageKeyPk = storageKeyCol && Number(storageKeyCol.pk) > 0;
|
|
249
|
+
if (!isStorageKeyPk) {
|
|
250
|
+
db.exec('BEGIN TRANSACTION;');
|
|
251
|
+
try {
|
|
252
|
+
db.exec(`
|
|
253
|
+
CREATE TABLE IF NOT EXISTS media_state_v5 (
|
|
254
|
+
storage_key TEXT PRIMARY KEY,
|
|
255
|
+
media_id TEXT NOT NULL,
|
|
256
|
+
local_content_hash TEXT,
|
|
257
|
+
remote_record_ref TEXT,
|
|
258
|
+
url TEXT NOT NULL,
|
|
259
|
+
workspace_path TEXT,
|
|
260
|
+
markdown_ref TEXT,
|
|
261
|
+
status TEXT NOT NULL,
|
|
262
|
+
uploaded_at INTEGER
|
|
263
|
+
);
|
|
264
|
+
`);
|
|
265
|
+
if (mediaColNames.has('local_hash')) {
|
|
266
|
+
const hasMarkdownRef = mediaColNames.has('markdown_ref');
|
|
267
|
+
db.exec(`
|
|
268
|
+
INSERT INTO media_state_v5 (
|
|
269
|
+
storage_key,
|
|
270
|
+
media_id,
|
|
271
|
+
local_content_hash,
|
|
272
|
+
remote_record_ref,
|
|
273
|
+
url,
|
|
274
|
+
workspace_path,
|
|
275
|
+
markdown_ref,
|
|
276
|
+
status,
|
|
277
|
+
uploaded_at
|
|
278
|
+
)
|
|
279
|
+
SELECT
|
|
280
|
+
COALESCE(
|
|
281
|
+
NULLIF(storage_key, ''),
|
|
282
|
+
CASE WHEN url LIKE '%/file/%' THEN substr(url, instr(url, '/file/') + 6) ELSE 'legacy_' || media_id END
|
|
283
|
+
) AS computed_key,
|
|
284
|
+
MAX(media_id),
|
|
285
|
+
MAX(CASE WHEN local_hash NOT LIKE 'media-record:%' THEN local_hash ELSE NULL END),
|
|
286
|
+
MAX(CASE WHEN local_hash LIKE 'media-record:%' THEN local_hash ELSE NULL END),
|
|
287
|
+
MAX(url),
|
|
288
|
+
MAX(workspace_path),
|
|
289
|
+
${hasMarkdownRef ? 'MAX(markdown_ref)' : 'NULL'},
|
|
290
|
+
MAX(status),
|
|
291
|
+
MAX(uploaded_at)
|
|
292
|
+
FROM media_state
|
|
293
|
+
WHERE (storage_key IS NOT NULL AND storage_key != '') OR url LIKE '%/file/%'
|
|
294
|
+
GROUP BY computed_key;
|
|
295
|
+
`);
|
|
296
|
+
db.exec('DROP TABLE media_state;');
|
|
297
|
+
}
|
|
298
|
+
db.exec('ALTER TABLE media_state_v5 RENAME TO media_state;');
|
|
299
|
+
db.exec(`
|
|
300
|
+
CREATE INDEX IF NOT EXISTS idx_media_state_media_id ON media_state (media_id);
|
|
301
|
+
CREATE INDEX IF NOT EXISTS idx_media_state_status ON media_state (status);
|
|
302
|
+
CREATE INDEX IF NOT EXISTS idx_media_state_content_hash ON media_state (local_content_hash);
|
|
303
|
+
`);
|
|
304
|
+
db.exec('COMMIT;');
|
|
305
|
+
}
|
|
306
|
+
catch (err) {
|
|
307
|
+
db.exec('ROLLBACK;');
|
|
308
|
+
throw err;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
db.exec(`PRAGMA user_version = ${CURRENT_CACHE_SCHEMA_VERSION};`);
|
|
313
|
+
}
|
|
314
|
+
// Create indexes that depend on migrated columns
|
|
315
|
+
db.exec(`
|
|
316
|
+
CREATE INDEX IF NOT EXISTS idx_sync_state_conflict ON sync_state (conflict_pending);
|
|
317
|
+
CREATE INDEX IF NOT EXISTS idx_media_state_content_hash ON media_state (local_content_hash);
|
|
318
|
+
`);
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/heartbeat.d.ts
CHANGED
|
@@ -1,35 +1,2 @@
|
|
|
1
|
-
export
|
|
2
|
-
pid: number;
|
|
3
|
-
version: string;
|
|
4
|
-
startedAt: string;
|
|
5
|
-
origin?: string;
|
|
6
|
-
profile?: string;
|
|
7
|
-
workspaceRoot?: string;
|
|
8
|
-
}
|
|
9
|
-
export interface McpProcessCheckResult {
|
|
10
|
-
status: 'alive' | 'stale' | 'unknown' | 'none';
|
|
11
|
-
state?: McpHeartbeatState;
|
|
12
|
-
isOutdated?: boolean;
|
|
13
|
-
message?: string;
|
|
14
|
-
}
|
|
15
|
-
export declare function getMcpStateFilePath(): string;
|
|
16
|
-
export declare function getPackageVersion(): string;
|
|
17
|
-
/**
|
|
18
|
-
* Records heartbeat metadata to ~/.config/emit/mcp_state.json with restricted 0600 permissions.
|
|
19
|
-
*/
|
|
20
|
-
export declare function recordMcpHeartbeat(metadata?: string | {
|
|
21
|
-
origin?: string;
|
|
22
|
-
profile?: string;
|
|
23
|
-
workspaceRoot?: string;
|
|
24
|
-
}): void;
|
|
25
|
-
/**
|
|
26
|
-
* Checks the status of the recorded MCP process in ~/.config/emit/mcp_state.json.
|
|
27
|
-
* Handles process vitality via process.kill(pid, 0):
|
|
28
|
-
* - ESRCH: Process has terminated -> cleanly remove stale state file.
|
|
29
|
-
* - EPERM: Process belongs to another user on shared host -> mark unknown.
|
|
30
|
-
* - Alive: Compares start time against package.json mtime to detect outdated processes.
|
|
31
|
-
*
|
|
32
|
-
* Note: mtime-based comparison can yield false negatives if package is downgraded.
|
|
33
|
-
*/
|
|
34
|
-
export declare function checkMcpProcess(customPackageJsonPath?: string): McpProcessCheckResult;
|
|
1
|
+
export * from '../utils/mcp-heartbeat.js';
|
|
35
2
|
//# sourceMappingURL=heartbeat.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../src/mcp/heartbeat.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../src/mcp/heartbeat.ts"],"names":[],"mappings":"AAsBA,cAAc,2BAA2B,CAAC"}
|
package/dist/mcp/heartbeat.js
CHANGED
|
@@ -19,117 +19,5 @@
|
|
|
19
19
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
20
|
* SOFTWARE.
|
|
21
21
|
*/
|
|
22
|
-
|
|
23
|
-
import os from 'node:os';
|
|
24
|
-
import path from 'node:path';
|
|
25
|
-
import { fileURLToPath } from 'node:url';
|
|
26
|
-
export function getMcpStateFilePath() {
|
|
27
|
-
const home = process.env.HOME || process.env.USERPROFILE || os.homedir();
|
|
28
|
-
return path.join(home, '.config', 'emit', 'mcp_state.json');
|
|
29
|
-
}
|
|
30
|
-
export function getPackageVersion() {
|
|
31
|
-
try {
|
|
32
|
-
const pkgPath = fileURLToPath(new URL('../../package.json', import.meta.url));
|
|
33
|
-
const content = fs.readFileSync(pkgPath, 'utf8');
|
|
34
|
-
const parsed = JSON.parse(content);
|
|
35
|
-
return parsed.version || 'unknown';
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
return 'unknown';
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Records heartbeat metadata to ~/.config/emit/mcp_state.json with restricted 0600 permissions.
|
|
43
|
-
*/
|
|
44
|
-
export function recordMcpHeartbeat(metadata) {
|
|
45
|
-
try {
|
|
46
|
-
const filePath = getMcpStateFilePath();
|
|
47
|
-
fs.mkdirSync(path.dirname(filePath), { recursive: true, mode: 0o700 });
|
|
48
|
-
const metaObj = typeof metadata === 'string' ? { origin: metadata } : metadata || {};
|
|
49
|
-
const payload = {
|
|
50
|
-
pid: process.pid,
|
|
51
|
-
version: getPackageVersion(),
|
|
52
|
-
startedAt: new Date().toISOString(),
|
|
53
|
-
...(metaObj.origin ? { origin: metaObj.origin } : {}),
|
|
54
|
-
...(metaObj.profile ? { profile: metaObj.profile } : {}),
|
|
55
|
-
...(metaObj.workspaceRoot ? { workspaceRoot: metaObj.workspaceRoot } : {}),
|
|
56
|
-
};
|
|
57
|
-
fs.writeFileSync(filePath, JSON.stringify(payload, null, 2), { mode: 0o600 });
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
// Non-fatal if filesystem is restricted or read-only
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Checks the status of the recorded MCP process in ~/.config/emit/mcp_state.json.
|
|
65
|
-
* Handles process vitality via process.kill(pid, 0):
|
|
66
|
-
* - ESRCH: Process has terminated -> cleanly remove stale state file.
|
|
67
|
-
* - EPERM: Process belongs to another user on shared host -> mark unknown.
|
|
68
|
-
* - Alive: Compares start time against package.json mtime to detect outdated processes.
|
|
69
|
-
*
|
|
70
|
-
* Note: mtime-based comparison can yield false negatives if package is downgraded.
|
|
71
|
-
*/
|
|
72
|
-
export function checkMcpProcess(customPackageJsonPath) {
|
|
73
|
-
const filePath = getMcpStateFilePath();
|
|
74
|
-
if (!fs.existsSync(filePath)) {
|
|
75
|
-
return { status: 'none' };
|
|
76
|
-
}
|
|
77
|
-
let state;
|
|
78
|
-
try {
|
|
79
|
-
const content = fs.readFileSync(filePath, 'utf8');
|
|
80
|
-
state = JSON.parse(content);
|
|
81
|
-
}
|
|
82
|
-
catch {
|
|
83
|
-
return { status: 'none' };
|
|
84
|
-
}
|
|
85
|
-
try {
|
|
86
|
-
// Probe process vitality
|
|
87
|
-
process.kill(state.pid, 0);
|
|
88
|
-
}
|
|
89
|
-
catch (err) {
|
|
90
|
-
const code = err.code;
|
|
91
|
-
if (code === 'ESRCH') {
|
|
92
|
-
// Process is dead: clean up stale heartbeat file
|
|
93
|
-
try {
|
|
94
|
-
fs.unlinkSync(filePath);
|
|
95
|
-
}
|
|
96
|
-
catch {
|
|
97
|
-
// Ignore unlink error
|
|
98
|
-
}
|
|
99
|
-
return { status: 'stale', state };
|
|
100
|
-
}
|
|
101
|
-
if (code === 'EPERM') {
|
|
102
|
-
// Process belongs to another user
|
|
103
|
-
return { status: 'unknown', state };
|
|
104
|
-
}
|
|
105
|
-
return { status: 'unknown', state };
|
|
106
|
-
}
|
|
107
|
-
// Process is alive: check if outdated
|
|
108
|
-
let isOutdated = false;
|
|
109
|
-
let message;
|
|
110
|
-
try {
|
|
111
|
-
const pkgPath = customPackageJsonPath || fileURLToPath(new URL('../../package.json', import.meta.url));
|
|
112
|
-
if (fs.existsSync(pkgPath)) {
|
|
113
|
-
const pkgStat = fs.statSync(pkgPath);
|
|
114
|
-
const pkgContent = fs.readFileSync(pkgPath, 'utf8');
|
|
115
|
-
const pkgJson = JSON.parse(pkgContent);
|
|
116
|
-
const currentPkgVersion = pkgJson.version || '';
|
|
117
|
-
const startedMs = new Date(state.startedAt).getTime();
|
|
118
|
-
const mtimeMs = pkgStat.mtimeMs;
|
|
119
|
-
if (state.version !== currentPkgVersion || startedMs < mtimeMs) {
|
|
120
|
-
isOutdated = true;
|
|
121
|
-
message = `An MCP server process (PID ${state.pid}, version ${state.version}) is currently running from a previous installation. Restart your IDE or MCP client to activate version ${currentPkgVersion}.`;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
catch {
|
|
126
|
-
// Ignore version check errors
|
|
127
|
-
}
|
|
128
|
-
return {
|
|
129
|
-
status: 'alive',
|
|
130
|
-
state,
|
|
131
|
-
isOutdated,
|
|
132
|
-
message,
|
|
133
|
-
};
|
|
134
|
-
}
|
|
22
|
+
export * from '../utils/mcp-heartbeat.js';
|
|
135
23
|
//# sourceMappingURL=heartbeat.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src/mcp/heartbeat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,
|
|
1
|
+
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src/mcp/heartbeat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,cAAc,2BAA2B,CAAC"}
|
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
-
import type { McpMeta } from './context.js';
|
|
2
|
+
import type { ContextResolver, McpMeta, ServerContext } from './context.js';
|
|
3
3
|
/**
|
|
4
4
|
* Formats a successful MCP response as formatted JSON with optional _meta context.
|
|
5
5
|
*/
|
|
6
6
|
export declare function formatToolSuccess(data: Record<string, unknown>, meta?: McpMeta): CallToolResult;
|
|
7
|
+
/**
|
|
8
|
+
* Formats a successful plain-text MCP response with optional _meta context suffix.
|
|
9
|
+
*/
|
|
10
|
+
export declare function formatToolTextWithMeta(text: string, meta?: McpMeta, trailingText?: string): CallToolResult;
|
|
11
|
+
/**
|
|
12
|
+
* Resolves the MCP ServerContext inside a guarded try/catch block so any profile/workspace
|
|
13
|
+
* resolution error or subsequent handler exception is returned as a structured MCP tool error.
|
|
14
|
+
*/
|
|
15
|
+
export declare function withResolvedContext<TArgs extends {
|
|
16
|
+
profile?: string;
|
|
17
|
+
}>(resolveContext: ContextResolver, args: TArgs, handler: (ctx: ServerContext) => Promise<CallToolResult> | CallToolResult): Promise<CallToolResult>;
|
|
7
18
|
/**
|
|
8
19
|
* Formats a known Emit error into a structured MCP tool result with optional _meta context.
|
|
9
20
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-errors.d.ts","sourceRoot":"","sources":["../../src/mcp/tool-errors.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-errors.d.ts","sourceRoot":"","sources":["../../src/mcp/tool-errors.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAyB5E;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,cAAc,CAU/F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,YAAY,CAAC,EAAE,MAAM,GACpB,cAAc,CAWhB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,SAAS;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAC1E,cAAc,EAAE,eAAe,EAC/B,IAAI,EAAE,KAAK,EACX,OAAO,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,GACxE,OAAO,CAAC,cAAc,CAAC,CAQzB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,cAAc,CAwH9E"}
|
package/dist/mcp/tool-errors.js
CHANGED
|
@@ -52,6 +52,35 @@ export function formatToolSuccess(data, meta) {
|
|
|
52
52
|
],
|
|
53
53
|
};
|
|
54
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Formats a successful plain-text MCP response with optional _meta context suffix.
|
|
57
|
+
*/
|
|
58
|
+
export function formatToolTextWithMeta(text, meta, trailingText) {
|
|
59
|
+
const metaSuffix = meta ? `\n\n_meta: ${JSON.stringify(meta)}` : '';
|
|
60
|
+
const tail = trailingText ? `\n\n${trailingText}` : '';
|
|
61
|
+
return {
|
|
62
|
+
content: [
|
|
63
|
+
{
|
|
64
|
+
type: 'text',
|
|
65
|
+
text: `${text}${metaSuffix}${tail}`,
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Resolves the MCP ServerContext inside a guarded try/catch block so any profile/workspace
|
|
72
|
+
* resolution error or subsequent handler exception is returned as a structured MCP tool error.
|
|
73
|
+
*/
|
|
74
|
+
export async function withResolvedContext(resolveContext, args, handler) {
|
|
75
|
+
let ctx;
|
|
76
|
+
try {
|
|
77
|
+
ctx = resolveContext(args.profile);
|
|
78
|
+
return await handler(ctx);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
return formatToolError(error, ctx?.meta);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
55
84
|
/**
|
|
56
85
|
* Formats a known Emit error into a structured MCP tool result with optional _meta context.
|
|
57
86
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-errors.js","sourceRoot":"","sources":["../../src/mcp/tool-errors.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tool-errors.js","sourceRoot":"","sources":["../../src/mcp/tool-errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-conflicts.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/sync-conflicts.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"sync-conflicts.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/sync-conflicts.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AASrD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,SAAS,EACjB,cAAc,EAAE,eAAe,GAC9B,IAAI,CA4HN"}
|