@sriinnu/harmon-flow 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +79 -0
- package/SKILL.md +44 -0
- package/dist/graph/index.d.ts +116 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +484 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/app-server.d.ts +66 -0
- package/dist/mcp/app-server.d.ts.map +1 -0
- package/dist/mcp/app-server.js +682 -0
- package/dist/mcp/app-server.js.map +1 -0
- package/dist/mcp/auth.d.ts +37 -0
- package/dist/mcp/auth.d.ts.map +1 -0
- package/dist/mcp/auth.js +156 -0
- package/dist/mcp/auth.js.map +1 -0
- package/dist/mcp/cli.d.ts +8 -0
- package/dist/mcp/cli.d.ts.map +1 -0
- package/dist/mcp/cli.js +84 -0
- package/dist/mcp/cli.js.map +1 -0
- package/dist/mcp/daemon-client.d.ts +89 -0
- package/dist/mcp/daemon-client.d.ts.map +1 -0
- package/dist/mcp/daemon-client.js +400 -0
- package/dist/mcp/daemon-client.js.map +1 -0
- package/dist/mcp/http-utils.d.ts +13 -0
- package/dist/mcp/http-utils.d.ts.map +1 -0
- package/dist/mcp/http-utils.js +23 -0
- package/dist/mcp/http-utils.js.map +1 -0
- package/dist/mcp/index.d.ts +90 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +602 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/journal-search.d.ts +31 -0
- package/dist/mcp/journal-search.d.ts.map +1 -0
- package/dist/mcp/journal-search.js +90 -0
- package/dist/mcp/journal-search.js.map +1 -0
- package/dist/mcp/tool-auth.d.ts +14 -0
- package/dist/mcp/tool-auth.d.ts.map +1 -0
- package/dist/mcp/tool-auth.js +25 -0
- package/dist/mcp/tool-auth.js.map +1 -0
- package/dist/parser/frontmatter.d.ts +11 -0
- package/dist/parser/frontmatter.d.ts.map +1 -0
- package/dist/parser/frontmatter.js +28 -0
- package/dist/parser/frontmatter.js.map +1 -0
- package/dist/parser/index.d.ts +53 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +178 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/types.d.ts +197 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +38 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +8 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +21 -0
- package/dist/version.js.map +1 -0
- package/logo.svg +13 -0
- package/package.json +65 -0
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin Harmon daemon client for MCP app tools.
|
|
3
|
+
*/
|
|
4
|
+
import { randomUUID } from 'node:crypto';
|
|
5
|
+
const DEFAULT_DAEMON_ENDPOINT = 'http://127.0.0.1:17373';
|
|
6
|
+
/**
|
|
7
|
+
* I create a daemon client that stays small enough for MCP-facing tool calls.
|
|
8
|
+
*/
|
|
9
|
+
export function createDaemonAppClient(config = {}) {
|
|
10
|
+
const endpoint = config.endpoint ?? process.env.HARMON_ENDPOINT ?? DEFAULT_DAEMON_ENDPOINT;
|
|
11
|
+
const token = config.token ?? process.env.HARMON_API_TOKEN;
|
|
12
|
+
const timeoutMs = config.timeoutMs ?? 10_000;
|
|
13
|
+
let insecureWarned = false;
|
|
14
|
+
const requestJson = async (path, options = {}) => {
|
|
15
|
+
if (!insecureWarned && endpoint.startsWith('http://')) {
|
|
16
|
+
const parsed = new URL(endpoint);
|
|
17
|
+
const loopback = ['127.0.0.1', '::1', 'localhost'].includes(parsed.hostname);
|
|
18
|
+
if (!loopback && token) {
|
|
19
|
+
console.warn('WARNING: Sending auth token over insecure HTTP to %s. Use HTTPS for remote daemons.', parsed.hostname);
|
|
20
|
+
insecureWarned = true;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const url = buildDaemonUrl(endpoint, path);
|
|
24
|
+
for (const [key, value] of Object.entries(options.query ?? {})) {
|
|
25
|
+
if (value !== undefined) {
|
|
26
|
+
url.searchParams.set(key, String(value));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const controller = new AbortController();
|
|
30
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
31
|
+
try {
|
|
32
|
+
const response = await fetch(url, {
|
|
33
|
+
method: options.method ?? 'GET',
|
|
34
|
+
headers: {
|
|
35
|
+
'Content-Type': 'application/json',
|
|
36
|
+
...(token ? { Authorization: `Bearer ${token}` } : {}),
|
|
37
|
+
},
|
|
38
|
+
body: options.body ? JSON.stringify(options.body) : undefined,
|
|
39
|
+
signal: controller.signal,
|
|
40
|
+
});
|
|
41
|
+
if (!response.ok) {
|
|
42
|
+
const detail = await response.text();
|
|
43
|
+
if (response.status >= 500) {
|
|
44
|
+
throw new Error('The Harmon daemon failed to complete the request.');
|
|
45
|
+
}
|
|
46
|
+
throw new Error(detail || `${response.status} ${response.statusText}`);
|
|
47
|
+
}
|
|
48
|
+
if (response.status === 204) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
return (await response.json());
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
clearTimeout(timeout);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
return {
|
|
58
|
+
async getStatus() {
|
|
59
|
+
return requestJson('/v1/status');
|
|
60
|
+
},
|
|
61
|
+
async searchMusic(provider, query, kind, limit) {
|
|
62
|
+
if (provider === 'spotify') {
|
|
63
|
+
const result = await requestJson('/v1/spotify/search', {
|
|
64
|
+
query: {
|
|
65
|
+
q: query,
|
|
66
|
+
type: kind === 'song' ? 'track' : kind,
|
|
67
|
+
limit,
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
return normalizeSpotifySearch(result, kind);
|
|
71
|
+
}
|
|
72
|
+
if (provider === 'apple') {
|
|
73
|
+
const result = await requestJson('/v1/apple/search', {
|
|
74
|
+
query: {
|
|
75
|
+
q: query,
|
|
76
|
+
type: kind === 'track' ? 'songs' : `${kind}s`,
|
|
77
|
+
limit,
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
return normalizeAppleSearch(result, kind);
|
|
81
|
+
}
|
|
82
|
+
const result = await requestJson('/v1/youtube/search', {
|
|
83
|
+
query: {
|
|
84
|
+
q: query,
|
|
85
|
+
type: kind === 'track' ? 'songs' : `${kind}s`,
|
|
86
|
+
limit,
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
return normalizeYouTubeSearch(result, kind);
|
|
90
|
+
},
|
|
91
|
+
async getLibraryTracks(provider, limit) {
|
|
92
|
+
const path = provider === 'spotify'
|
|
93
|
+
? '/v1/spotify/library/tracks'
|
|
94
|
+
: provider === 'apple'
|
|
95
|
+
? '/v1/apple/library/songs'
|
|
96
|
+
: '/v1/youtube/library/tracks';
|
|
97
|
+
const result = provider === 'spotify'
|
|
98
|
+
? await requestJson(path, { query: { limit } })
|
|
99
|
+
: await requestJson(path, { query: { limit } });
|
|
100
|
+
const items = provider === 'spotify'
|
|
101
|
+
? unwrapSpotifyTrackItems(result.items)
|
|
102
|
+
: result;
|
|
103
|
+
return mapTracks(items, provider, provider === 'spotify' ? 'track' : 'song');
|
|
104
|
+
},
|
|
105
|
+
async listPlaylists(provider, limit) {
|
|
106
|
+
const path = provider === 'spotify'
|
|
107
|
+
? '/v1/spotify/playlists'
|
|
108
|
+
: provider === 'apple'
|
|
109
|
+
? '/v1/apple/library/playlists'
|
|
110
|
+
: '/v1/youtube/playlists';
|
|
111
|
+
const result = provider === 'spotify'
|
|
112
|
+
? await requestJson(path, { query: { limit } })
|
|
113
|
+
: await requestJson(path, { query: { limit } });
|
|
114
|
+
return mapCatalogItems(provider === 'spotify'
|
|
115
|
+
? result.items ?? []
|
|
116
|
+
: result, provider, 'playlist');
|
|
117
|
+
},
|
|
118
|
+
async getPlaylistTracks(provider, playlistId, limit) {
|
|
119
|
+
const path = provider === 'spotify'
|
|
120
|
+
? `/v1/spotify/playlists/${encodeURIComponent(playlistId)}/tracks`
|
|
121
|
+
: provider === 'apple'
|
|
122
|
+
? `/v1/apple/playlists/${encodeURIComponent(playlistId)}/tracks`
|
|
123
|
+
: `/v1/youtube/playlists/${encodeURIComponent(playlistId)}/tracks`;
|
|
124
|
+
const result = provider === 'spotify'
|
|
125
|
+
? await requestJson(path, { query: { limit } })
|
|
126
|
+
: await requestJson(path, { query: { limit } });
|
|
127
|
+
return mapTracks(provider === 'spotify'
|
|
128
|
+
? unwrapSpotifyTrackItems(result.items)
|
|
129
|
+
: result, provider, provider === 'spotify' ? 'track' : 'song');
|
|
130
|
+
},
|
|
131
|
+
async getNowPlaying(provider) {
|
|
132
|
+
const path = provider === 'spotify'
|
|
133
|
+
? '/v1/spotify/now-playing'
|
|
134
|
+
: provider === 'apple'
|
|
135
|
+
? '/v1/apple/now-playing'
|
|
136
|
+
: '/v1/youtube/now-playing';
|
|
137
|
+
return requestJson(path);
|
|
138
|
+
},
|
|
139
|
+
async playMusic(provider, target) {
|
|
140
|
+
const path = provider === 'spotify'
|
|
141
|
+
? '/v1/spotify/play'
|
|
142
|
+
: provider === 'apple'
|
|
143
|
+
? '/v1/apple/play'
|
|
144
|
+
: '/v1/youtube/play';
|
|
145
|
+
const body = provider === 'spotify'
|
|
146
|
+
? buildSpotifyPlayBody(target)
|
|
147
|
+
: provider === 'apple'
|
|
148
|
+
? target ? { url: target } : {}
|
|
149
|
+
: target ? { uri: target } : {};
|
|
150
|
+
return requestJson(path, { body, method: 'POST' });
|
|
151
|
+
},
|
|
152
|
+
async pauseMusic(provider) {
|
|
153
|
+
const path = provider === 'spotify'
|
|
154
|
+
? '/v1/spotify/pause'
|
|
155
|
+
: provider === 'apple'
|
|
156
|
+
? '/v1/apple/pause'
|
|
157
|
+
: '/v1/youtube/pause';
|
|
158
|
+
return requestJson(path, { method: 'POST' });
|
|
159
|
+
},
|
|
160
|
+
async nextTrack(provider) {
|
|
161
|
+
const path = provider === 'spotify'
|
|
162
|
+
? '/v1/spotify/next'
|
|
163
|
+
: provider === 'apple'
|
|
164
|
+
? '/v1/apple/next'
|
|
165
|
+
: '/v1/youtube/next';
|
|
166
|
+
return requestJson(path, { method: 'POST' });
|
|
167
|
+
},
|
|
168
|
+
async previousTrack(provider) {
|
|
169
|
+
const path = provider === 'spotify'
|
|
170
|
+
? '/v1/spotify/prev'
|
|
171
|
+
: provider === 'apple'
|
|
172
|
+
? '/v1/apple/prev'
|
|
173
|
+
: '/v1/youtube/prev';
|
|
174
|
+
return requestJson(path, { method: 'POST' });
|
|
175
|
+
},
|
|
176
|
+
async startSession(policy) {
|
|
177
|
+
return requestJson('/v1/command', {
|
|
178
|
+
body: createCommand('session.start', { policy }),
|
|
179
|
+
method: 'POST',
|
|
180
|
+
});
|
|
181
|
+
},
|
|
182
|
+
async nudgeSession(direction, amount, reason) {
|
|
183
|
+
return requestJson('/v1/command', {
|
|
184
|
+
body: createCommand('session.nudge', { amount, direction, reason }),
|
|
185
|
+
method: 'POST',
|
|
186
|
+
});
|
|
187
|
+
},
|
|
188
|
+
async stopSession() {
|
|
189
|
+
return requestJson('/v1/command', {
|
|
190
|
+
body: createCommand('session.stop'),
|
|
191
|
+
method: 'POST',
|
|
192
|
+
});
|
|
193
|
+
},
|
|
194
|
+
// Auth: YouTube
|
|
195
|
+
async youtubeAuthLogin() {
|
|
196
|
+
return requestJson('/v1/auth/youtube/login', { method: 'POST' });
|
|
197
|
+
},
|
|
198
|
+
async youtubeAuthRefresh() {
|
|
199
|
+
return requestJson('/v1/auth/youtube/refresh', { method: 'POST' });
|
|
200
|
+
},
|
|
201
|
+
async youtubeAuthLogout() {
|
|
202
|
+
return requestJson('/v1/auth/youtube/logout', { method: 'POST' });
|
|
203
|
+
},
|
|
204
|
+
// Auth: Apple
|
|
205
|
+
async appleAuthSetUserToken(token) {
|
|
206
|
+
return requestJson('/v1/auth/apple/set-user-token', { body: { token }, method: 'POST' });
|
|
207
|
+
},
|
|
208
|
+
async appleAuthRefresh() {
|
|
209
|
+
return requestJson('/v1/auth/apple/refresh', { method: 'POST' });
|
|
210
|
+
},
|
|
211
|
+
async appleAuthLogout() {
|
|
212
|
+
return requestJson('/v1/auth/apple/logout', { method: 'POST' });
|
|
213
|
+
},
|
|
214
|
+
// Auth: Spotify
|
|
215
|
+
async spotifyAuthLogin() {
|
|
216
|
+
return requestJson('/v1/auth/spotify/login', { method: 'POST' });
|
|
217
|
+
},
|
|
218
|
+
async spotifyAuthLogout() {
|
|
219
|
+
return requestJson('/v1/auth/spotify/logout', { method: 'POST' });
|
|
220
|
+
},
|
|
221
|
+
// Smart play
|
|
222
|
+
async smartSearch(query, limit) {
|
|
223
|
+
return requestJson('/v1/smart/search', {
|
|
224
|
+
query: { q: query, limit },
|
|
225
|
+
});
|
|
226
|
+
},
|
|
227
|
+
async smartPlay(options) {
|
|
228
|
+
return requestJson('/v1/smart/play', { body: options, method: 'POST' });
|
|
229
|
+
},
|
|
230
|
+
// Song recognition
|
|
231
|
+
async recognizeSong(audioBase64) {
|
|
232
|
+
return requestJson('/v1/recognize', { body: { audio: audioBase64 }, method: 'POST' });
|
|
233
|
+
},
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* I preserve any configured daemon base-path prefix instead of letting a
|
|
238
|
+
* leading slash reset the request back to the origin root.
|
|
239
|
+
*/
|
|
240
|
+
function buildDaemonUrl(endpoint, path) {
|
|
241
|
+
const base = new URL(endpoint.endsWith('/') ? endpoint : `${endpoint}/`);
|
|
242
|
+
return new URL(path.replace(/^\//, ''), base);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* I build a daemon command envelope that matches the shared protocol.
|
|
246
|
+
*/
|
|
247
|
+
function createCommand(type, payload) {
|
|
248
|
+
return {
|
|
249
|
+
id: `c_${randomUUID()}`,
|
|
250
|
+
payload,
|
|
251
|
+
source: {
|
|
252
|
+
device: process.platform === 'darwin' ? 'macos' : process.platform === 'win32' ? 'windows' : 'linux',
|
|
253
|
+
kind: 'mcp',
|
|
254
|
+
},
|
|
255
|
+
ts: Date.now(),
|
|
256
|
+
type,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
function normalizeSpotifySearch(result, kind) {
|
|
260
|
+
if (kind === 'track' || kind === 'song') {
|
|
261
|
+
return mapTracks(result.tracks, 'spotify', 'track');
|
|
262
|
+
}
|
|
263
|
+
return mapCatalogItems(result[kind === 'playlist' ? 'playlists' : `${kind}s`], 'spotify', kind);
|
|
264
|
+
}
|
|
265
|
+
function normalizeAppleSearch(result, kind) {
|
|
266
|
+
const key = kind === 'track' || kind === 'song' ? 'songs' : `${kind}s`;
|
|
267
|
+
if (key === 'songs') {
|
|
268
|
+
return mapTracks(result.songs, 'apple', 'song');
|
|
269
|
+
}
|
|
270
|
+
return mapCatalogItems(result[key], 'apple', kind === 'track' ? 'song' : kind);
|
|
271
|
+
}
|
|
272
|
+
function normalizeYouTubeSearch(result, kind) {
|
|
273
|
+
const key = kind === 'track' || kind === 'song' ? 'songs' : `${kind}s`;
|
|
274
|
+
if (key === 'songs') {
|
|
275
|
+
return mapTracks(result.songs, 'youtube', 'song');
|
|
276
|
+
}
|
|
277
|
+
return mapCatalogItems(result[key], 'youtube', kind === 'track' ? 'song' : kind);
|
|
278
|
+
}
|
|
279
|
+
function mapTracks(value, provider, kind) {
|
|
280
|
+
if (!Array.isArray(value)) {
|
|
281
|
+
return [];
|
|
282
|
+
}
|
|
283
|
+
return value.flatMap((item) => {
|
|
284
|
+
if (!item || typeof item !== 'object') {
|
|
285
|
+
return [];
|
|
286
|
+
}
|
|
287
|
+
const track = item;
|
|
288
|
+
const title = typeof track.name === 'string' ? track.name : '';
|
|
289
|
+
const artist = typeof track.artist === 'string'
|
|
290
|
+
? track.artist
|
|
291
|
+
: typeof track.artistName === 'string'
|
|
292
|
+
? track.artistName
|
|
293
|
+
: undefined;
|
|
294
|
+
if (!title) {
|
|
295
|
+
return [];
|
|
296
|
+
}
|
|
297
|
+
return [{
|
|
298
|
+
album: typeof track.album === 'string'
|
|
299
|
+
? track.album
|
|
300
|
+
: typeof track.albumName === 'string'
|
|
301
|
+
? track.albumName
|
|
302
|
+
: undefined,
|
|
303
|
+
durationMs: typeof track.durationMs === 'number' ? track.durationMs : undefined,
|
|
304
|
+
id: typeof track.id === 'string' ? track.id : title,
|
|
305
|
+
imageUrl: typeof track.imageUrl === 'string'
|
|
306
|
+
? track.imageUrl
|
|
307
|
+
: typeof track.thumbnailUrl === 'string'
|
|
308
|
+
? track.thumbnailUrl
|
|
309
|
+
: undefined,
|
|
310
|
+
kind,
|
|
311
|
+
provider,
|
|
312
|
+
subtitle: artist,
|
|
313
|
+
title,
|
|
314
|
+
uri: typeof track.uri === 'string' ? track.uri : defaultTrackUri(provider, kind, typeof track.id === 'string' ? track.id : title),
|
|
315
|
+
url: typeof track.url === 'string' ? track.url : undefined,
|
|
316
|
+
}];
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
function unwrapSpotifyTrackItems(value) {
|
|
320
|
+
if (!Array.isArray(value)) {
|
|
321
|
+
return [];
|
|
322
|
+
}
|
|
323
|
+
return value.flatMap((item) => {
|
|
324
|
+
if (!item || typeof item !== 'object') {
|
|
325
|
+
return [];
|
|
326
|
+
}
|
|
327
|
+
const wrapped = 'track' in item && item.track && typeof item.track === 'object'
|
|
328
|
+
? item.track
|
|
329
|
+
: item;
|
|
330
|
+
return [wrapped];
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
function mapCatalogItems(value, provider, kind) {
|
|
334
|
+
if (!Array.isArray(value)) {
|
|
335
|
+
return [];
|
|
336
|
+
}
|
|
337
|
+
return value.flatMap((item) => {
|
|
338
|
+
if (!item || typeof item !== 'object') {
|
|
339
|
+
return [];
|
|
340
|
+
}
|
|
341
|
+
const candidate = item;
|
|
342
|
+
const title = typeof candidate.name === 'string' ? candidate.name : '';
|
|
343
|
+
if (!title) {
|
|
344
|
+
return [];
|
|
345
|
+
}
|
|
346
|
+
return [{
|
|
347
|
+
id: typeof candidate.id === 'string' ? candidate.id : title,
|
|
348
|
+
imageUrl: typeof candidate.imageUrl === 'string'
|
|
349
|
+
? candidate.imageUrl
|
|
350
|
+
: typeof candidate.thumbnailUrl === 'string'
|
|
351
|
+
? candidate.thumbnailUrl
|
|
352
|
+
: undefined,
|
|
353
|
+
kind,
|
|
354
|
+
provider,
|
|
355
|
+
subtitle: firstString(candidate.artistName, candidate.owner, candidate.curatorName, candidate.author, candidate.publisher),
|
|
356
|
+
title,
|
|
357
|
+
uri: typeof candidate.uri === 'string' ? candidate.uri : defaultCatalogUri(provider, kind, typeof candidate.id === 'string' ? candidate.id : title),
|
|
358
|
+
url: typeof candidate.url === 'string' ? candidate.url : undefined,
|
|
359
|
+
}];
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
function firstString(...values) {
|
|
363
|
+
for (const value of values) {
|
|
364
|
+
if (typeof value === 'string' && value.length > 0) {
|
|
365
|
+
return value;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
return undefined;
|
|
369
|
+
}
|
|
370
|
+
function buildSpotifyPlayBody(target) {
|
|
371
|
+
if (!target) {
|
|
372
|
+
return {};
|
|
373
|
+
}
|
|
374
|
+
if (target.startsWith('spotify:album:') ||
|
|
375
|
+
target.startsWith('spotify:artist:') ||
|
|
376
|
+
target.startsWith('spotify:playlist:') ||
|
|
377
|
+
target.startsWith('spotify:show:')) {
|
|
378
|
+
return { contextUri: target };
|
|
379
|
+
}
|
|
380
|
+
return { uri: target };
|
|
381
|
+
}
|
|
382
|
+
function defaultTrackUri(provider, kind, id) {
|
|
383
|
+
if (provider === 'spotify') {
|
|
384
|
+
return `spotify:${kind === 'song' ? 'track' : kind}:${id}`;
|
|
385
|
+
}
|
|
386
|
+
if (provider === 'youtube') {
|
|
387
|
+
return `youtube:video:${id}`;
|
|
388
|
+
}
|
|
389
|
+
return undefined;
|
|
390
|
+
}
|
|
391
|
+
function defaultCatalogUri(provider, kind, id) {
|
|
392
|
+
if (provider === 'spotify') {
|
|
393
|
+
return `spotify:${kind}:${id}`;
|
|
394
|
+
}
|
|
395
|
+
if (provider === 'youtube' && kind === 'playlist') {
|
|
396
|
+
return `youtube:playlist:${id}`;
|
|
397
|
+
}
|
|
398
|
+
return undefined;
|
|
399
|
+
}
|
|
400
|
+
//# sourceMappingURL=daemon-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-client.js","sourceRoot":"","sources":["../../src/mcp/daemon-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small HTTP helpers for the remote MCP server.
|
|
3
|
+
*/
|
|
4
|
+
import type { IncomingMessage } from 'node:http';
|
|
5
|
+
/**
|
|
6
|
+
* I read a JSON request body when the MCP transport needs a parsed POST payload.
|
|
7
|
+
*/
|
|
8
|
+
export declare function readJsonBody(req: IncomingMessage): Promise<unknown>;
|
|
9
|
+
/**
|
|
10
|
+
* I normalize headers that can arrive as a string array in Node HTTP servers.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getHeaderValue(value: string | string[] | undefined): string | undefined;
|
|
13
|
+
//# sourceMappingURL=http-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-utils.d.ts","sourceRoot":"","sources":["../../src/mcp/http-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD;;GAEG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAWzE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAEvF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small HTTP helpers for the remote MCP server.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* I read a JSON request body when the MCP transport needs a parsed POST payload.
|
|
6
|
+
*/
|
|
7
|
+
export async function readJsonBody(req) {
|
|
8
|
+
const chunks = [];
|
|
9
|
+
for await (const chunk of req) {
|
|
10
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
11
|
+
}
|
|
12
|
+
if (chunks.length === 0) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
return JSON.parse(Buffer.concat(chunks).toString('utf8'));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* I normalize headers that can arrive as a string array in Node HTTP servers.
|
|
19
|
+
*/
|
|
20
|
+
export function getHeaderValue(value) {
|
|
21
|
+
return Array.isArray(value) ? value[0] : value;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=http-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-utils.js","sourceRoot":"","sources":["../../src/mcp/http-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAoB;IACrD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAoC;IACjE,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Harmon Flow MCP Server - Local MCP server for journal-based pattern detection
|
|
3
|
+
*/
|
|
4
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
5
|
+
export { HarmonAppMCPServer, createAppMCPServer } from './app-server.js';
|
|
6
|
+
export type { HarmonAppMCPServerConfig } from './app-server.js';
|
|
7
|
+
export type { HarmonMcpAuthConfig } from './auth.js';
|
|
8
|
+
interface FlowServerConfig {
|
|
9
|
+
flowDir?: string;
|
|
10
|
+
name?: string;
|
|
11
|
+
version?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare class HarmonFlowMCPServer {
|
|
14
|
+
private server;
|
|
15
|
+
private parser;
|
|
16
|
+
private entries;
|
|
17
|
+
private graphBuilt;
|
|
18
|
+
private graph;
|
|
19
|
+
private suggestionEngine;
|
|
20
|
+
constructor(config?: FlowServerConfig);
|
|
21
|
+
/**
|
|
22
|
+
* Set up request handlers
|
|
23
|
+
*/
|
|
24
|
+
private setupHandlers;
|
|
25
|
+
/**
|
|
26
|
+
* Refresh entries from disk
|
|
27
|
+
*/
|
|
28
|
+
private refreshEntries;
|
|
29
|
+
/**
|
|
30
|
+
* Build the graph if not already built
|
|
31
|
+
*/
|
|
32
|
+
private ensureGraphBuilt;
|
|
33
|
+
/**
|
|
34
|
+
* Get all tool definitions
|
|
35
|
+
*/
|
|
36
|
+
private getToolDefinitions;
|
|
37
|
+
/**
|
|
38
|
+
* Get tool handler by name
|
|
39
|
+
*/
|
|
40
|
+
private getToolHandler;
|
|
41
|
+
/**
|
|
42
|
+
* Handle get_suggestions tool
|
|
43
|
+
*/
|
|
44
|
+
private handleGetSuggestions;
|
|
45
|
+
/**
|
|
46
|
+
* Handle find_similar_sessions tool
|
|
47
|
+
*/
|
|
48
|
+
private handleFindSimilarSessions;
|
|
49
|
+
/**
|
|
50
|
+
* Handle get_patterns tool
|
|
51
|
+
*/
|
|
52
|
+
private handleGetPatterns;
|
|
53
|
+
/**
|
|
54
|
+
* Handle get_stats tool
|
|
55
|
+
*/
|
|
56
|
+
private handleGetStats;
|
|
57
|
+
/**
|
|
58
|
+
* Handle get_entries tool
|
|
59
|
+
*/
|
|
60
|
+
private handleGetEntries;
|
|
61
|
+
/**
|
|
62
|
+
* Handle write_entry tool
|
|
63
|
+
*/
|
|
64
|
+
private handleWriteEntry;
|
|
65
|
+
/**
|
|
66
|
+
* Handle analyze_mood_trends tool
|
|
67
|
+
*/
|
|
68
|
+
private handleAnalyzeMoodTrends;
|
|
69
|
+
/**
|
|
70
|
+
* Handle get_graph tool
|
|
71
|
+
*/
|
|
72
|
+
private handleGetGraph;
|
|
73
|
+
/**
|
|
74
|
+
* Format entry for display
|
|
75
|
+
*/
|
|
76
|
+
private formatEntryForDisplay;
|
|
77
|
+
/**
|
|
78
|
+
* Start the MCP server
|
|
79
|
+
*/
|
|
80
|
+
start(): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Get server instance
|
|
83
|
+
*/
|
|
84
|
+
getServer(): Server;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Create and start the MCP server
|
|
88
|
+
*/
|
|
89
|
+
export declare function createMCPServer(config?: FlowServerConfig): Promise<HarmonFlowMCPServer>;
|
|
90
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAYnE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACzE,YAAY,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAChE,YAAY,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAErD,UAAU,gBAAgB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,gBAAgB,CAAiC;gBAE7C,MAAM,GAAE,gBAAqB;IAWzC;;OAEG;IACH,OAAO,CAAC,aAAa;IAoFrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAKtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwJ1B;;OAEG;IACH,OAAO,CAAC,cAAc;IAetB;;OAEG;YACW,oBAAoB;IAwClC;;OAEG;YACW,yBAAyB;IAuCvC;;OAEG;YACW,iBAAiB;IA4B/B;;OAEG;YACW,cAAc;IAiB5B;;OAEG;YACW,gBAAgB;IAqC9B;;OAEG;YACW,gBAAgB;IAgC9B;;OAEG;YACW,uBAAuB;IAsErC;;OAEG;YACW,cAAc;IA4C5B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAa7B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B;;OAEG;IACH,SAAS,IAAI,MAAM;CAGpB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAI7F"}
|