@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.
Files changed (61) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +79 -0
  3. package/SKILL.md +44 -0
  4. package/dist/graph/index.d.ts +116 -0
  5. package/dist/graph/index.d.ts.map +1 -0
  6. package/dist/graph/index.js +484 -0
  7. package/dist/graph/index.js.map +1 -0
  8. package/dist/index.d.ts +9 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +10 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/mcp/app-server.d.ts +66 -0
  13. package/dist/mcp/app-server.d.ts.map +1 -0
  14. package/dist/mcp/app-server.js +682 -0
  15. package/dist/mcp/app-server.js.map +1 -0
  16. package/dist/mcp/auth.d.ts +37 -0
  17. package/dist/mcp/auth.d.ts.map +1 -0
  18. package/dist/mcp/auth.js +156 -0
  19. package/dist/mcp/auth.js.map +1 -0
  20. package/dist/mcp/cli.d.ts +8 -0
  21. package/dist/mcp/cli.d.ts.map +1 -0
  22. package/dist/mcp/cli.js +84 -0
  23. package/dist/mcp/cli.js.map +1 -0
  24. package/dist/mcp/daemon-client.d.ts +89 -0
  25. package/dist/mcp/daemon-client.d.ts.map +1 -0
  26. package/dist/mcp/daemon-client.js +400 -0
  27. package/dist/mcp/daemon-client.js.map +1 -0
  28. package/dist/mcp/http-utils.d.ts +13 -0
  29. package/dist/mcp/http-utils.d.ts.map +1 -0
  30. package/dist/mcp/http-utils.js +23 -0
  31. package/dist/mcp/http-utils.js.map +1 -0
  32. package/dist/mcp/index.d.ts +90 -0
  33. package/dist/mcp/index.d.ts.map +1 -0
  34. package/dist/mcp/index.js +602 -0
  35. package/dist/mcp/index.js.map +1 -0
  36. package/dist/mcp/journal-search.d.ts +31 -0
  37. package/dist/mcp/journal-search.d.ts.map +1 -0
  38. package/dist/mcp/journal-search.js +90 -0
  39. package/dist/mcp/journal-search.js.map +1 -0
  40. package/dist/mcp/tool-auth.d.ts +14 -0
  41. package/dist/mcp/tool-auth.d.ts.map +1 -0
  42. package/dist/mcp/tool-auth.js +25 -0
  43. package/dist/mcp/tool-auth.js.map +1 -0
  44. package/dist/parser/frontmatter.d.ts +11 -0
  45. package/dist/parser/frontmatter.d.ts.map +1 -0
  46. package/dist/parser/frontmatter.js +28 -0
  47. package/dist/parser/frontmatter.js.map +1 -0
  48. package/dist/parser/index.d.ts +53 -0
  49. package/dist/parser/index.d.ts.map +1 -0
  50. package/dist/parser/index.js +178 -0
  51. package/dist/parser/index.js.map +1 -0
  52. package/dist/types.d.ts +197 -0
  53. package/dist/types.d.ts.map +1 -0
  54. package/dist/types.js +38 -0
  55. package/dist/types.js.map +1 -0
  56. package/dist/version.d.ts +8 -0
  57. package/dist/version.d.ts.map +1 -0
  58. package/dist/version.js +21 -0
  59. package/dist/version.js.map +1 -0
  60. package/logo.svg +13 -0
  61. 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"}