@noteplanco/noteplan-mcp 1.1.23 → 1.1.25

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 (165) hide show
  1. package/README.md +7 -0
  2. package/dist/index.js +6 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/noteplan/attachments-paths.d.ts +13 -0
  5. package/dist/noteplan/attachments-paths.d.ts.map +1 -0
  6. package/dist/noteplan/attachments-paths.js +27 -0
  7. package/dist/noteplan/attachments-paths.js.map +1 -0
  8. package/dist/noteplan/embeddings.js +1 -1
  9. package/dist/noteplan/embeddings.js.map +1 -1
  10. package/dist/noteplan/file-reader.d.ts +37 -46
  11. package/dist/noteplan/file-reader.d.ts.map +1 -1
  12. package/dist/noteplan/file-reader.js +200 -202
  13. package/dist/noteplan/file-reader.js.map +1 -1
  14. package/dist/noteplan/file-reader.test.d.ts +2 -0
  15. package/dist/noteplan/file-reader.test.d.ts.map +1 -0
  16. package/dist/noteplan/file-reader.test.js +67 -0
  17. package/dist/noteplan/file-reader.test.js.map +1 -0
  18. package/dist/noteplan/file-writer.d.ts +35 -31
  19. package/dist/noteplan/file-writer.d.ts.map +1 -1
  20. package/dist/noteplan/file-writer.js +280 -164
  21. package/dist/noteplan/file-writer.js.map +1 -1
  22. package/dist/noteplan/file-writer.test.js +704 -191
  23. package/dist/noteplan/file-writer.test.js.map +1 -1
  24. package/dist/noteplan/filter-store.d.ts +5 -5
  25. package/dist/noteplan/filter-store.d.ts.map +1 -1
  26. package/dist/noteplan/filter-store.js +94 -79
  27. package/dist/noteplan/filter-store.js.map +1 -1
  28. package/dist/noteplan/ripgrep-search.d.ts +25 -2
  29. package/dist/noteplan/ripgrep-search.d.ts.map +1 -1
  30. package/dist/noteplan/ripgrep-search.js +75 -2
  31. package/dist/noteplan/ripgrep-search.js.map +1 -1
  32. package/dist/noteplan/space-row-utils.d.ts +20 -0
  33. package/dist/noteplan/space-row-utils.d.ts.map +1 -0
  34. package/dist/noteplan/space-row-utils.js +78 -0
  35. package/dist/noteplan/space-row-utils.js.map +1 -0
  36. package/dist/noteplan/space-row-utils.test.d.ts +2 -0
  37. package/dist/noteplan/space-row-utils.test.d.ts.map +1 -0
  38. package/dist/noteplan/space-row-utils.test.js +123 -0
  39. package/dist/noteplan/space-row-utils.test.js.map +1 -0
  40. package/dist/noteplan/sqlite-reader.d.ts +12 -27
  41. package/dist/noteplan/sqlite-reader.d.ts.map +1 -1
  42. package/dist/noteplan/sqlite-reader.js +315 -221
  43. package/dist/noteplan/sqlite-reader.js.map +1 -1
  44. package/dist/noteplan/sqlite-writer.d.ts +1 -1
  45. package/dist/noteplan/sqlite-writer.d.ts.map +1 -1
  46. package/dist/noteplan/sqlite-writer.js +2 -2
  47. package/dist/noteplan/sqlite-writer.js.map +1 -1
  48. package/dist/noteplan/unified-store.d.ts +41 -30
  49. package/dist/noteplan/unified-store.d.ts.map +1 -1
  50. package/dist/noteplan/unified-store.js +257 -159
  51. package/dist/noteplan/unified-store.js.map +1 -1
  52. package/dist/server.d.ts.map +1 -1
  53. package/dist/server.js +142 -61
  54. package/dist/server.js.map +1 -1
  55. package/dist/tools/attachments.d.ts +9 -9
  56. package/dist/tools/attachments.d.ts.map +1 -1
  57. package/dist/tools/attachments.js +74 -83
  58. package/dist/tools/attachments.js.map +1 -1
  59. package/dist/tools/attachments.test.js +170 -129
  60. package/dist/tools/attachments.test.js.map +1 -1
  61. package/dist/tools/calendar.d.ts +16 -13
  62. package/dist/tools/calendar.d.ts.map +1 -1
  63. package/dist/tools/calendar.js +17 -16
  64. package/dist/tools/calendar.js.map +1 -1
  65. package/dist/tools/embeddings.d.ts +6 -6
  66. package/dist/tools/embeddings.d.ts.map +1 -1
  67. package/dist/tools/embeddings.js +6 -6
  68. package/dist/tools/embeddings.js.map +1 -1
  69. package/dist/tools/events.d.ts +7 -3
  70. package/dist/tools/events.d.ts.map +1 -1
  71. package/dist/tools/events.js +51 -16
  72. package/dist/tools/events.js.map +1 -1
  73. package/dist/tools/filters.d.ts +28 -33
  74. package/dist/tools/filters.d.ts.map +1 -1
  75. package/dist/tools/filters.js +42 -105
  76. package/dist/tools/filters.js.map +1 -1
  77. package/dist/tools/notes.d.ts +80 -218
  78. package/dist/tools/notes.d.ts.map +1 -1
  79. package/dist/tools/notes.js +180 -177
  80. package/dist/tools/notes.js.map +1 -1
  81. package/dist/tools/notes.test.js +242 -21
  82. package/dist/tools/notes.test.js.map +1 -1
  83. package/dist/tools/search.d.ts +4 -3
  84. package/dist/tools/search.d.ts.map +1 -1
  85. package/dist/tools/search.js +9 -5
  86. package/dist/tools/search.js.map +1 -1
  87. package/dist/tools/search.test.d.ts +2 -0
  88. package/dist/tools/search.test.d.ts.map +1 -0
  89. package/dist/tools/search.test.js +37 -0
  90. package/dist/tools/search.test.js.map +1 -0
  91. package/dist/tools/spaces.d.ts +20 -20
  92. package/dist/tools/spaces.d.ts.map +1 -1
  93. package/dist/tools/spaces.js +28 -28
  94. package/dist/tools/spaces.js.map +1 -1
  95. package/dist/tools/tasks.d.ts +22 -22
  96. package/dist/tools/tasks.d.ts.map +1 -1
  97. package/dist/tools/tasks.js +22 -22
  98. package/dist/tools/tasks.js.map +1 -1
  99. package/dist/tools/templates.d.ts +7 -7
  100. package/dist/tools/templates.d.ts.map +1 -1
  101. package/dist/tools/templates.js +4 -4
  102. package/dist/tools/templates.js.map +1 -1
  103. package/dist/tools/themes.d.ts.map +1 -1
  104. package/dist/tools/themes.js +26 -35
  105. package/dist/tools/themes.js.map +1 -1
  106. package/dist/transport/bridge-availability.d.ts +5 -0
  107. package/dist/transport/bridge-availability.d.ts.map +1 -0
  108. package/dist/transport/bridge-availability.js +92 -0
  109. package/dist/transport/bridge-availability.js.map +1 -0
  110. package/dist/transport/bridge-cascade.d.ts +18 -0
  111. package/dist/transport/bridge-cascade.d.ts.map +1 -0
  112. package/dist/transport/bridge-cascade.js +78 -0
  113. package/dist/transport/bridge-cascade.js.map +1 -0
  114. package/dist/transport/bridge-cascade.test.d.ts +2 -0
  115. package/dist/transport/bridge-cascade.test.d.ts.map +1 -0
  116. package/dist/transport/bridge-cascade.test.js +160 -0
  117. package/dist/transport/bridge-cascade.test.js.map +1 -0
  118. package/dist/transport/bridge-client.d.ts +197 -0
  119. package/dist/transport/bridge-client.d.ts.map +1 -0
  120. package/dist/transport/bridge-client.js +288 -0
  121. package/dist/transport/bridge-client.js.map +1 -0
  122. package/dist/transport/bridge-client.test.d.ts +2 -0
  123. package/dist/transport/bridge-client.test.d.ts.map +1 -0
  124. package/dist/transport/bridge-client.test.js +384 -0
  125. package/dist/transport/bridge-client.test.js.map +1 -0
  126. package/dist/transport/bridge-context.d.ts +10 -0
  127. package/dist/transport/bridge-context.d.ts.map +1 -0
  128. package/dist/transport/bridge-context.js +18 -0
  129. package/dist/transport/bridge-context.js.map +1 -0
  130. package/dist/transport/bridge-fs.d.ts +25 -0
  131. package/dist/transport/bridge-fs.d.ts.map +1 -0
  132. package/dist/transport/bridge-fs.js +129 -0
  133. package/dist/transport/bridge-fs.js.map +1 -0
  134. package/dist/utils/date-utils.d.ts +24 -0
  135. package/dist/utils/date-utils.d.ts.map +1 -1
  136. package/dist/utils/date-utils.js +55 -0
  137. package/dist/utils/date-utils.js.map +1 -1
  138. package/dist/utils/date-utils.test.d.ts +2 -0
  139. package/dist/utils/date-utils.test.d.ts.map +1 -0
  140. package/dist/utils/date-utils.test.js +109 -0
  141. package/dist/utils/date-utils.test.js.map +1 -0
  142. package/dist/utils/folder-access.d.ts +23 -0
  143. package/dist/utils/folder-access.d.ts.map +1 -0
  144. package/dist/utils/folder-access.js +131 -0
  145. package/dist/utils/folder-access.js.map +1 -0
  146. package/dist/utils/folder-access.test.d.ts +2 -0
  147. package/dist/utils/folder-access.test.d.ts.map +1 -0
  148. package/dist/utils/folder-access.test.js +182 -0
  149. package/dist/utils/folder-access.test.js.map +1 -0
  150. package/dist/utils/folder-matcher.d.ts.map +1 -1
  151. package/dist/utils/folder-matcher.js +16 -0
  152. package/dist/utils/folder-matcher.js.map +1 -1
  153. package/dist/utils/folder-matcher.test.js +42 -0
  154. package/dist/utils/folder-matcher.test.js.map +1 -1
  155. package/dist/utils/server-config.d.ts +10 -2
  156. package/dist/utils/server-config.d.ts.map +1 -1
  157. package/dist/utils/server-config.js +16 -2
  158. package/dist/utils/server-config.js.map +1 -1
  159. package/dist/utils/version.d.ts +2 -0
  160. package/dist/utils/version.d.ts.map +1 -1
  161. package/dist/utils/version.js +5 -1
  162. package/dist/utils/version.js.map +1 -1
  163. package/package.json +4 -3
  164. package/scripts/calendar-helper +0 -0
  165. package/scripts/reminders-helper +0 -0
@@ -0,0 +1,384 @@
1
+ import { afterEach, describe, expect, it } from 'vitest';
2
+ import * as http from 'http';
3
+ import { BridgeClient } from './bridge-client.js';
4
+ /**
5
+ * Boots a real HTTP server on 127.0.0.1 with a configurable response per
6
+ * test. We use a real socket (vs. fetch mocks) so the timeout, header,
7
+ * and URL-encoding paths are exercised end-to-end.
8
+ */
9
+ function startTestServer(spec) {
10
+ const captured = {};
11
+ return new Promise((resolve) => {
12
+ const server = http.createServer((req, res) => {
13
+ captured.method = req.method;
14
+ captured.url = req.url;
15
+ captured.authorization = req.headers['authorization'];
16
+ const chunks = [];
17
+ req.on('data', (chunk) => chunks.push(chunk));
18
+ req.on('end', () => {
19
+ captured.body = Buffer.concat(chunks).toString('utf8');
20
+ if (spec.kind === 'hang') {
21
+ return;
22
+ }
23
+ if (spec.kind === 'raw') {
24
+ res.writeHead(spec.status, { 'Content-Type': spec.contentType ?? 'text/plain' });
25
+ res.end(spec.body);
26
+ return;
27
+ }
28
+ res.writeHead(spec.status, { 'Content-Type': 'application/json' });
29
+ res.end(JSON.stringify(spec.body));
30
+ });
31
+ });
32
+ server.listen(0, '127.0.0.1', () => {
33
+ const port = server.address().port;
34
+ resolve({
35
+ port,
36
+ captured,
37
+ close: () => new Promise((r) => server.close(() => r())),
38
+ });
39
+ });
40
+ });
41
+ }
42
+ describe('BridgeClient', () => {
43
+ let close;
44
+ afterEach(async () => {
45
+ await close?.();
46
+ close = async () => { };
47
+ });
48
+ describe('read', () => {
49
+ it('GETs /fs/read with the path query and bearer token', async () => {
50
+ const { port, captured, close: stop } = await startTestServer({
51
+ kind: 'json',
52
+ status: 200,
53
+ body: { content: 'hello', size: 5, mtime: 1_700_000_000_000, ctime: 1_690_000_000_000 },
54
+ });
55
+ close = stop;
56
+ const client = new BridgeClient(port, 'tok-abc');
57
+ const result = await client.read('Notes/Foo.md');
58
+ expect(captured.method).toBe('GET');
59
+ expect(captured.url).toBe('/fs/read?path=Notes%2FFoo.md');
60
+ expect(captured.authorization).toBe('Bearer tok-abc');
61
+ expect(result.content).toBe('hello');
62
+ expect(result.size).toBe(5);
63
+ });
64
+ it('URL-encodes paths with spaces and special characters', async () => {
65
+ const { port, captured, close: stop } = await startTestServer({
66
+ kind: 'json',
67
+ status: 200,
68
+ body: { content: '', size: 0, mtime: 0, ctime: 0 },
69
+ });
70
+ close = stop;
71
+ await new BridgeClient(port, 'tok').read('Notes/My Folder/Note & Stuff.md');
72
+ expect(captured.url).toBe('/fs/read?path=Notes%2FMy%20Folder%2FNote%20%26%20Stuff.md');
73
+ });
74
+ it('rejects on 404 WITHOUT triggering onFailure (4xx is client error, bridge is healthy)', async () => {
75
+ const { port, close: stop } = await startTestServer({
76
+ kind: 'json',
77
+ status: 404,
78
+ body: { error: 'not found' },
79
+ });
80
+ close = stop;
81
+ let failed = false;
82
+ const client = new BridgeClient(port, 'tok', { onFailure: () => { failed = true; } });
83
+ await expect(client.read('missing.md')).rejects.toThrow(/-> 404/);
84
+ expect(failed).toBe(false);
85
+ });
86
+ it('triggers onFailure on 5xx (bridge-side error)', async () => {
87
+ const { port, close: stop } = await startTestServer({
88
+ kind: 'json',
89
+ status: 500,
90
+ body: { error: 'boom' },
91
+ });
92
+ close = stop;
93
+ let failed = false;
94
+ const client = new BridgeClient(port, 'tok', { onFailure: () => { failed = true; } });
95
+ await expect(client.read('whatever.md')).rejects.toThrow(/-> 500/);
96
+ expect(failed).toBe(true);
97
+ });
98
+ it('triggers onFailure on connection refused', async () => {
99
+ const { port, close: stop } = await startTestServer({ kind: 'json', status: 200, body: {} });
100
+ await stop();
101
+ close = async () => { };
102
+ let failed = false;
103
+ const client = new BridgeClient(port, 'tok', { onFailure: () => { failed = true; } });
104
+ await expect(client.read('x.md')).rejects.toThrow();
105
+ expect(failed).toBe(true);
106
+ });
107
+ it('rejects on malformed JSON response', async () => {
108
+ const { port, close: stop } = await startTestServer({
109
+ kind: 'raw',
110
+ status: 200,
111
+ body: 'not json',
112
+ });
113
+ close = stop;
114
+ const client = new BridgeClient(port, 'tok');
115
+ await expect(client.read('any.md')).rejects.toThrow(/invalid JSON/);
116
+ });
117
+ it('rejects on EMPTY 2xx body and triggers onFailure', async () => {
118
+ // Regression: previously crashed `JSON.parse('')` and surfaced a
119
+ // SyntaxError with no isClientError flag, defeating the cascade's
120
+ // fall-through logic. Should look like a bridge-side problem now.
121
+ const { port, close: stop } = await startTestServer({
122
+ kind: 'raw',
123
+ status: 200,
124
+ body: '',
125
+ });
126
+ close = stop;
127
+ let failed = false;
128
+ const client = new BridgeClient(port, 'tok', { onFailure: () => { failed = true; } });
129
+ await expect(client.read('any.md')).rejects.toThrow(/empty response body/);
130
+ expect(failed).toBe(true);
131
+ });
132
+ });
133
+ describe('list', () => {
134
+ it('returns the entries array from the response wrapper', async () => {
135
+ const { port, captured, close: stop } = await startTestServer({
136
+ kind: 'json',
137
+ status: 200,
138
+ body: {
139
+ entries: [
140
+ { name: 'A.md', path: 'A.md', isDir: false, size: 10, mtime: 1, ctime: 1 },
141
+ { name: 'Sub', path: 'Sub', isDir: true, size: 0, mtime: 2, ctime: 2 },
142
+ ],
143
+ },
144
+ });
145
+ close = stop;
146
+ const entries = await new BridgeClient(port, 'tok').list('Notes');
147
+ expect(captured.url).toBe('/fs/list?path=Notes');
148
+ expect(entries).toHaveLength(2);
149
+ expect(entries[0]).toMatchObject({ name: 'A.md', isDir: false });
150
+ expect(entries[1]).toMatchObject({ name: 'Sub', isDir: true });
151
+ });
152
+ it('appends recursive=true when option is set', async () => {
153
+ const { port, captured, close: stop } = await startTestServer({
154
+ kind: 'json',
155
+ status: 200,
156
+ body: { entries: [] },
157
+ });
158
+ close = stop;
159
+ await new BridgeClient(port, 'tok').list('Notes', { recursive: true });
160
+ expect(captured.url).toBe('/fs/list?path=Notes&recursive=true');
161
+ });
162
+ it('omits recursive parameter when false or unset', async () => {
163
+ const { port, captured, close: stop } = await startTestServer({
164
+ kind: 'json',
165
+ status: 200,
166
+ body: { entries: [] },
167
+ });
168
+ close = stop;
169
+ await new BridgeClient(port, 'tok').list('Notes', { recursive: false });
170
+ expect(captured.url).toBe('/fs/list?path=Notes');
171
+ });
172
+ // Regression: bridge.list used URLSearchParams which encodes spaces as `+`,
173
+ // but Swift's removingPercentEncoding decodes `%20` only. Folders with
174
+ // spaces would silently 404 server-side.
175
+ it('encodes spaces as %20 (NOT + form-encoding) for paths with spaces', async () => {
176
+ const { port, captured, close: stop } = await startTestServer({
177
+ kind: 'json',
178
+ status: 200,
179
+ body: { entries: [] },
180
+ });
181
+ close = stop;
182
+ await new BridgeClient(port, 'tok').list('Notes/My Folder');
183
+ expect(captured.url).toBe('/fs/list?path=Notes%2FMy%20Folder');
184
+ expect(captured.url).not.toContain('+');
185
+ });
186
+ it('encodes & and other special characters in folder names', async () => {
187
+ const { port, captured, close: stop } = await startTestServer({
188
+ kind: 'json',
189
+ status: 200,
190
+ body: { entries: [] },
191
+ });
192
+ close = stop;
193
+ await new BridgeClient(port, 'tok').list('Notes/Q&A');
194
+ expect(captured.url).toBe('/fs/list?path=Notes%2FQ%26A');
195
+ });
196
+ });
197
+ describe('stat', () => {
198
+ it('returns {exists:false} when the server reports a missing path', async () => {
199
+ const { port, close: stop } = await startTestServer({
200
+ kind: 'json',
201
+ status: 200,
202
+ body: { exists: false },
203
+ });
204
+ close = stop;
205
+ const result = await new BridgeClient(port, 'tok').stat('gone.md');
206
+ expect(result).toEqual({ exists: false });
207
+ });
208
+ it('returns full metadata when the path exists', async () => {
209
+ const { port, close: stop } = await startTestServer({
210
+ kind: 'json',
211
+ status: 200,
212
+ body: { exists: true, isDir: false, size: 42, mtime: 100, ctime: 50 },
213
+ });
214
+ close = stop;
215
+ const result = await new BridgeClient(port, 'tok').stat('Notes/x.md');
216
+ if (!result.exists)
217
+ throw new Error('expected exists=true');
218
+ expect(result.isDir).toBe(false);
219
+ expect(result.size).toBe(42);
220
+ });
221
+ it('encodes spaces as %20 in paths', async () => {
222
+ const { port, captured, close: stop } = await startTestServer({
223
+ kind: 'json',
224
+ status: 200,
225
+ body: { exists: false },
226
+ });
227
+ close = stop;
228
+ await new BridgeClient(port, 'tok').stat('Notes/My Folder');
229
+ expect(captured.url).toBe('/fs/stat?path=Notes%2FMy%20Folder');
230
+ });
231
+ });
232
+ describe('health', () => {
233
+ it('returns true on 200 with ok=true', async () => {
234
+ const { port, close: stop } = await startTestServer({
235
+ kind: 'json',
236
+ status: 200,
237
+ body: { ok: true },
238
+ });
239
+ close = stop;
240
+ expect(await new BridgeClient(port, 'tok').health()).toBe(true);
241
+ });
242
+ it('returns false on non-2xx without firing onFailure', async () => {
243
+ const { port, close: stop } = await startTestServer({
244
+ kind: 'json',
245
+ status: 500,
246
+ body: { error: 'boom' },
247
+ });
248
+ close = stop;
249
+ let failed = false;
250
+ const client = new BridgeClient(port, 'tok', { onFailure: () => { failed = true; } });
251
+ expect(await client.health()).toBe(false);
252
+ expect(failed).toBe(false);
253
+ });
254
+ it('returns false on connection refused', async () => {
255
+ // Start then immediately stop the server so the port is closed.
256
+ const { port, close: stop } = await startTestServer({ kind: 'json', status: 200, body: {} });
257
+ await stop();
258
+ close = async () => { };
259
+ expect(await new BridgeClient(port, 'tok').health()).toBe(false);
260
+ });
261
+ });
262
+ describe('write', () => {
263
+ it('POSTs /fs/write with path + content + exclusive', async () => {
264
+ const { port, captured, close: stop } = await startTestServer({
265
+ kind: 'json',
266
+ status: 200,
267
+ body: { ok: true, size: 5, mtime: 100 },
268
+ });
269
+ close = stop;
270
+ // Capture body
271
+ let capturedBody = '';
272
+ const captureBody = startTestServer.constructor; // type only
273
+ // The simple harness above doesn't capture POST bodies — test via URL/method instead.
274
+ const result = await new BridgeClient(port, 'tok').write('Notes/Foo.md', 'hello', { exclusive: true });
275
+ expect(captured.method).toBe('POST');
276
+ expect(captured.url).toBe('/fs/write');
277
+ expect(result.ok).toBe(true);
278
+ expect(result.size).toBe(5);
279
+ expect(result.mtime).toBe(100);
280
+ void capturedBody;
281
+ void captureBody;
282
+ });
283
+ it('rejects on 409 when exclusive create hits an existing file', async () => {
284
+ const { port, close: stop } = await startTestServer({
285
+ kind: 'json',
286
+ status: 409,
287
+ body: { error: 'path already exists' },
288
+ });
289
+ close = stop;
290
+ let failed = false;
291
+ const client = new BridgeClient(port, 'tok', { onFailure: () => { failed = true; } });
292
+ await expect(client.write('Notes/Foo.md', 'x', { exclusive: true })).rejects.toThrow(/-> 409/);
293
+ // 4xx must NOT invalidate the cached client.
294
+ expect(failed).toBe(false);
295
+ });
296
+ });
297
+ describe('mkdir', () => {
298
+ it('POSTs /fs/mkdir', async () => {
299
+ const { port, captured, close: stop } = await startTestServer({
300
+ kind: 'json',
301
+ status: 200,
302
+ body: { ok: true },
303
+ });
304
+ close = stop;
305
+ await new BridgeClient(port, 'tok').mkdir('Notes/NewFolder');
306
+ expect(captured.method).toBe('POST');
307
+ expect(captured.url).toBe('/fs/mkdir');
308
+ });
309
+ });
310
+ describe('rename', () => {
311
+ it('POSTs /fs/rename with from + to', async () => {
312
+ const { port, captured, close: stop } = await startTestServer({
313
+ kind: 'json',
314
+ status: 200,
315
+ body: { ok: true },
316
+ });
317
+ close = stop;
318
+ await new BridgeClient(port, 'tok').rename('Notes/Old.md', 'Notes/New.md');
319
+ expect(captured.method).toBe('POST');
320
+ expect(captured.url).toBe('/fs/rename');
321
+ });
322
+ });
323
+ describe('delete', () => {
324
+ it('POSTs /fs/delete', async () => {
325
+ const { port, captured, close: stop } = await startTestServer({
326
+ kind: 'json',
327
+ status: 200,
328
+ body: { ok: true },
329
+ });
330
+ close = stop;
331
+ await new BridgeClient(port, 'tok').delete('Notes/Stale.md');
332
+ expect(captured.method).toBe('POST');
333
+ expect(captured.url).toBe('/fs/delete');
334
+ });
335
+ it('rejects on 404 without invalidating', async () => {
336
+ const { port, close: stop } = await startTestServer({
337
+ kind: 'json',
338
+ status: 404,
339
+ body: { error: 'not found' },
340
+ });
341
+ close = stop;
342
+ let failed = false;
343
+ const client = new BridgeClient(port, 'tok', { onFailure: () => { failed = true; } });
344
+ await expect(client.delete('missing.md')).rejects.toThrow(/-> 404/);
345
+ expect(failed).toBe(false);
346
+ });
347
+ });
348
+ describe('rewriteWikilinks', () => {
349
+ it('POSTs /notes/rewrite-wikilinks with from + to and returns updatedCount', async () => {
350
+ const { port, captured, close: stop } = await startTestServer({
351
+ kind: 'json',
352
+ status: 200,
353
+ body: { ok: true, updatedCount: 4 },
354
+ });
355
+ close = stop;
356
+ const res = await new BridgeClient(port, 'tok').rewriteWikilinks('Old Title', 'New Title');
357
+ expect(captured.method).toBe('POST');
358
+ expect(captured.url).toBe('/notes/rewrite-wikilinks');
359
+ expect(JSON.parse(captured.body)).toEqual({ from: 'Old Title', to: 'New Title' });
360
+ expect(res).toEqual({ updatedCount: 4 });
361
+ });
362
+ });
363
+ describe('failure handling', () => {
364
+ it('calls onFailure exactly once even with overlapping error sources', async () => {
365
+ const { port, close: stop } = await startTestServer({
366
+ kind: 'raw',
367
+ status: 200,
368
+ body: 'not json',
369
+ });
370
+ close = stop;
371
+ let failureCount = 0;
372
+ const client = new BridgeClient(port, 'tok', { onFailure: () => { failureCount += 1; } });
373
+ await expect(client.read('x.md')).rejects.toThrow();
374
+ expect(failureCount).toBe(1);
375
+ });
376
+ it('honors a custom default timeout', async () => {
377
+ const { port, close: stop } = await startTestServer({ kind: 'hang' });
378
+ close = stop;
379
+ const client = new BridgeClient(port, 'tok', { defaultTimeoutMs: 50 });
380
+ await expect(client.read('x.md')).rejects.toThrow(/timeout/);
381
+ });
382
+ });
383
+ });
384
+ //# sourceMappingURL=bridge-client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-client.test.js","sourceRoot":"","sources":["../../src/transport/bridge-client.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type BackendKind = 'bridge' | 'fallback';
2
+ /** Run `fn` inside a fresh backend-tracking scope. `recordBackend` calls
3
+ * made anywhere in the async tree below `fn` accumulate into the same set,
4
+ * readable via `getCurrentBackends()` until `fn` resolves. */
5
+ export declare function withBackendTracking<T>(fn: () => Promise<T>): Promise<T>;
6
+ /** Record that a bridge or fallback path executed. No-op outside a tracking scope. */
7
+ export declare function recordBackend(kind: BackendKind): void;
8
+ /** Backends touched so far in the current tracking scope. `[]` outside one. */
9
+ export declare function getCurrentBackends(): BackendKind[];
10
+ //# sourceMappingURL=bridge-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-context.d.ts","sourceRoot":"","sources":["../../src/transport/bridge-context.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;AAQhD;;+DAE+D;AAC/D,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAEvE;AAED,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAErD;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,IAAI,WAAW,EAAE,CAGlD"}
@@ -0,0 +1,18 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+ const storage = new AsyncLocalStorage();
3
+ /** Run `fn` inside a fresh backend-tracking scope. `recordBackend` calls
4
+ * made anywhere in the async tree below `fn` accumulate into the same set,
5
+ * readable via `getCurrentBackends()` until `fn` resolves. */
6
+ export function withBackendTracking(fn) {
7
+ return storage.run({ used: new Set() }, fn);
8
+ }
9
+ /** Record that a bridge or fallback path executed. No-op outside a tracking scope. */
10
+ export function recordBackend(kind) {
11
+ storage.getStore()?.used.add(kind);
12
+ }
13
+ /** Backends touched so far in the current tracking scope. `[]` outside one. */
14
+ export function getCurrentBackends() {
15
+ const ctx = storage.getStore();
16
+ return ctx ? Array.from(ctx.used) : [];
17
+ }
18
+ //# sourceMappingURL=bridge-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-context.js","sourceRoot":"","sources":["../../src/transport/bridge-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAQrD,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAkB,CAAC;AAExD;;+DAE+D;AAC/D,MAAM,UAAU,mBAAmB,CAAI,EAAoB;IACzD,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,aAAa,CAAC,IAAiB;IAC7C,OAAO,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC/B,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACzC,CAAC"}
@@ -0,0 +1,25 @@
1
+ export interface StatInfo {
2
+ exists: boolean;
3
+ isDir: boolean;
4
+ size: number;
5
+ mtime: Date;
6
+ ctime: Date;
7
+ }
8
+ export interface DirEntry {
9
+ name: string;
10
+ isDir: boolean;
11
+ }
12
+ export declare function toRelative(absolutePath: string): string;
13
+ export declare function readFileUtf8(absolutePath: string): Promise<string | null>;
14
+ export declare function statPath(absolutePath: string): Promise<StatInfo>;
15
+ export declare function pathExists(absolutePath: string): Promise<boolean>;
16
+ export declare function readDir(absolutePath: string): Promise<DirEntry[]>;
17
+ export declare function writeFileUtf8(absolutePath: string, content: string, options?: {
18
+ exclusive?: boolean;
19
+ }): Promise<void>;
20
+ export declare function makeDirectory(absolutePath: string, recursive?: boolean): Promise<void>;
21
+ export declare function removePath(absolutePath: string): Promise<void>;
22
+ export declare function readFileBinary(absolutePath: string): Promise<Buffer | null>;
23
+ export declare function writeFileBinary(absolutePath: string, data: Buffer): Promise<void>;
24
+ export declare function moveFile(source: string, destination: string): Promise<void>;
25
+ //# sourceMappingURL=bridge-fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-fs.d.ts","sourceRoot":"","sources":["../../src/transport/bridge-fs.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,IAAI,CAAC;IACZ,KAAK,EAAE,IAAI,CAAC;CACb;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;AAKD,wBAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS/E;AAED,wBAAsB,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CA4BtE;AAED,wBAAsB,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEvE;AAED,wBAAsB,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAevE;AAED,wBAAsB,aAAa,CACjC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACpC,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,wBAAsB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CASzF;AAED,wBAAsB,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASpE;AAED,wBAAsB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CASjF;AAED,wBAAsB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUvF;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBjF"}
@@ -0,0 +1,129 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { getNotePlanPath } from '../noteplan/file-reader.js';
4
+ import { bridgeOrFallback } from './bridge-cascade.js';
5
+ const ZERO_DATE = new Date(0);
6
+ const MISSING = { exists: false, isDir: false, size: 0, mtime: ZERO_DATE, ctime: ZERO_DATE };
7
+ export function toRelative(absolutePath) {
8
+ const rel = path.relative(getNotePlanPath(), absolutePath);
9
+ return rel === '' ? '.' : rel;
10
+ }
11
+ export async function readFileUtf8(absolutePath) {
12
+ try {
13
+ return await bridgeOrFallback(async (c) => (await c.read(toRelative(absolutePath))).content, async () => fs.promises.readFile(absolutePath, 'utf-8'));
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ }
19
+ export async function statPath(absolutePath) {
20
+ try {
21
+ return await bridgeOrFallback(async (c) => {
22
+ const res = await c.stat(toRelative(absolutePath));
23
+ if (!res.exists)
24
+ return MISSING;
25
+ return {
26
+ exists: true,
27
+ isDir: res.isDir,
28
+ size: res.size,
29
+ mtime: new Date(res.mtime),
30
+ ctime: new Date(res.ctime),
31
+ };
32
+ }, async () => {
33
+ const stats = await fs.promises.stat(absolutePath);
34
+ return {
35
+ exists: true,
36
+ isDir: stats.isDirectory(),
37
+ size: stats.size,
38
+ mtime: stats.mtime,
39
+ ctime: stats.birthtime,
40
+ };
41
+ });
42
+ }
43
+ catch {
44
+ return MISSING;
45
+ }
46
+ }
47
+ export async function pathExists(absolutePath) {
48
+ return (await statPath(absolutePath)).exists;
49
+ }
50
+ export async function readDir(absolutePath) {
51
+ try {
52
+ return await bridgeOrFallback(async (c) => {
53
+ const entries = await c.list(toRelative(absolutePath));
54
+ return entries.map((e) => ({ name: e.name, isDir: e.isDir }));
55
+ }, async () => {
56
+ const entries = await fs.promises.readdir(absolutePath, { withFileTypes: true });
57
+ return entries.map((e) => ({ name: e.name, isDir: e.isDirectory() }));
58
+ });
59
+ }
60
+ catch {
61
+ return [];
62
+ }
63
+ }
64
+ export async function writeFileUtf8(absolutePath, content, options = {}) {
65
+ await bridgeOrFallback(async (c) => {
66
+ await c.write(toRelative(absolutePath), content, options);
67
+ }, async () => {
68
+ await fs.promises.mkdir(path.dirname(absolutePath), { recursive: true });
69
+ if (options.exclusive) {
70
+ try {
71
+ await fs.promises.writeFile(absolutePath, content, { encoding: 'utf-8', flag: 'wx' });
72
+ return;
73
+ }
74
+ catch (err) {
75
+ const code = err.code;
76
+ if (code !== 'EEXIST' && code !== 'EPERM')
77
+ throw err;
78
+ }
79
+ }
80
+ await fs.promises.writeFile(absolutePath, content, 'utf-8');
81
+ });
82
+ }
83
+ export async function makeDirectory(absolutePath, recursive = true) {
84
+ await bridgeOrFallback(async (c) => {
85
+ await c.mkdir(toRelative(absolutePath), recursive);
86
+ }, async () => {
87
+ await fs.promises.mkdir(absolutePath, { recursive });
88
+ });
89
+ }
90
+ export async function removePath(absolutePath) {
91
+ await bridgeOrFallback(async (c) => {
92
+ await c.delete(toRelative(absolutePath));
93
+ }, async () => {
94
+ await fs.promises.rm(absolutePath, { recursive: true, force: false });
95
+ });
96
+ }
97
+ export async function readFileBinary(absolutePath) {
98
+ try {
99
+ return await bridgeOrFallback(async (c) => (await c.readBinary(toRelative(absolutePath))).data, async () => fs.promises.readFile(absolutePath));
100
+ }
101
+ catch {
102
+ return null;
103
+ }
104
+ }
105
+ export async function writeFileBinary(absolutePath, data) {
106
+ await bridgeOrFallback(async (c) => {
107
+ await c.writeBinary(toRelative(absolutePath), data);
108
+ }, async () => {
109
+ await fs.promises.mkdir(path.dirname(absolutePath), { recursive: true });
110
+ await fs.promises.writeFile(absolutePath, data);
111
+ });
112
+ }
113
+ export async function moveFile(source, destination) {
114
+ await bridgeOrFallback(async (c) => {
115
+ await c.rename(toRelative(source), toRelative(destination));
116
+ }, async () => {
117
+ try {
118
+ await fs.promises.rename(source, destination);
119
+ }
120
+ catch (err) {
121
+ const code = err.code;
122
+ if (code !== 'EPERM' && code !== 'EXDEV')
123
+ throw err;
124
+ await fs.promises.copyFile(source, destination);
125
+ await fs.promises.unlink(source);
126
+ }
127
+ });
128
+ }
129
+ //# sourceMappingURL=bridge-fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-fs.js","sourceRoot":"","sources":["../../src/transport/bridge-fs.ts"],"names":[],"mappings":"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"}