jfl 0.1.0 → 0.2.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 (262) hide show
  1. package/README.md +443 -145
  2. package/clawdbot-plugin/clawdbot.plugin.json +20 -0
  3. package/clawdbot-plugin/index.js +555 -0
  4. package/clawdbot-plugin/index.ts +582 -0
  5. package/clawdbot-skill/SKILL.md +33 -336
  6. package/clawdbot-skill/index.ts +491 -321
  7. package/clawdbot-skill/skill.json +4 -13
  8. package/dist/commands/clawdbot.d.ts +11 -0
  9. package/dist/commands/clawdbot.d.ts.map +1 -0
  10. package/dist/commands/clawdbot.js +215 -0
  11. package/dist/commands/clawdbot.js.map +1 -0
  12. package/dist/commands/context-hub.d.ts +5 -0
  13. package/dist/commands/context-hub.d.ts.map +1 -1
  14. package/dist/commands/context-hub.js +394 -28
  15. package/dist/commands/context-hub.js.map +1 -1
  16. package/dist/commands/gtm-process-update.d.ts +10 -0
  17. package/dist/commands/gtm-process-update.d.ts.map +1 -0
  18. package/dist/commands/gtm-process-update.js +101 -0
  19. package/dist/commands/gtm-process-update.js.map +1 -0
  20. package/dist/commands/init.d.ts.map +1 -1
  21. package/dist/commands/init.js +278 -4
  22. package/dist/commands/init.js.map +1 -1
  23. package/dist/commands/login.d.ts.map +1 -1
  24. package/dist/commands/login.js +32 -33
  25. package/dist/commands/login.js.map +1 -1
  26. package/dist/commands/memory.d.ts +38 -0
  27. package/dist/commands/memory.d.ts.map +1 -0
  28. package/dist/commands/memory.js +229 -0
  29. package/dist/commands/memory.js.map +1 -0
  30. package/dist/commands/migrate-services.d.ts +8 -0
  31. package/dist/commands/migrate-services.d.ts.map +1 -0
  32. package/dist/commands/migrate-services.js +182 -0
  33. package/dist/commands/migrate-services.js.map +1 -0
  34. package/dist/commands/onboard.d.ts +24 -0
  35. package/dist/commands/onboard.d.ts.map +1 -0
  36. package/dist/commands/onboard.js +663 -0
  37. package/dist/commands/onboard.js.map +1 -0
  38. package/dist/commands/openclaw.d.ts +56 -0
  39. package/dist/commands/openclaw.d.ts.map +1 -0
  40. package/dist/commands/openclaw.js +700 -0
  41. package/dist/commands/openclaw.js.map +1 -0
  42. package/dist/commands/orchestrate.d.ts +14 -0
  43. package/dist/commands/orchestrate.d.ts.map +1 -0
  44. package/dist/commands/orchestrate.js +270 -0
  45. package/dist/commands/orchestrate.js.map +1 -0
  46. package/dist/commands/profile.d.ts +46 -0
  47. package/dist/commands/profile.d.ts.map +1 -0
  48. package/dist/commands/profile.js +498 -0
  49. package/dist/commands/profile.js.map +1 -0
  50. package/dist/commands/repair.d.ts.map +1 -1
  51. package/dist/commands/repair.js +37 -0
  52. package/dist/commands/repair.js.map +1 -1
  53. package/dist/commands/service-agent.d.ts +16 -0
  54. package/dist/commands/service-agent.d.ts.map +1 -0
  55. package/dist/commands/service-agent.js +375 -0
  56. package/dist/commands/service-agent.js.map +1 -0
  57. package/dist/commands/service-manager.d.ts +12 -0
  58. package/dist/commands/service-manager.d.ts.map +1 -0
  59. package/dist/commands/service-manager.js +967 -0
  60. package/dist/commands/service-manager.js.map +1 -0
  61. package/dist/commands/service-validate.d.ts +12 -0
  62. package/dist/commands/service-validate.d.ts.map +1 -0
  63. package/dist/commands/service-validate.js +611 -0
  64. package/dist/commands/service-validate.js.map +1 -0
  65. package/dist/commands/services-create.d.ts +15 -0
  66. package/dist/commands/services-create.d.ts.map +1 -0
  67. package/dist/commands/services-create.js +1452 -0
  68. package/dist/commands/services-create.js.map +1 -0
  69. package/dist/commands/services-scan.d.ts +13 -0
  70. package/dist/commands/services-scan.d.ts.map +1 -0
  71. package/dist/commands/services-scan.js +251 -0
  72. package/dist/commands/services-scan.js.map +1 -0
  73. package/dist/commands/services-sync-agents.d.ts +23 -0
  74. package/dist/commands/services-sync-agents.d.ts.map +1 -0
  75. package/dist/commands/services-sync-agents.js +207 -0
  76. package/dist/commands/services-sync-agents.js.map +1 -0
  77. package/dist/commands/services.d.ts +19 -0
  78. package/dist/commands/services.d.ts.map +1 -0
  79. package/dist/commands/services.js +742 -0
  80. package/dist/commands/services.js.map +1 -0
  81. package/dist/commands/session.d.ts +5 -1
  82. package/dist/commands/session.d.ts.map +1 -1
  83. package/dist/commands/session.js +68 -586
  84. package/dist/commands/session.js.map +1 -1
  85. package/dist/commands/status.d.ts.map +1 -1
  86. package/dist/commands/status.js +17 -0
  87. package/dist/commands/status.js.map +1 -1
  88. package/dist/commands/update.d.ts.map +1 -1
  89. package/dist/commands/update.js +75 -21
  90. package/dist/commands/update.js.map +1 -1
  91. package/dist/commands/validate-settings.d.ts +37 -0
  92. package/dist/commands/validate-settings.d.ts.map +1 -0
  93. package/dist/commands/validate-settings.js +197 -0
  94. package/dist/commands/validate-settings.js.map +1 -0
  95. package/dist/commands/voice.d.ts +0 -1
  96. package/dist/commands/voice.d.ts.map +1 -1
  97. package/dist/commands/voice.js +16 -15
  98. package/dist/commands/voice.js.map +1 -1
  99. package/dist/index.js +395 -141
  100. package/dist/index.js.map +1 -1
  101. package/dist/lib/agent-generator.d.ts +26 -0
  102. package/dist/lib/agent-generator.d.ts.map +1 -0
  103. package/dist/lib/agent-generator.js +331 -0
  104. package/dist/lib/agent-generator.js.map +1 -0
  105. package/dist/lib/memory-db.d.ts +102 -0
  106. package/dist/lib/memory-db.d.ts.map +1 -0
  107. package/dist/lib/memory-db.js +313 -0
  108. package/dist/lib/memory-db.js.map +1 -0
  109. package/dist/lib/memory-indexer.d.ts +47 -0
  110. package/dist/lib/memory-indexer.d.ts.map +1 -0
  111. package/dist/lib/memory-indexer.js +215 -0
  112. package/dist/lib/memory-indexer.js.map +1 -0
  113. package/dist/lib/memory-search.d.ts +41 -0
  114. package/dist/lib/memory-search.d.ts.map +1 -0
  115. package/dist/lib/memory-search.js +246 -0
  116. package/dist/lib/memory-search.js.map +1 -0
  117. package/dist/lib/openclaw-registry.d.ts +48 -0
  118. package/dist/lib/openclaw-registry.d.ts.map +1 -0
  119. package/dist/lib/openclaw-registry.js +181 -0
  120. package/dist/lib/openclaw-registry.js.map +1 -0
  121. package/dist/lib/openclaw-sdk.d.ts +107 -0
  122. package/dist/lib/openclaw-sdk.d.ts.map +1 -0
  123. package/dist/lib/openclaw-sdk.js +208 -0
  124. package/dist/lib/openclaw-sdk.js.map +1 -0
  125. package/dist/lib/peer-agent-generator.d.ts +44 -0
  126. package/dist/lib/peer-agent-generator.d.ts.map +1 -0
  127. package/dist/lib/peer-agent-generator.js +286 -0
  128. package/dist/lib/peer-agent-generator.js.map +1 -0
  129. package/dist/lib/service-dependencies.d.ts +44 -0
  130. package/dist/lib/service-dependencies.d.ts.map +1 -0
  131. package/dist/lib/service-dependencies.js +314 -0
  132. package/dist/lib/service-dependencies.js.map +1 -0
  133. package/dist/lib/service-detector.d.ts +61 -0
  134. package/dist/lib/service-detector.d.ts.map +1 -0
  135. package/dist/lib/service-detector.js +521 -0
  136. package/dist/lib/service-detector.js.map +1 -0
  137. package/dist/lib/service-gtm.d.ts +157 -0
  138. package/dist/lib/service-gtm.d.ts.map +1 -0
  139. package/dist/lib/service-gtm.js +786 -0
  140. package/dist/lib/service-gtm.js.map +1 -0
  141. package/dist/lib/service-mcp-base.d.ts +103 -0
  142. package/dist/lib/service-mcp-base.d.ts.map +1 -0
  143. package/dist/lib/service-mcp-base.js +263 -0
  144. package/dist/lib/service-mcp-base.js.map +1 -0
  145. package/dist/lib/service-utils.d.ts +103 -0
  146. package/dist/lib/service-utils.d.ts.map +1 -0
  147. package/dist/lib/service-utils.js +368 -0
  148. package/dist/lib/service-utils.js.map +1 -0
  149. package/dist/lib/skill-generator.d.ts +21 -0
  150. package/dist/lib/skill-generator.d.ts.map +1 -0
  151. package/dist/lib/skill-generator.js +253 -0
  152. package/dist/lib/skill-generator.js.map +1 -0
  153. package/dist/lib/stratus-client.d.ts +100 -0
  154. package/dist/lib/stratus-client.d.ts.map +1 -0
  155. package/dist/lib/stratus-client.js +255 -0
  156. package/dist/lib/stratus-client.js.map +1 -0
  157. package/dist/mcp/context-hub-mcp.js +135 -53
  158. package/dist/mcp/context-hub-mcp.js.map +1 -1
  159. package/dist/mcp/service-mcp-server.d.ts +12 -0
  160. package/dist/mcp/service-mcp-server.d.ts.map +1 -0
  161. package/dist/mcp/service-mcp-server.js +434 -0
  162. package/dist/mcp/service-mcp-server.js.map +1 -0
  163. package/dist/mcp/service-peer-mcp.d.ts +36 -0
  164. package/dist/mcp/service-peer-mcp.d.ts.map +1 -0
  165. package/dist/mcp/service-peer-mcp.js +220 -0
  166. package/dist/mcp/service-peer-mcp.js.map +1 -0
  167. package/dist/mcp/service-registry-mcp.d.ts +13 -0
  168. package/dist/mcp/service-registry-mcp.d.ts.map +1 -0
  169. package/dist/mcp/service-registry-mcp.js +330 -0
  170. package/dist/mcp/service-registry-mcp.js.map +1 -0
  171. package/dist/ui/banner.js +1 -1
  172. package/dist/ui/banner.js.map +1 -1
  173. package/dist/ui/context-hub-logs.d.ts +10 -0
  174. package/dist/ui/context-hub-logs.d.ts.map +1 -0
  175. package/dist/ui/context-hub-logs.js +175 -0
  176. package/dist/ui/context-hub-logs.js.map +1 -0
  177. package/dist/ui/service-dashboard.d.ts +11 -0
  178. package/dist/ui/service-dashboard.d.ts.map +1 -0
  179. package/dist/ui/service-dashboard.js +357 -0
  180. package/dist/ui/service-dashboard.js.map +1 -0
  181. package/dist/ui/services-manager.d.ts +11 -0
  182. package/dist/ui/services-manager.d.ts.map +1 -0
  183. package/dist/ui/services-manager.js +507 -0
  184. package/dist/ui/services-manager.js.map +1 -0
  185. package/dist/utils/auth-guard.d.ts.map +1 -1
  186. package/dist/utils/auth-guard.js +8 -9
  187. package/dist/utils/auth-guard.js.map +1 -1
  188. package/dist/utils/claude-md-generator.d.ts +10 -0
  189. package/dist/utils/claude-md-generator.d.ts.map +1 -0
  190. package/dist/utils/claude-md-generator.js +215 -0
  191. package/dist/utils/claude-md-generator.js.map +1 -0
  192. package/dist/utils/ensure-context-hub.d.ts +20 -0
  193. package/dist/utils/ensure-context-hub.d.ts.map +1 -0
  194. package/dist/utils/ensure-context-hub.js +65 -0
  195. package/dist/utils/ensure-context-hub.js.map +1 -0
  196. package/dist/utils/ensure-project.d.ts.map +1 -1
  197. package/dist/utils/ensure-project.js +3 -4
  198. package/dist/utils/ensure-project.js.map +1 -1
  199. package/dist/utils/jfl-config.d.ts +19 -0
  200. package/dist/utils/jfl-config.d.ts.map +1 -0
  201. package/dist/utils/jfl-config.js +112 -0
  202. package/dist/utils/jfl-config.js.map +1 -0
  203. package/dist/utils/jfl-migration.d.ts +29 -0
  204. package/dist/utils/jfl-migration.d.ts.map +1 -0
  205. package/dist/utils/jfl-migration.js +142 -0
  206. package/dist/utils/jfl-migration.js.map +1 -0
  207. package/dist/utils/jfl-paths.d.ts +55 -0
  208. package/dist/utils/jfl-paths.d.ts.map +1 -0
  209. package/dist/utils/jfl-paths.js +120 -0
  210. package/dist/utils/jfl-paths.js.map +1 -0
  211. package/dist/utils/settings-validator.d.ts +73 -0
  212. package/dist/utils/settings-validator.d.ts.map +1 -0
  213. package/dist/utils/settings-validator.js +222 -0
  214. package/dist/utils/settings-validator.js.map +1 -0
  215. package/package.json +19 -3
  216. package/scripts/commit-gtm.sh +56 -0
  217. package/scripts/commit-product.sh +68 -0
  218. package/scripts/context-query.sh +45 -0
  219. package/scripts/session/auto-commit.sh +297 -0
  220. package/scripts/session/jfl-doctor.sh +707 -0
  221. package/scripts/session/session-cleanup.sh +268 -0
  222. package/scripts/session/session-end.sh +198 -0
  223. package/scripts/session/session-init.sh +350 -0
  224. package/scripts/session/session-init.sh.backup +292 -0
  225. package/scripts/session/session-sync.sh +167 -0
  226. package/scripts/session/test-context-preservation.sh +160 -0
  227. package/scripts/session/test-critical-infrastructure.sh +293 -0
  228. package/scripts/session/test-experience-level.sh +336 -0
  229. package/scripts/session/test-session-cleanup.sh +268 -0
  230. package/scripts/session/test-session-sync.sh +320 -0
  231. package/scripts/voice-start.sh +36 -8
  232. package/scripts/where-am-i.sh +78 -0
  233. package/template/.claude/service-settings.json +32 -0
  234. package/template/.claude/settings.json +14 -1
  235. package/template/.claude/skills/end/SKILL.md +1780 -0
  236. package/template/.jfl/config.json +2 -1
  237. package/template/CLAUDE.md +1039 -134
  238. package/template/CLAUDE.md.bak +1187 -0
  239. package/template/scripts/commit-gtm.sh +56 -0
  240. package/template/scripts/commit-product.sh +68 -0
  241. package/template/scripts/migrate-to-branch-sessions.sh +201 -0
  242. package/template/scripts/session/auto-commit.sh +58 -6
  243. package/template/scripts/session/jfl-doctor.sh +137 -17
  244. package/template/scripts/session/session-cleanup.sh +268 -0
  245. package/template/scripts/session/session-end.sh +4 -0
  246. package/template/scripts/session/session-init.sh +253 -66
  247. package/template/scripts/session/test-critical-infrastructure.sh +293 -0
  248. package/template/scripts/session/test-experience-level.sh +336 -0
  249. package/template/scripts/session/test-session-cleanup.sh +268 -0
  250. package/template/scripts/session/test-session-sync.sh +320 -0
  251. package/template/scripts/where-am-i.sh +78 -0
  252. package/template/templates/service-agent/.claude/settings.json +32 -0
  253. package/template/templates/service-agent/CLAUDE.md +334 -0
  254. package/template/templates/service-agent/knowledge/ARCHITECTURE.md +115 -0
  255. package/template/templates/service-agent/knowledge/DEPLOYMENT.md +199 -0
  256. package/template/templates/service-agent/knowledge/RUNBOOK.md +412 -0
  257. package/template/templates/service-agent/knowledge/SERVICE_SPEC.md +77 -0
  258. package/dist/commands/session-mgmt.d.ts +0 -33
  259. package/dist/commands/session-mgmt.d.ts.map +0 -1
  260. package/dist/commands/session-mgmt.js +0 -404
  261. package/dist/commands/session-mgmt.js.map +0 -1
  262. package/template/scripts/session/auto-merge.sh +0 -325
@@ -0,0 +1,175 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Context Hub Logs TUI
4
+ *
5
+ * Real-time log viewer with syntax highlighting
6
+ *
7
+ * @purpose TUI for streaming context-hub logs with @ tag highlighting
8
+ */
9
+ import React, { useState, useEffect } from 'react';
10
+ import { render, Box, Text } from 'ink';
11
+ import { exec } from 'child_process';
12
+ import * as fs from 'fs';
13
+ import * as path from 'path';
14
+ const ContextHubLogs = () => {
15
+ const [logs, setLogs] = useState([]);
16
+ const [status, setStatus] = useState('unknown');
17
+ const [pid, setPid] = useState(null);
18
+ const [tools, setTools] = useState([]);
19
+ // Get project root
20
+ const projectRoot = process.cwd();
21
+ const logFile = path.join(projectRoot, '.jfl/logs/context-hub.log');
22
+ useEffect(() => {
23
+ // Check status
24
+ exec('jfl context-hub status', (error, stdout) => {
25
+ if (stdout.includes('running')) {
26
+ setStatus('running');
27
+ const pidMatch = stdout.match(/PID: (\d+)/);
28
+ if (pidMatch)
29
+ setPid(parseInt(pidMatch[1], 10));
30
+ }
31
+ else {
32
+ setStatus('stopped');
33
+ }
34
+ });
35
+ // Check available CLI tools
36
+ const cliTools = [
37
+ { name: 'gh', command: 'gh --version' },
38
+ { name: 'fly', command: 'fly version' },
39
+ { name: 'vercel', command: 'vercel --version' },
40
+ { name: 'supabase', command: 'supabase --version' },
41
+ { name: 'docker', command: 'docker --version' },
42
+ { name: 'jfl', command: 'jfl --version' },
43
+ { name: 'git', command: 'git --version' },
44
+ { name: 'node', command: 'node --version' },
45
+ ];
46
+ const checkTools = async () => {
47
+ const results = [];
48
+ for (const tool of cliTools) {
49
+ exec(`which ${tool.name}`, (error, stdout) => {
50
+ const available = !error && stdout.trim().length > 0;
51
+ if (available) {
52
+ // Get version
53
+ exec(tool.command, (vErr, vOut) => {
54
+ const version = vErr ? undefined : vOut.trim().split('\n')[0];
55
+ results.push({
56
+ name: tool.name,
57
+ command: tool.command,
58
+ available: true,
59
+ version
60
+ });
61
+ if (results.length === cliTools.length) {
62
+ setTools(results.sort((a, b) => a.name.localeCompare(b.name)));
63
+ }
64
+ });
65
+ }
66
+ else {
67
+ results.push({
68
+ name: tool.name,
69
+ command: tool.command,
70
+ available: false
71
+ });
72
+ if (results.length === cliTools.length) {
73
+ setTools(results.sort((a, b) => a.name.localeCompare(b.name)));
74
+ }
75
+ }
76
+ });
77
+ }
78
+ };
79
+ checkTools();
80
+ // Watch log file
81
+ if (!fs.existsSync(logFile)) {
82
+ setLogs([{ timestamp: new Date().toISOString(), message: 'No log file yet', type: 'warn' }]);
83
+ return;
84
+ }
85
+ // Read existing logs
86
+ const content = fs.readFileSync(logFile, 'utf-8');
87
+ const lines = content.split('\n').filter(l => l.trim());
88
+ const entries = lines.slice(-50).map(line => parseLogLine(line)); // Last 50 lines
89
+ setLogs(entries);
90
+ // Watch for new lines
91
+ const watcher = fs.watch(logFile, (event) => {
92
+ if (event === 'change') {
93
+ const newContent = fs.readFileSync(logFile, 'utf-8');
94
+ const newLines = newContent.split('\n').filter(l => l.trim());
95
+ const newEntries = newLines.slice(-50).map(line => parseLogLine(line));
96
+ setLogs(newEntries);
97
+ }
98
+ });
99
+ return () => watcher.close();
100
+ }, []);
101
+ return (React.createElement(Box, { flexDirection: "column", padding: 1 },
102
+ React.createElement(Box, { borderStyle: "round", borderColor: "cyan", paddingX: 1 },
103
+ React.createElement(Text, { bold: true, color: "cyan" }, "Context Hub Logs"),
104
+ React.createElement(Text, { dimColor: true }, " | "),
105
+ React.createElement(Text, { color: status === 'running' ? 'green' : 'red' }, status === 'running' ? '🟢 Running' : '🔴 Stopped'),
106
+ pid && (React.createElement(React.Fragment, null,
107
+ React.createElement(Text, { dimColor: true }, " | PID: "),
108
+ React.createElement(Text, null, pid)))),
109
+ React.createElement(Box, { flexDirection: "row", marginTop: 1 },
110
+ React.createElement(Box, { flexDirection: "column", flexGrow: 1, marginRight: 1 }, logs.map((log, i) => (React.createElement(LogLine, { key: i, entry: log })))),
111
+ React.createElement(Box, { flexDirection: "column", width: 25, borderStyle: "single", borderColor: "gray", paddingX: 1 },
112
+ React.createElement(Text, { bold: true, dimColor: true }, "Available CLIs"),
113
+ React.createElement(Text, { dimColor: true }, "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),
114
+ tools.length === 0 ? (React.createElement(Text, { dimColor: true }, "Checking...")) : (tools.map((tool, i) => (React.createElement(Box, { key: i, marginTop: i > 0 ? 0 : 0 },
115
+ React.createElement(Text, { color: tool.available ? 'green' : 'red' }, tool.available ? '✓' : '✗'),
116
+ React.createElement(Text, { dimColor: true }, " "),
117
+ React.createElement(Text, { color: tool.available ? undefined : 'dim' }, tool.name))))))),
118
+ React.createElement(Box, { marginTop: 1, borderStyle: "single", borderColor: "gray", paddingX: 1 },
119
+ React.createElement(Text, { dimColor: true }, "Press Ctrl+C to exit | Showing last 50 lines"))));
120
+ };
121
+ const LogLine = ({ entry }) => {
122
+ const { message, type } = entry;
123
+ // Highlight @ tags
124
+ const highlightMessage = (msg) => {
125
+ const parts = [];
126
+ const regex = /@(\w+)/g;
127
+ let lastIndex = 0;
128
+ let match;
129
+ while ((match = regex.exec(msg)) !== null) {
130
+ // Text before @tag
131
+ if (match.index > lastIndex) {
132
+ parts.push(React.createElement(Text, { key: `text-${lastIndex}` }, msg.slice(lastIndex, match.index)));
133
+ }
134
+ // @tag itself
135
+ parts.push(React.createElement(Text, { key: `tag-${match.index}`, color: "magenta", bold: true }, match[0]));
136
+ lastIndex = match.index + match[0].length;
137
+ }
138
+ // Remaining text
139
+ if (lastIndex < msg.length) {
140
+ parts.push(React.createElement(Text, { key: `text-${lastIndex}` }, msg.slice(lastIndex)));
141
+ }
142
+ return parts.length > 0 ? parts : React.createElement(Text, null, msg);
143
+ };
144
+ const getColor = () => {
145
+ if (message.includes('error') || message.includes('Error'))
146
+ return 'red';
147
+ if (message.includes('warn'))
148
+ return 'yellow';
149
+ if (message.includes('✓') || message.includes('Started') || message.includes('listening'))
150
+ return 'green';
151
+ if (message.includes('Shutting down'))
152
+ return 'red';
153
+ return undefined;
154
+ };
155
+ return (React.createElement(Box, null,
156
+ React.createElement(Text, { color: getColor() }, highlightMessage(message))));
157
+ };
158
+ function parseLogLine(line) {
159
+ // Determine type based on content
160
+ let type = 'info';
161
+ if (line.includes('error') || line.includes('Error'))
162
+ type = 'error';
163
+ else if (line.includes('warn'))
164
+ type = 'warn';
165
+ else if (line.includes('✓') || line.includes('Started'))
166
+ type = 'success';
167
+ return {
168
+ timestamp: new Date().toISOString(),
169
+ message: line,
170
+ type
171
+ };
172
+ }
173
+ // Render the component
174
+ render(React.createElement(ContextHubLogs, null));
175
+ //# sourceMappingURL=context-hub-logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-hub-logs.js","sourceRoot":"","sources":["../../src/ui/context-hub-logs.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Service Health Monitoring Dashboard
4
+ *
5
+ * Real-time TUI showing all services, health status, logs, and controls.
6
+ * Interactive dashboard with keyboard navigation and live updates.
7
+ *
8
+ * @purpose Interactive service monitoring and management dashboard
9
+ */
10
+ export declare function startDashboard(): Promise<void>;
11
+ //# sourceMappingURL=service-dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-dashboard.d.ts","sourceRoot":"","sources":["../../src/ui/service-dashboard.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AA0EH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAoUpD"}
@@ -0,0 +1,357 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Service Health Monitoring Dashboard
4
+ *
5
+ * Real-time TUI showing all services, health status, logs, and controls.
6
+ * Interactive dashboard with keyboard navigation and live updates.
7
+ *
8
+ * @purpose Interactive service monitoring and management dashboard
9
+ */
10
+ import blessed from "blessed";
11
+ import contrib from "blessed-contrib";
12
+ import * as fs from "fs";
13
+ import * as path from "path";
14
+ import { JFL_PATHS } from "../utils/jfl-paths.js";
15
+ const GLOBAL_SERVICES_FILE = path.join(JFL_PATHS.data, "services.json");
16
+ const SERVICE_MANAGER_URL = "http://localhost:3402";
17
+ const REFRESH_INTERVAL = 2000; // 2 seconds
18
+ // ============================================================================
19
+ // Service Manager API
20
+ // ============================================================================
21
+ async function getAllServices() {
22
+ try {
23
+ const response = await fetch(`${SERVICE_MANAGER_URL}/registry`);
24
+ if (!response.ok) {
25
+ throw new Error(`HTTP ${response.status}`);
26
+ }
27
+ const data = await response.json();
28
+ return data.services || [];
29
+ }
30
+ catch (error) {
31
+ return [];
32
+ }
33
+ }
34
+ async function callService(serviceName, tool, args = {}) {
35
+ try {
36
+ const response = await fetch(`${SERVICE_MANAGER_URL}/registry/${serviceName}/call`, {
37
+ method: "POST",
38
+ headers: { "Content-Type": "application/json" },
39
+ body: JSON.stringify({ tool, args }),
40
+ });
41
+ if (!response.ok) {
42
+ throw new Error(`HTTP ${response.status}`);
43
+ }
44
+ const data = await response.json();
45
+ return data.result || "No output";
46
+ }
47
+ catch (error) {
48
+ return `Error: ${error}`;
49
+ }
50
+ }
51
+ // ============================================================================
52
+ // Dashboard UI
53
+ // ============================================================================
54
+ export async function startDashboard() {
55
+ // Create screen
56
+ const screen = blessed.screen({
57
+ smartCSR: true,
58
+ title: "JFL Service Dashboard",
59
+ });
60
+ // Create grid layout
61
+ const grid = new contrib.grid({ rows: 12, cols: 12, screen });
62
+ // Service list (left side)
63
+ const serviceList = grid.set(0, 0, 8, 4, contrib.table, {
64
+ label: " Services ",
65
+ tags: true,
66
+ keys: true,
67
+ vi: true,
68
+ mouse: true,
69
+ interactive: true,
70
+ columnSpacing: 2,
71
+ columnWidth: [20, 15, 8, 12],
72
+ style: {
73
+ header: {
74
+ fg: "cyan",
75
+ bold: true,
76
+ },
77
+ cell: {
78
+ selected: {
79
+ bg: "blue",
80
+ },
81
+ },
82
+ border: {
83
+ fg: "cyan",
84
+ },
85
+ },
86
+ border: {
87
+ type: "line",
88
+ },
89
+ });
90
+ // Service details (right side top)
91
+ const serviceDetails = grid.set(0, 4, 4, 8, blessed.box, {
92
+ label: " Service Details ",
93
+ tags: true,
94
+ content: "Select a service to view details",
95
+ scrollable: true,
96
+ alwaysScroll: true,
97
+ mouse: true,
98
+ keys: true,
99
+ vi: true,
100
+ scrollbar: {
101
+ ch: "█",
102
+ inverse: true,
103
+ },
104
+ style: {
105
+ border: {
106
+ fg: "cyan",
107
+ },
108
+ },
109
+ border: {
110
+ type: "line",
111
+ },
112
+ });
113
+ // Logs (right side bottom)
114
+ const logsBox = grid.set(4, 4, 4, 8, blessed.log, {
115
+ label: " Logs ",
116
+ tags: true,
117
+ mouse: true,
118
+ keys: true,
119
+ vi: true,
120
+ scrollable: true,
121
+ scrollbar: {
122
+ ch: "█",
123
+ inverse: true,
124
+ },
125
+ style: {
126
+ border: {
127
+ fg: "cyan",
128
+ },
129
+ },
130
+ border: {
131
+ type: "line",
132
+ },
133
+ });
134
+ // Dependency graph (bottom left)
135
+ const depsBox = grid.set(8, 0, 4, 4, blessed.box, {
136
+ label: " Dependencies ",
137
+ tags: true,
138
+ content: "Select a service to view dependencies",
139
+ scrollable: true,
140
+ mouse: true,
141
+ keys: true,
142
+ vi: true,
143
+ style: {
144
+ border: {
145
+ fg: "cyan",
146
+ },
147
+ },
148
+ border: {
149
+ type: "line",
150
+ },
151
+ });
152
+ // Help box (bottom right)
153
+ const helpBox = grid.set(8, 4, 4, 8, blessed.box, {
154
+ label: " Commands ",
155
+ tags: true,
156
+ content: "{cyan-fg}[↑/↓]{/} Navigate " +
157
+ "{cyan-fg}[s]{/} Start " +
158
+ "{cyan-fg}[t]{/} Stop " +
159
+ "{cyan-fg}[r]{/} Restart\n" +
160
+ "{cyan-fg}[h]{/} Health " +
161
+ "{cyan-fg}[l]{/} Logs " +
162
+ "{cyan-fg}[d]{/} Dependencies " +
163
+ "{cyan-fg}[q]{/} Quit",
164
+ style: {
165
+ border: {
166
+ fg: "cyan",
167
+ },
168
+ },
169
+ border: {
170
+ type: "line",
171
+ },
172
+ });
173
+ // State
174
+ let services = [];
175
+ let selectedService = null;
176
+ let refreshTimer = null;
177
+ // Update service list
178
+ async function updateServiceList() {
179
+ services = await getAllServices();
180
+ const headers = [
181
+ ["Name", "Status", "Port", "Uptime"],
182
+ ];
183
+ const rows = services.map((service) => {
184
+ const statusColor = service.status === "running" ? "{green-fg}" : service.status === "stopped" ? "{yellow-fg}" : "{red-fg}";
185
+ const statusText = service.status === "running" ? "●" : service.status === "stopped" ? "○" : "✗";
186
+ return [
187
+ (service.name || "unknown").substring(0, 20),
188
+ `${statusColor}${statusText}{/} ${service.status || "unknown"}`,
189
+ service.port?.toString() || "-",
190
+ service.uptime || "-",
191
+ ];
192
+ });
193
+ // If no services, show a placeholder row
194
+ if (rows.length === 0) {
195
+ rows.push(["{gray-fg}No services found{/}", "{gray-fg}Start Service Manager{/}", "-", "-"]);
196
+ }
197
+ serviceList.setData({
198
+ headers: headers[0],
199
+ data: rows,
200
+ });
201
+ screen.render();
202
+ }
203
+ // Update service details
204
+ async function updateServiceDetails(serviceName) {
205
+ const service = services.find((s) => s.name === serviceName);
206
+ if (!service)
207
+ return;
208
+ let content = `{bold}Name:{/bold} ${service.name}\n`;
209
+ content += `{bold}Status:{/bold} ${service.status}\n`;
210
+ content += `{bold}Description:{/bold} ${service.description}\n`;
211
+ if (service.port) {
212
+ content += `{bold}Port:{/bold} ${service.port}\n`;
213
+ }
214
+ if (service.pid) {
215
+ content += `{bold}PID:{/bold} ${service.pid}\n`;
216
+ }
217
+ if (service.uptime) {
218
+ content += `{bold}Uptime:{/bold} ${service.uptime}\n`;
219
+ }
220
+ if (service.health_url) {
221
+ content += `{bold}Health URL:{/bold} ${service.health_url}\n`;
222
+ // Check health
223
+ try {
224
+ const healthResult = await callService(serviceName, "health", {});
225
+ const healthStatus = healthResult.includes("passed")
226
+ ? "{green-fg}✓ Healthy{/}"
227
+ : "{red-fg}✗ Unhealthy{/}";
228
+ content += `{bold}Health:{/bold} ${healthStatus}\n`;
229
+ }
230
+ catch {
231
+ content += `{bold}Health:{/bold} {gray-fg}Unknown{/}\n`;
232
+ }
233
+ }
234
+ serviceDetails.setContent(content);
235
+ screen.render();
236
+ }
237
+ // Update dependencies
238
+ function updateDependencies(serviceName) {
239
+ const config = JSON.parse(fs.readFileSync(GLOBAL_SERVICES_FILE, "utf-8"));
240
+ const service = config.services[serviceName];
241
+ if (!service)
242
+ return;
243
+ let content = `{bold}${serviceName}{/bold}\n\n`;
244
+ if (service.depends_on && service.depends_on.length > 0) {
245
+ content += "{cyan-fg}Depends on:{/}\n";
246
+ service.depends_on.forEach((dep) => {
247
+ content += ` └─ ${dep}\n`;
248
+ });
249
+ }
250
+ else {
251
+ content += "{gray-fg}No dependencies{/}\n";
252
+ }
253
+ content += "\n";
254
+ // Find dependents
255
+ const dependents = Object.entries(config.services)
256
+ .filter(([_, svc]) => svc.depends_on?.includes(serviceName))
257
+ .map(([name]) => name);
258
+ if (dependents.length > 0) {
259
+ content += "{cyan-fg}Required by:{/}\n";
260
+ dependents.forEach((dep) => {
261
+ content += ` └─ ${dep}\n`;
262
+ });
263
+ }
264
+ else {
265
+ content += "{gray-fg}No dependents{/}\n";
266
+ }
267
+ depsBox.setContent(content);
268
+ screen.render();
269
+ }
270
+ // Handle service selection
271
+ serviceList.rows.on("select", async (item, index) => {
272
+ if (index < 0 || index >= services.length)
273
+ return;
274
+ selectedService = services[index].name;
275
+ await updateServiceDetails(selectedService);
276
+ updateDependencies(selectedService);
277
+ });
278
+ // Keyboard shortcuts
279
+ screen.key(["s"], async () => {
280
+ if (!selectedService)
281
+ return;
282
+ logsBox.log(`{cyan-fg}Starting ${selectedService}...{/}`);
283
+ const result = await callService(selectedService, "start", {});
284
+ logsBox.log(result);
285
+ await updateServiceList();
286
+ await updateServiceDetails(selectedService);
287
+ });
288
+ screen.key(["t"], async () => {
289
+ if (!selectedService)
290
+ return;
291
+ logsBox.log(`{cyan-fg}Stopping ${selectedService}...{/}`);
292
+ const result = await callService(selectedService, "stop", {});
293
+ logsBox.log(result);
294
+ await updateServiceList();
295
+ await updateServiceDetails(selectedService);
296
+ });
297
+ screen.key(["r"], async () => {
298
+ if (!selectedService)
299
+ return;
300
+ logsBox.log(`{cyan-fg}Restarting ${selectedService}...{/}`);
301
+ const result = await callService(selectedService, "restart", {});
302
+ logsBox.log(result);
303
+ await updateServiceList();
304
+ await updateServiceDetails(selectedService);
305
+ });
306
+ screen.key(["h"], async () => {
307
+ if (!selectedService)
308
+ return;
309
+ logsBox.log(`{cyan-fg}Checking health of ${selectedService}...{/}`);
310
+ const result = await callService(selectedService, "health", {});
311
+ logsBox.log(result);
312
+ });
313
+ screen.key(["l"], async () => {
314
+ if (!selectedService)
315
+ return;
316
+ logsBox.log(`{cyan-fg}Fetching logs for ${selectedService}...{/}`);
317
+ const result = await callService(selectedService, "logs", { lines: 20 });
318
+ logsBox.log(result);
319
+ });
320
+ screen.key(["d"], () => {
321
+ if (!selectedService)
322
+ return;
323
+ updateDependencies(selectedService);
324
+ });
325
+ screen.key(["q", "C-c"], () => {
326
+ if (refreshTimer) {
327
+ clearInterval(refreshTimer);
328
+ }
329
+ process.exit(0);
330
+ });
331
+ // Initial load
332
+ logsBox.log("{cyan-fg}JFL Service Dashboard Started{/}");
333
+ logsBox.log("{gray-fg}Press 'h' for help{/}");
334
+ await updateServiceList();
335
+ // Auto-refresh
336
+ refreshTimer = setInterval(async () => {
337
+ await updateServiceList();
338
+ if (selectedService) {
339
+ await updateServiceDetails(selectedService);
340
+ }
341
+ }, REFRESH_INTERVAL);
342
+ // Focus service list
343
+ serviceList.focus();
344
+ // Render
345
+ screen.render();
346
+ }
347
+ // ============================================================================
348
+ // Main
349
+ // ============================================================================
350
+ // ESM compatibility: Check if this module is being run directly
351
+ if (import.meta.url === `file://${process.argv[1]}`) {
352
+ startDashboard().catch((error) => {
353
+ console.error("Failed to start dashboard:", error);
354
+ process.exit(1);
355
+ });
356
+ }
357
+ //# sourceMappingURL=service-dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-dashboard.js","sourceRoot":"","sources":["../../src/ui/service-dashboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * JFL Services Manager TUI
4
+ *
5
+ * Interactive service management dashboard with live updates,
6
+ * logs, chat, and service controls
7
+ *
8
+ * @purpose Full-featured TUI for managing JFL services with real-time updates
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=services-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services-manager.d.ts","sourceRoot":"","sources":["../../src/ui/services-manager.tsx"],"names":[],"mappings":";AACA;;;;;;;GAOG"}