@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,90 @@
1
+ /**
2
+ * Journal search helpers for MCP-compatible knowledge tools.
3
+ */
4
+ /**
5
+ * I search parsed journal entries with a simple scoring model that favors exact
6
+ * text hits, mood tags, and newer entries.
7
+ */
8
+ export function searchJournalEntries(entries, query, limit = 5) {
9
+ const normalized = query.trim().toLowerCase();
10
+ if (!normalized) {
11
+ return [];
12
+ }
13
+ return entries
14
+ .map((entry) => ({ entry, score: scoreEntry(entry, normalized) }))
15
+ .filter((candidate) => candidate.score > 0)
16
+ .sort((left, right) => {
17
+ if (right.score !== left.score) {
18
+ return right.score - left.score;
19
+ }
20
+ return right.entry.timestamp.getTime() - left.entry.timestamp.getTime();
21
+ })
22
+ .slice(0, limit)
23
+ .map(({ entry }) => ({
24
+ id: entry.id,
25
+ text: createSnippet(entry.content, normalized),
26
+ title: buildEntryTitle(entry),
27
+ url: getJournalEntryUrl(entry.id),
28
+ }));
29
+ }
30
+ /**
31
+ * I fetch a single entry in the shape expected by ChatGPT-compatible `fetch`.
32
+ */
33
+ export function fetchJournalEntry(entries, id) {
34
+ const entry = entries.find((candidate) => candidate.id === id);
35
+ if (!entry) {
36
+ return null;
37
+ }
38
+ return {
39
+ id: entry.id,
40
+ metadata: {
41
+ energyLevel: entry.energyLevel ?? null,
42
+ moodTags: entry.moodTags,
43
+ timestamp: entry.timestamp.toISOString(),
44
+ },
45
+ text: entry.content,
46
+ title: buildEntryTitle(entry),
47
+ url: getJournalEntryUrl(entry.id),
48
+ };
49
+ }
50
+ /**
51
+ * I keep the journal URL stable for citations inside MCP clients.
52
+ */
53
+ export function getJournalEntryUrl(id) {
54
+ return `harmon-flow://entry/${id}`;
55
+ }
56
+ function scoreEntry(entry, query) {
57
+ let score = 0;
58
+ const content = entry.content.toLowerCase();
59
+ if (content.includes(query)) {
60
+ score += 4;
61
+ }
62
+ for (const mood of entry.moodTags) {
63
+ if (mood.toLowerCase().includes(query)) {
64
+ score += 3;
65
+ }
66
+ }
67
+ if (entry.energyLevel?.toLowerCase() === query) {
68
+ score += 2;
69
+ }
70
+ if (entry.filename.toLowerCase().includes(query)) {
71
+ score += 1;
72
+ }
73
+ return score;
74
+ }
75
+ function createSnippet(content, query) {
76
+ const normalized = content.toLowerCase();
77
+ const matchIndex = normalized.indexOf(query);
78
+ if (matchIndex === -1) {
79
+ return content.slice(0, 240);
80
+ }
81
+ const start = Math.max(matchIndex - 80, 0);
82
+ const end = Math.min(matchIndex + query.length + 120, content.length);
83
+ const snippet = content.slice(start, end).trim();
84
+ return `${start > 0 ? '...' : ''}${snippet}${end < content.length ? '...' : ''}`;
85
+ }
86
+ function buildEntryTitle(entry) {
87
+ const mood = entry.moodTags.length > 0 ? ` ${entry.moodTags.join(', ')}` : '';
88
+ return `${entry.timestamp.toISOString()}${mood}`.trim();
89
+ }
90
+ //# sourceMappingURL=journal-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-search.js","sourceRoot":"","sources":["../../src/mcp/journal-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Tool-level auth helpers for the remote MCP app server.
3
+ */
4
+ import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
5
+ import type { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';
6
+ /**
7
+ * I enforce tool scopes only when the MCP server is running in authenticated mode.
8
+ */
9
+ export declare function assertToolScopes(authInfo: AuthInfo | undefined, requiredScopes: string[], authEnabled: boolean): void;
10
+ /**
11
+ * I help the app server keep write-tool auth checks readable.
12
+ */
13
+ export declare function assertToolScopesFromExtra(extra: RequestHandlerExtra<any, any>, requiredScopes: string[], authEnabled: boolean): void;
14
+ //# sourceMappingURL=tool-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-auth.d.ts","sourceRoot":"","sources":["../../src/mcp/tool-auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACxF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gDAAgD,CAAC;AAE/E;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,cAAc,EAAE,MAAM,EAAE,EACxB,WAAW,EAAE,OAAO,GACnB,IAAI,CAaN;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,EACpC,cAAc,EAAE,MAAM,EAAE,EACxB,WAAW,EAAE,OAAO,GACnB,IAAI,CAEN"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Tool-level auth helpers for the remote MCP app server.
3
+ */
4
+ /**
5
+ * I enforce tool scopes only when the MCP server is running in authenticated mode.
6
+ */
7
+ export function assertToolScopes(authInfo, requiredScopes, authEnabled) {
8
+ if (!authEnabled || requiredScopes.length === 0) {
9
+ return;
10
+ }
11
+ if (!authInfo) {
12
+ throw new Error('Authentication is required for this tool.');
13
+ }
14
+ const missingScopes = requiredScopes.filter((scope) => !authInfo.scopes.includes(scope));
15
+ if (missingScopes.length > 0) {
16
+ throw new Error(`Token is missing required scopes: ${missingScopes.join(', ')}`);
17
+ }
18
+ }
19
+ /**
20
+ * I help the app server keep write-tool auth checks readable.
21
+ */
22
+ export function assertToolScopesFromExtra(extra, requiredScopes, authEnabled) {
23
+ assertToolScopes(extra.authInfo, requiredScopes, authEnabled);
24
+ }
25
+ //# sourceMappingURL=tool-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-auth.js","sourceRoot":"","sources":["../../src/mcp/tool-auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAA8B,EAC9B,cAAwB,EACxB,WAAoB;IAEpB,IAAI,CAAC,WAAW,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACzF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,qCAAqC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,KAAoC,EACpC,cAAwB,EACxB,WAAoB;IAEpB,gBAAgB,CAAC,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * I normalize markdown frontmatter defaults first and then let Zod enforce the
3
+ * declared contract so invalid journal metadata fails loudly.
4
+ */
5
+ import { type JournalEntryFrontmatter } from '../types.js';
6
+ /**
7
+ * I apply defaults only to missing values and preserve caller-supplied data so
8
+ * schema validation can reject invalid frontmatter instead of silently casting it.
9
+ */
10
+ export declare function parseJournalEntryFrontmatter(data: Record<string, unknown>): JournalEntryFrontmatter;
11
+ //# sourceMappingURL=frontmatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/parser/frontmatter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,uBAAuB,CAWzB"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * I normalize markdown frontmatter defaults first and then let Zod enforce the
3
+ * declared contract so invalid journal metadata fails loudly.
4
+ */
5
+ import { JournalEntryFrontmatterSchema, } from '../types.js';
6
+ /**
7
+ * I apply defaults only to missing values and preserve caller-supplied data so
8
+ * schema validation can reject invalid frontmatter instead of silently casting it.
9
+ */
10
+ export function parseJournalEntryFrontmatter(data) {
11
+ return JournalEntryFrontmatterSchema.parse({
12
+ ts: normalizeTimestamp(data.ts),
13
+ source: data.source ?? 'cli',
14
+ device: data.device ?? 'linux',
15
+ sessionId: data.sessionId,
16
+ policy: data.policy,
17
+ moodTags: data.moodTags ?? [],
18
+ energyLevel: data.energyLevel,
19
+ context: data.context,
20
+ });
21
+ }
22
+ function normalizeTimestamp(value) {
23
+ if (value instanceof Date) {
24
+ return value.toISOString();
25
+ }
26
+ return typeof value === 'undefined' ? new Date().toISOString() : value;
27
+ }
28
+ //# sourceMappingURL=frontmatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/parser/frontmatter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,6BAA6B,GAE9B,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAC1C,IAA6B;IAE7B,OAAO,6BAA6B,CAAC,KAAK,CAAC;QACzC,EAAE,EAAE,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK;QAC5B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,OAAO;QAC9B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;QAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,OAAO,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAE,KAAgB,CAAC;AACrF,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Markdown Parser - Parse harmon-flow journal entries
3
+ */
4
+ import type { JournalEntry } from '../types.js';
5
+ export interface FlowDirectoryConfig {
6
+ path: string;
7
+ recursive?: boolean;
8
+ }
9
+ export declare class MarkdownParser {
10
+ private flowDir;
11
+ constructor(config: FlowDirectoryConfig);
12
+ /**
13
+ * Parse a single markdown file into a JournalEntry
14
+ */
15
+ parseFile(filename: string): JournalEntry | null;
16
+ /**
17
+ * Parse frontmatter with defaults
18
+ */
19
+ private parseFrontmatter;
20
+ /**
21
+ * Scan directory for all markdown entries
22
+ */
23
+ scanDirectory(): JournalEntry[];
24
+ /**
25
+ * Scan files recursively
26
+ */
27
+ private scanFiles;
28
+ /**
29
+ * Extract mood tags from content (looking for **Mood:** or similar patterns)
30
+ */
31
+ private extractMoodTags;
32
+ /**
33
+ * Extract energy level from content
34
+ */
35
+ private extractEnergyLevel;
36
+ /**
37
+ * Extract ID from filename (format: YYYY-MM-DDTHH-MM-SS-uuid.md)
38
+ */
39
+ private extractIdFromFilename;
40
+ /**
41
+ * Write a new journal entry
42
+ */
43
+ writeEntry(entry: Omit<JournalEntry, 'id' | 'filename'>): string;
44
+ /**
45
+ * Get flow directory path
46
+ */
47
+ getFlowDir(): string;
48
+ }
49
+ /**
50
+ * Create a parser for the default .harmonic-flow directory
51
+ */
52
+ export declare function createFlowParser(flowDir?: string): MarkdownParser;
53
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,aAAa,CAAC;AAKzE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,mBAAmB;IAIvC;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAqChD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;OAEG;IACH,aAAa,IAAI,YAAY,EAAE;IAqB/B;;OAEG;IACH,OAAO,CAAC,SAAS;IAsBjB;;OAEG;IACH,OAAO,CAAC,eAAe;IAmBvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAK7B;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,UAAU,CAAC,GAAG,MAAM;IA6BhE;;OAEG;IACH,UAAU,IAAI,MAAM;CAGrB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,cAAc,CAIjE"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Markdown Parser - Parse harmon-flow journal entries
3
+ */
4
+ import fs from 'node:fs';
5
+ import path from 'node:path';
6
+ import matter from 'gray-matter';
7
+ import { v4 as uuidv4 } from 'uuid';
8
+ import { parseJournalEntryFrontmatter } from './frontmatter.js';
9
+ const DEFAULT_FLOW_DIR = '.harmonic-flow';
10
+ export class MarkdownParser {
11
+ flowDir;
12
+ constructor(config) {
13
+ this.flowDir = path.resolve(config.path);
14
+ }
15
+ /**
16
+ * Parse a single markdown file into a JournalEntry
17
+ */
18
+ parseFile(filename) {
19
+ const filepath = path.join(this.flowDir, filename);
20
+ if (!fs.existsSync(filepath)) {
21
+ return null;
22
+ }
23
+ const content = fs.readFileSync(filepath, 'utf-8');
24
+ const parsed = matter(content);
25
+ let frontmatter;
26
+ try {
27
+ frontmatter = this.parseFrontmatter(parsed.data);
28
+ }
29
+ catch (error) {
30
+ const message = error instanceof Error ? error.message : 'Unknown frontmatter error';
31
+ throw new Error(`Invalid journal frontmatter in ${filename}: ${message}`);
32
+ }
33
+ // Extract mood tags and energy from content if not in frontmatter
34
+ const contentMoodTags = this.extractMoodTags(parsed.content);
35
+ const contentEnergy = this.extractEnergyLevel(parsed.content);
36
+ return {
37
+ id: this.extractIdFromFilename(filename) || uuidv4(),
38
+ filename,
39
+ timestamp: new Date(frontmatter.ts),
40
+ source: frontmatter.source,
41
+ device: frontmatter.device,
42
+ sessionId: frontmatter.sessionId,
43
+ policy: frontmatter.policy,
44
+ moodTags: frontmatter.moodTags || contentMoodTags,
45
+ energyLevel: frontmatter.energyLevel || contentEnergy,
46
+ context: frontmatter.context,
47
+ content: parsed.content,
48
+ };
49
+ }
50
+ /**
51
+ * Parse frontmatter with defaults
52
+ */
53
+ parseFrontmatter(data) {
54
+ return parseJournalEntryFrontmatter(data);
55
+ }
56
+ /**
57
+ * Scan directory for all markdown entries
58
+ */
59
+ scanDirectory() {
60
+ if (!fs.existsSync(this.flowDir)) {
61
+ return [];
62
+ }
63
+ const entries = [];
64
+ const files = this.scanFiles(this.flowDir);
65
+ for (const file of files) {
66
+ const entry = this.parseFile(path.relative(this.flowDir, file));
67
+ if (entry) {
68
+ entries.push(entry);
69
+ }
70
+ }
71
+ // Sort by timestamp
72
+ entries.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
73
+ return entries;
74
+ }
75
+ /**
76
+ * Scan files recursively
77
+ */
78
+ scanFiles(dir) {
79
+ const files = [];
80
+ const traverse = (currentDir) => {
81
+ const entries = fs.readdirSync(currentDir);
82
+ for (const entry of entries) {
83
+ const fullPath = path.join(currentDir, entry);
84
+ const stat = fs.statSync(fullPath);
85
+ if (stat.isDirectory()) {
86
+ traverse(fullPath);
87
+ }
88
+ else if (entry.endsWith('.md')) {
89
+ files.push(fullPath);
90
+ }
91
+ }
92
+ };
93
+ traverse(dir);
94
+ return files;
95
+ }
96
+ /**
97
+ * Extract mood tags from content (looking for **Mood:** or similar patterns)
98
+ */
99
+ extractMoodTags(content) {
100
+ const moodPatterns = [
101
+ /\*\*Mood:\*\*\s*([^\n]+)/gi,
102
+ /mood[:\s]+([^\n]+)/gi,
103
+ ];
104
+ const moods = [];
105
+ for (const pattern of moodPatterns) {
106
+ let match;
107
+ while ((match = pattern.exec(content)) !== null) {
108
+ const moodList = match[1].split(/[,\s]+/).map((m) => m.trim().toLowerCase());
109
+ moods.push(...moodList.filter((m) => m.length > 0));
110
+ }
111
+ }
112
+ return [...new Set(moods)];
113
+ }
114
+ /**
115
+ * Extract energy level from content
116
+ */
117
+ extractEnergyLevel(content) {
118
+ const energyLower = content.toLowerCase();
119
+ if (energyLower.includes('low energy') || energyLower.includes('tired') || energyLower.includes('drained')) {
120
+ return 'low';
121
+ }
122
+ if (energyLower.includes('high energy') || energyLower.includes('energetic') || energyLower.includes('excited')) {
123
+ return 'high';
124
+ }
125
+ if (energyLower.includes('medium') || energyLower.includes('moderate') || energyLower.includes('balanced')) {
126
+ return 'medium';
127
+ }
128
+ return undefined;
129
+ }
130
+ /**
131
+ * Extract ID from filename (format: YYYY-MM-DDTHH-MM-SS-uuid.md)
132
+ */
133
+ extractIdFromFilename(filename) {
134
+ const match = filename.match(/^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}-[0-9]{2}-[0-9]{2}-(.+)\.md$/);
135
+ return match ? match[1] : null;
136
+ }
137
+ /**
138
+ * Write a new journal entry
139
+ */
140
+ writeEntry(entry) {
141
+ const id = uuidv4();
142
+ const timestamp = entry.timestamp.toISOString().replace(/[:.]/g, '-').slice(0, 19);
143
+ const filename = `${timestamp}-${id}.md`;
144
+ const frontmatter = {
145
+ ts: entry.timestamp.toISOString(),
146
+ source: entry.source,
147
+ device: entry.device,
148
+ sessionId: entry.sessionId,
149
+ policy: entry.policy,
150
+ moodTags: entry.moodTags,
151
+ energyLevel: entry.energyLevel,
152
+ context: entry.context,
153
+ };
154
+ const fileContent = matter.stringify(entry.content, frontmatter);
155
+ const filepath = path.join(this.flowDir, filename);
156
+ // Ensure directory exists
157
+ if (!fs.existsSync(this.flowDir)) {
158
+ fs.mkdirSync(this.flowDir, { recursive: true });
159
+ }
160
+ fs.writeFileSync(filepath, fileContent);
161
+ return filename;
162
+ }
163
+ /**
164
+ * Get flow directory path
165
+ */
166
+ getFlowDir() {
167
+ return this.flowDir;
168
+ }
169
+ }
170
+ /**
171
+ * Create a parser for the default .harmonic-flow directory
172
+ */
173
+ export function createFlowParser(flowDir) {
174
+ return new MarkdownParser({
175
+ path: flowDir || DEFAULT_FLOW_DIR,
176
+ });
177
+ }
178
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Harmon Flow Types - Journal entries, patterns, and graph structures
3
+ */
4
+ import { z } from 'zod';
5
+ export declare const MoodTagSchema: z.ZodEnum<{
6
+ calm: "calm";
7
+ energetic: "energetic";
8
+ focused: "focused";
9
+ relaxed: "relaxed";
10
+ stressed: "stressed";
11
+ tired: "tired";
12
+ happy: "happy";
13
+ sad: "sad";
14
+ creative: "creative";
15
+ productive: "productive";
16
+ anxious: "anxious";
17
+ peaceful: "peaceful";
18
+ excited: "excited";
19
+ melancholic: "melancholic";
20
+ neutral: "neutral";
21
+ }>;
22
+ export type MoodTag = z.infer<typeof MoodTagSchema>;
23
+ export declare const EnergyLevelSchema: z.ZodEnum<{
24
+ low: "low";
25
+ medium: "medium";
26
+ high: "high";
27
+ }>;
28
+ export type EnergyLevel = z.infer<typeof EnergyLevelSchema>;
29
+ export declare const EntrySourceSchema: z.ZodEnum<{
30
+ cli: "cli";
31
+ menubar: "menubar";
32
+ voice: "voice";
33
+ mcp: "mcp";
34
+ }>;
35
+ export type EntrySource = z.infer<typeof EntrySourceSchema>;
36
+ export declare const SessionContextSchema: z.ZodObject<{
37
+ timeOfDay: z.ZodOptional<z.ZodEnum<{
38
+ morning: "morning";
39
+ afternoon: "afternoon";
40
+ evening: "evening";
41
+ night: "night";
42
+ }>>;
43
+ dayOfWeek: z.ZodOptional<z.ZodNumber>;
44
+ weather: z.ZodOptional<z.ZodString>;
45
+ activity: z.ZodOptional<z.ZodString>;
46
+ }, z.core.$strip>;
47
+ export type SessionContext = z.infer<typeof SessionContextSchema>;
48
+ export declare const JournalEntryFrontmatterSchema: z.ZodObject<{
49
+ ts: z.ZodString;
50
+ source: z.ZodEnum<{
51
+ cli: "cli";
52
+ menubar: "menubar";
53
+ voice: "voice";
54
+ mcp: "mcp";
55
+ }>;
56
+ device: z.ZodEnum<{
57
+ macos: "macos";
58
+ windows: "windows";
59
+ wsl: "wsl";
60
+ linux: "linux";
61
+ }>;
62
+ sessionId: z.ZodOptional<z.ZodString>;
63
+ policy: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
64
+ moodTags: z.ZodOptional<z.ZodArray<z.ZodEnum<{
65
+ calm: "calm";
66
+ energetic: "energetic";
67
+ focused: "focused";
68
+ relaxed: "relaxed";
69
+ stressed: "stressed";
70
+ tired: "tired";
71
+ happy: "happy";
72
+ sad: "sad";
73
+ creative: "creative";
74
+ productive: "productive";
75
+ anxious: "anxious";
76
+ peaceful: "peaceful";
77
+ excited: "excited";
78
+ melancholic: "melancholic";
79
+ neutral: "neutral";
80
+ }>>>;
81
+ energyLevel: z.ZodOptional<z.ZodEnum<{
82
+ low: "low";
83
+ medium: "medium";
84
+ high: "high";
85
+ }>>;
86
+ context: z.ZodOptional<z.ZodObject<{
87
+ timeOfDay: z.ZodOptional<z.ZodEnum<{
88
+ morning: "morning";
89
+ afternoon: "afternoon";
90
+ evening: "evening";
91
+ night: "night";
92
+ }>>;
93
+ dayOfWeek: z.ZodOptional<z.ZodNumber>;
94
+ weather: z.ZodOptional<z.ZodString>;
95
+ activity: z.ZodOptional<z.ZodString>;
96
+ }, z.core.$strip>>;
97
+ }, z.core.$strip>;
98
+ export type JournalEntryFrontmatter = z.infer<typeof JournalEntryFrontmatterSchema>;
99
+ export interface JournalEntry {
100
+ id: string;
101
+ filename: string;
102
+ timestamp: Date;
103
+ source: EntrySource;
104
+ device: 'macos' | 'windows' | 'wsl' | 'linux';
105
+ sessionId?: string;
106
+ policy?: Record<string, unknown>;
107
+ moodTags: string[];
108
+ energyLevel?: 'low' | 'medium' | 'high';
109
+ context?: SessionContext;
110
+ content: string;
111
+ embedding?: number[];
112
+ }
113
+ export declare const NodeTypeSchema: z.ZodEnum<{
114
+ activity: "activity";
115
+ source: "source";
116
+ device: "device";
117
+ mood: "mood";
118
+ energy: "energy";
119
+ time: "time";
120
+ session_type: "session_type";
121
+ policy_pattern: "policy_pattern";
122
+ track: "track";
123
+ artist: "artist";
124
+ }>;
125
+ export type NodeType = z.infer<typeof NodeTypeSchema>;
126
+ export interface GraphNode {
127
+ id: string;
128
+ type: NodeType;
129
+ label: string;
130
+ properties: Record<string, unknown>;
131
+ weight: number;
132
+ embedding?: number[];
133
+ }
134
+ export interface GraphEdge {
135
+ source: string;
136
+ target: string;
137
+ relationship: string;
138
+ weight: number;
139
+ count: number;
140
+ }
141
+ export interface PatternGraph {
142
+ nodes: Map<string, GraphNode>;
143
+ edges: Map<string, GraphEdge>;
144
+ embeddings: Map<string, number[]>;
145
+ }
146
+ export interface TimePattern {
147
+ timeOfDay: string;
148
+ commonMoods: string[];
149
+ commonEnergy: 'low' | 'medium' | 'high';
150
+ avgSessionDuration: number;
151
+ frequency: number;
152
+ }
153
+ export interface MoodEnergyPattern {
154
+ mood: string;
155
+ energy: 'low' | 'medium' | 'high';
156
+ nextMood?: string;
157
+ transitionProbability: number;
158
+ commonActivities: string[];
159
+ }
160
+ export interface PolicyPattern {
161
+ patternId: string;
162
+ moodTags: string[];
163
+ energyLevel?: 'low' | 'medium' | 'high';
164
+ typicalDuration: number;
165
+ hardConstraints: Record<string, unknown>;
166
+ softWeights: Record<string, number>;
167
+ usageCount: number;
168
+ avgSatisfaction?: number;
169
+ }
170
+ export interface Suggestion {
171
+ id: string;
172
+ type: 'session' | 'policy' | 'mood_shift';
173
+ confidence: number;
174
+ reasoning: string;
175
+ suggestedPolicy?: Record<string, unknown>;
176
+ moodTags?: string[];
177
+ energyLevel?: 'low' | 'medium' | 'high';
178
+ basedOnEntries: string[];
179
+ }
180
+ export interface ToolDefinition {
181
+ name: string;
182
+ description: string;
183
+ inputSchema: {
184
+ type: 'object';
185
+ properties: Record<string, unknown>;
186
+ required?: string[];
187
+ };
188
+ }
189
+ export interface ToolHandler {
190
+ (args: Record<string, unknown>): Promise<{
191
+ content: Array<{
192
+ type: string;
193
+ text: string;
194
+ }>;
195
+ }>;
196
+ }
197
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}