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.
Files changed (237) hide show
  1. package/CHANGELOG.md +249 -1
  2. package/README.md +22 -11
  3. package/dist/cli/commands/conflicts.d.ts.map +1 -1
  4. package/dist/cli/commands/conflicts.js +2 -22
  5. package/dist/cli/commands/conflicts.js.map +1 -1
  6. package/dist/cli/commands/delete.d.ts.map +1 -1
  7. package/dist/cli/commands/delete.js +1 -13
  8. package/dist/cli/commands/delete.js.map +1 -1
  9. package/dist/cli/commands/doctor.d.ts.map +1 -1
  10. package/dist/cli/commands/doctor.js +1 -13
  11. package/dist/cli/commands/doctor.js.map +1 -1
  12. package/dist/cli/commands/media.d.ts.map +1 -1
  13. package/dist/cli/commands/media.js +1 -13
  14. package/dist/cli/commands/media.js.map +1 -1
  15. package/dist/cli/commands/new.d.ts.map +1 -1
  16. package/dist/cli/commands/new.js +31 -13
  17. package/dist/cli/commands/new.js.map +1 -1
  18. package/dist/cli/commands/pull.d.ts +1 -1
  19. package/dist/cli/commands/pull.d.ts.map +1 -1
  20. package/dist/cli/commands/pull.js +110 -79
  21. package/dist/cli/commands/pull.js.map +1 -1
  22. package/dist/cli/commands/push.d.ts +1 -1
  23. package/dist/cli/commands/push.d.ts.map +1 -1
  24. package/dist/cli/commands/push.js +32 -90
  25. package/dist/cli/commands/push.js.map +1 -1
  26. package/dist/cli/commands/status.d.ts.map +1 -1
  27. package/dist/cli/commands/status.js +7 -2
  28. package/dist/cli/commands/status.js.map +1 -1
  29. package/dist/cli/context.d.ts +12 -0
  30. package/dist/cli/context.d.ts.map +1 -1
  31. package/dist/cli/context.js +27 -1
  32. package/dist/cli/context.js.map +1 -1
  33. package/dist/cli/report-failure.d.ts +6 -0
  34. package/dist/cli/report-failure.d.ts.map +1 -0
  35. package/dist/cli/report-failure.js +71 -0
  36. package/dist/cli/report-failure.js.map +1 -0
  37. package/dist/client/api.d.ts +20 -0
  38. package/dist/client/api.d.ts.map +1 -1
  39. package/dist/client/api.js +90 -1
  40. package/dist/client/api.js.map +1 -1
  41. package/dist/client/lock.js.map +1 -1
  42. package/dist/client/mapper.js.map +1 -1
  43. package/dist/client/media.d.ts.map +1 -1
  44. package/dist/client/media.js.map +1 -1
  45. package/dist/db/baseline.d.ts +19 -3
  46. package/dist/db/baseline.d.ts.map +1 -1
  47. package/dist/db/baseline.js +27 -2
  48. package/dist/db/baseline.js.map +1 -1
  49. package/dist/db/cache.d.ts +7 -3
  50. package/dist/db/cache.d.ts.map +1 -1
  51. package/dist/db/cache.js +24 -295
  52. package/dist/db/cache.js.map +1 -1
  53. package/dist/db/migrations.d.ts +7 -0
  54. package/dist/db/migrations.d.ts.map +1 -0
  55. package/dist/db/migrations.js +320 -0
  56. package/dist/db/migrations.js.map +1 -0
  57. package/dist/mcp/heartbeat.d.ts +1 -34
  58. package/dist/mcp/heartbeat.d.ts.map +1 -1
  59. package/dist/mcp/heartbeat.js +1 -113
  60. package/dist/mcp/heartbeat.js.map +1 -1
  61. package/dist/mcp/tool-errors.d.ts +12 -1
  62. package/dist/mcp/tool-errors.d.ts.map +1 -1
  63. package/dist/mcp/tool-errors.js +29 -0
  64. package/dist/mcp/tool-errors.js.map +1 -1
  65. package/dist/mcp/tools/sync-conflicts.d.ts.map +1 -1
  66. package/dist/mcp/tools/sync-conflicts.js +46 -58
  67. package/dist/mcp/tools/sync-conflicts.js.map +1 -1
  68. package/dist/mcp/tools/sync-delete.d.ts.map +1 -1
  69. package/dist/mcp/tools/sync-delete.js +18 -30
  70. package/dist/mcp/tools/sync-delete.js.map +1 -1
  71. package/dist/mcp/tools/sync-diff.d.ts.map +1 -1
  72. package/dist/mcp/tools/sync-diff.js +10 -31
  73. package/dist/mcp/tools/sync-diff.js.map +1 -1
  74. package/dist/mcp/tools/sync-doctor.d.ts.map +1 -1
  75. package/dist/mcp/tools/sync-doctor.js +18 -30
  76. package/dist/mcp/tools/sync-doctor.js.map +1 -1
  77. package/dist/mcp/tools/sync-media-search.d.ts.map +1 -1
  78. package/dist/mcp/tools/sync-media-search.js +40 -52
  79. package/dist/mcp/tools/sync-media-search.js.map +1 -1
  80. package/dist/mcp/tools/sync-new.d.ts.map +1 -1
  81. package/dist/mcp/tools/sync-new.js +54 -34
  82. package/dist/mcp/tools/sync-new.js.map +1 -1
  83. package/dist/mcp/tools/sync-pull.d.ts.map +1 -1
  84. package/dist/mcp/tools/sync-pull.js +194 -220
  85. package/dist/mcp/tools/sync-pull.js.map +1 -1
  86. package/dist/mcp/tools/sync-push.d.ts.map +1 -1
  87. package/dist/mcp/tools/sync-push.js +64 -84
  88. package/dist/mcp/tools/sync-push.js.map +1 -1
  89. package/dist/mcp/tools/sync-status.d.ts.map +1 -1
  90. package/dist/mcp/tools/sync-status.js +4 -13
  91. package/dist/mcp/tools/sync-status.js.map +1 -1
  92. package/dist/sync/baseline-reconstruction.d.ts +43 -0
  93. package/dist/sync/baseline-reconstruction.d.ts.map +1 -0
  94. package/dist/sync/baseline-reconstruction.js +103 -0
  95. package/dist/sync/baseline-reconstruction.js.map +1 -0
  96. package/dist/sync/bylines.d.ts +5 -0
  97. package/dist/sync/bylines.d.ts.map +1 -1
  98. package/dist/sync/bylines.js +29 -0
  99. package/dist/sync/bylines.js.map +1 -1
  100. package/dist/sync/conflicts.d.ts.map +1 -1
  101. package/dist/sync/conflicts.js +21 -4
  102. package/dist/sync/conflicts.js.map +1 -1
  103. package/dist/sync/delete.d.ts.map +1 -1
  104. package/dist/sync/delete.js +12 -1
  105. package/dist/sync/delete.js.map +1 -1
  106. package/dist/sync/diff.d.ts.map +1 -1
  107. package/dist/sync/diff.js +62 -26
  108. package/dist/sync/diff.js.map +1 -1
  109. package/dist/sync/doctor.d.ts.map +1 -1
  110. package/dist/sync/doctor.js +13 -3
  111. package/dist/sync/doctor.js.map +1 -1
  112. package/dist/sync/guards.d.ts +1 -1
  113. package/dist/sync/guards.d.ts.map +1 -1
  114. package/dist/sync/guards.js +3 -2
  115. package/dist/sync/guards.js.map +1 -1
  116. package/dist/sync/media/companions.d.ts.map +1 -1
  117. package/dist/sync/media/companions.js.map +1 -1
  118. package/dist/sync/media/naming_mirror.d.ts.map +1 -1
  119. package/dist/sync/media/naming_mirror.js +11 -2
  120. package/dist/sync/media/naming_mirror.js.map +1 -1
  121. package/dist/sync/media/pull_article.d.ts +2 -0
  122. package/dist/sync/media/pull_article.d.ts.map +1 -1
  123. package/dist/sync/media/pull_article.js +74 -25
  124. package/dist/sync/media/pull_article.js.map +1 -1
  125. package/dist/sync/media/pull_library.d.ts.map +1 -1
  126. package/dist/sync/media/pull_library.js +34 -61
  127. package/dist/sync/media/pull_library.js.map +1 -1
  128. package/dist/sync/media/remote_index.d.ts +16 -1
  129. package/dist/sync/media/remote_index.d.ts.map +1 -1
  130. package/dist/sync/media/remote_index.js +2 -2
  131. package/dist/sync/media/remote_index.js.map +1 -1
  132. package/dist/sync/merge.d.ts +1 -1
  133. package/dist/sync/merge.d.ts.map +1 -1
  134. package/dist/sync/merge.js +50 -17
  135. package/dist/sync/merge.js.map +1 -1
  136. package/dist/sync/new.d.ts +11 -0
  137. package/dist/sync/new.d.ts.map +1 -1
  138. package/dist/sync/new.js +81 -3
  139. package/dist/sync/new.js.map +1 -1
  140. package/dist/sync/orchestrator.d.ts +34 -0
  141. package/dist/sync/orchestrator.d.ts.map +1 -1
  142. package/dist/sync/orchestrator.js +89 -80
  143. package/dist/sync/orchestrator.js.map +1 -1
  144. package/dist/sync/preflight/image_probe.d.ts +28 -0
  145. package/dist/sync/preflight/image_probe.d.ts.map +1 -0
  146. package/dist/sync/preflight/image_probe.js +70 -0
  147. package/dist/sync/preflight/image_probe.js.map +1 -0
  148. package/dist/sync/preflight.d.ts +7 -0
  149. package/dist/sync/preflight.d.ts.map +1 -1
  150. package/dist/sync/preflight.js +127 -31
  151. package/dist/sync/preflight.js.map +1 -1
  152. package/dist/sync/pull/fast_path.d.ts +9 -0
  153. package/dist/sync/pull/fast_path.d.ts.map +1 -0
  154. package/dist/sync/pull/fast_path.js +341 -0
  155. package/dist/sync/pull/fast_path.js.map +1 -0
  156. package/dist/sync/pull/index.d.ts +15 -0
  157. package/dist/sync/pull/index.d.ts.map +1 -0
  158. package/dist/sync/pull/index.js +363 -0
  159. package/dist/sync/pull/index.js.map +1 -0
  160. package/dist/sync/pull/list.d.ts +22 -0
  161. package/dist/sync/pull/list.d.ts.map +1 -0
  162. package/dist/sync/pull/list.js +175 -0
  163. package/dist/sync/pull/list.js.map +1 -0
  164. package/dist/sync/pull/media_stage.d.ts +67 -0
  165. package/dist/sync/pull/media_stage.d.ts.map +1 -0
  166. package/dist/sync/pull/media_stage.js +599 -0
  167. package/dist/sync/pull/media_stage.js.map +1 -0
  168. package/dist/sync/pull/quarantine.d.ts +22 -0
  169. package/dist/sync/pull/quarantine.d.ts.map +1 -0
  170. package/dist/sync/pull/quarantine.js +174 -0
  171. package/dist/sync/pull/quarantine.js.map +1 -0
  172. package/dist/sync/pull/types.d.ts +125 -0
  173. package/dist/sync/pull/types.d.ts.map +1 -0
  174. package/dist/sync/pull/types.js +23 -0
  175. package/dist/sync/pull/types.js.map +1 -0
  176. package/dist/sync/pull.d.ts +1 -114
  177. package/dist/sync/pull.d.ts.map +1 -1
  178. package/dist/sync/pull.js +1 -806
  179. package/dist/sync/pull.js.map +1 -1
  180. package/dist/sync/push/commit.d.ts +1 -0
  181. package/dist/sync/push/commit.d.ts.map +1 -1
  182. package/dist/sync/push/commit.js +58 -31
  183. package/dist/sync/push/commit.js.map +1 -1
  184. package/dist/sync/push/index.d.ts.map +1 -1
  185. package/dist/sync/push/index.js +30 -8
  186. package/dist/sync/push/index.js.map +1 -1
  187. package/dist/sync/push/media_stage.d.ts +17 -2
  188. package/dist/sync/push/media_stage.d.ts.map +1 -1
  189. package/dist/sync/push/media_stage.js +31 -2
  190. package/dist/sync/push/media_stage.js.map +1 -1
  191. package/dist/sync/push/merge_stage.d.ts.map +1 -1
  192. package/dist/sync/push/merge_stage.js +36 -22
  193. package/dist/sync/push/merge_stage.js.map +1 -1
  194. package/dist/sync/push/transport.d.ts +6 -2
  195. package/dist/sync/push/transport.d.ts.map +1 -1
  196. package/dist/sync/push/transport.js +5 -5
  197. package/dist/sync/push/transport.js.map +1 -1
  198. package/dist/sync/status.d.ts +3 -0
  199. package/dist/sync/status.d.ts.map +1 -1
  200. package/dist/sync/status.js +18 -55
  201. package/dist/sync/status.js.map +1 -1
  202. package/dist/sync/taxonomies.d.ts +25 -0
  203. package/dist/sync/taxonomies.d.ts.map +1 -1
  204. package/dist/sync/taxonomies.js +180 -127
  205. package/dist/sync/taxonomies.js.map +1 -1
  206. package/dist/sync/workspace/commit.d.ts +46 -0
  207. package/dist/sync/workspace/commit.d.ts.map +1 -0
  208. package/dist/sync/workspace/commit.js +85 -0
  209. package/dist/sync/workspace/commit.js.map +1 -0
  210. package/dist/sync/workspace/index.d.ts +1 -0
  211. package/dist/sync/workspace/index.d.ts.map +1 -1
  212. package/dist/sync/workspace/index.js +1 -0
  213. package/dist/sync/workspace/index.js.map +1 -1
  214. package/dist/utils/disk-spelling.d.ts +26 -0
  215. package/dist/utils/disk-spelling.d.ts.map +1 -0
  216. package/dist/utils/disk-spelling.js +51 -0
  217. package/dist/utils/disk-spelling.js.map +1 -0
  218. package/dist/utils/draft-revision.d.ts +15 -0
  219. package/dist/utils/draft-revision.d.ts.map +1 -0
  220. package/dist/utils/draft-revision.js +36 -0
  221. package/dist/utils/draft-revision.js.map +1 -0
  222. package/dist/utils/frontmatter.d.ts +21 -2
  223. package/dist/utils/frontmatter.d.ts.map +1 -1
  224. package/dist/utils/frontmatter.js +70 -7
  225. package/dist/utils/frontmatter.js.map +1 -1
  226. package/dist/utils/mcp-heartbeat.d.ts +36 -0
  227. package/dist/utils/mcp-heartbeat.d.ts.map +1 -0
  228. package/dist/utils/mcp-heartbeat.js +126 -0
  229. package/dist/utils/mcp-heartbeat.js.map +1 -0
  230. package/dist/utils/media-body-refs.d.ts.map +1 -1
  231. package/dist/utils/media-body-refs.js +2 -2
  232. package/dist/utils/media-body-refs.js.map +1 -1
  233. package/dist/utils/taxonomy-key.d.ts +25 -0
  234. package/dist/utils/taxonomy-key.d.ts.map +1 -0
  235. package/dist/utils/taxonomy-key.js +51 -0
  236. package/dist/utils/taxonomy-key.js.map +1 -0
  237. 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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"}
@@ -1,35 +1,2 @@
1
- export interface McpHeartbeatState {
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":"AA2BA,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IAC/C,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAG5C;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAS1C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,CAAC,EACL,MAAM,GACN;IACE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GACJ,IAAI,CAiBN;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,qBAAqB,CAAC,EAAE,MAAM,GAAG,qBAAqB,CAkErF"}
1
+ {"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../src/mcp/heartbeat.ts"],"names":[],"mappings":"AAsBA,cAAc,2BAA2B,CAAC"}
@@ -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
- import fs from 'node:fs';
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":"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"}
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;AAyB5C;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,cAAc,CAU/F;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,cAAc,CAwH9E"}
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"}
@@ -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,EAAiB,MAAM,eAAe,CAAC;AASpE,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,SAAS,EACjB,cAAc,EAAE,eAAe,GAC9B,IAAI,CAsIN"}
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"}